Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Download файлов (https://javascript.ru/forum/server/25139-download-fajjlov.html)

greatilya 27.01.2012 09:46

B@rmaley.e><e,
Примерно так?
function safe_copy($source_file, $destination_file) {
	if(!$aHeaders=@get_headers($source_file, 1)) return false;
	if(!$iSize1=$aHeaders['Content-Length']) return false;
	if(!@copy($source_file, $destination_file)) return false;
	if(!$iSize2=@filesize($destination_file)) return false;
	if($iSize1!=$iSize2) return false;
	return true;
}

B@rmaley.e><e 27.01.2012 10:13

Да.

devote 27.01.2012 20:29

function curl_download( $url, $file ) {
    // открываем файл, на сервере, на запись
    $dest_file = @fopen( $file, "w" );
   
    // открываем cURL-сессию
    $resource = curl_init();

    // устанавливаем опцию удаленного файла
    curl_setopt( $resource, CURLOPT_URL, $url );
    
    // устанавливаем место на сервере, куда будет скопирован удаленной файл
    curl_setopt( $resource, CURLOPT_FILE, $dest_file );
    
    // заголовки нам не нужны
    curl_setopt( $resource, CURLOPT_HEADER, 0 );
    
    // выполняем операцию
    curl_exec( $resource );

    $error = curl_errno( $resource );
    
    // закрываем cURL-сессию
    curl_close( $resource );
    
    // закрываем файл
    fclose( $dest_file );

    return $error;
}

melky 27.01.2012 23:01

devote, разве CURL сможет понять, когда связь оборвалась, а когда файл скачан верно \ неверно ?

devote 27.01.2012 23:09

Цитата:

Сообщение от melky (Сообщение 153485)
devote, разве CURL сможет понять, когда связь оборвалась, а когда файл скачан верно \ неверно ?

Ну если будет использоваться Content-Length то-есть если сервер пришлет длину контента, и курл получит меньше чем положено, то вернет ошибку. Если же сервер будет возвращать контент в виде кусков (chunks) то ошибка может возникнуть в том случае если кусок не удовлетворяет своей длине. Обычно такие ошибки CURL нормально воспринимает. Но если сервер отдаст вместо файла что-то другое, например HTML страницу, то CURL ничего не скажет. Тут нужно проверять заголовки, а точнее в идеале лучше и то и другое делать.

melky 27.01.2012 23:12

Цитата:

Сообщение от devote (Сообщение 153491)
Ну если будет использоваться Content-Length то-есть если сервер пришлет длину контента, и курл получит меньше чем положено, то вернет ошибку. Если же сервер будет возвращать контент в виде кусков (chunks) то ошибка может возникнуть в том случае если кусок не удовлетворяет своей длине. Обычно такие ошибки CURL нормально воспринимает. Но если сервер отдаст вместо файла что-то другое, например HTML страницу, то CURL ничего не скажет. Тут нужно проверять заголовки, а точнее в идеале лучше и то и другое делать.

вот этой мелочи я не знал. мало изучал php.

x-yuri 28.01.2012 18:05

да и функции типа md5_file и copy должны возвращать ошибки. Вообще непонятно, откуда взялись идеи о том, что файл может неправильно скачаться. TCP стал ненадежным протоколом?

Цитата:

Сообщение от greatilya
поскольку это облачное хранилище то доступ к ним логичнее осуществлять через банальный http

1) почему? 2) разве это не обязанность облачных хранилищ, брать на себя заботу о надежном хранении данных?

greatilya 02.02.2012 19:47

Цитата:

Сообщение от x-yuri
TCP стал ненадежным протоколом?

Нет, интерент по "телефонной лапше" не начинал быть надежным :)
Цитата:

Сообщение от x-yuri
1) почему?

Потому что если скачивать файлы посредством API предварительно пройдя авторизацию, конечно можно быть уверенным в правильности копирования файла, но этот способ не является для меня приемлемым, так как:
1. при этом на авторизацию и прочие "движняки" потребляется куда больше трафика - следовательно затрачивается значительно времени.
2. для авторизаций и прочих "движняков" требуется затрачивается также исходящая скорость(в смысле в большем объеме чем при загрузке по http). Это я проверял, потребление исходящего трафика там достаточно большое(это некая особенность API). А у меня входящий трафик 8Мбит, исходящая 0,5Мбит. Следовательно все варианты с затратой исходящего трафика мне не подходят.
Если помножить 1 и 2 пункты на миллины мелких файлов, то получается что каждая сотая секунды "на счету". Пока удалось добиться загрузки со скоростью порядка 1 секунды на файл, позже подумаю как увеличить скорость за счет многопоточного Curl.
Цитата:

Сообщение от x-yuri
2) разве это не обязанность облачных хранилищ, брать на себя заботу о надежном хранении данных?

в надежности я не сомневался(тем более что данные там хранятся в нескольких копиях), но иметь у себя резервную копию данных, на мой взгляд, нужно всегда.

x-yuri 03.02.2012 02:42

Цитата:

Сообщение от greatilya
Нет, интерент по "телефонной лапше" не начинал быть надежным

TCP гарантирует целостность передаваемых данных. Это значит, что либо информация корректно передалась, либо не передалась. Других вариантов нету.

greatilya 03.02.2012 15:02

Цитата:

Сообщение от x-yuri
TCP гарантирует целостность передаваемых данных

Правильно ли я понял? Если даже используем функцию copy, и если в процессе копирования интернет либо сервер с файлом отрубится, то функция вернет false?


Часовой пояс GMT +3, время: 22:56.