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

greatilya 26.01.2012 19:23

Download файлов
 
[это можно не читать]
Сейчас в меня полетят камни мол как можно задавать такие тривиальные вопросы ... но видимо без пинка в нужном направлении разобраться не смогу.

Задача простая, есть ОООООчень много небольших файлов на серверах, поскольку это облачное хранилище то доступ к ним логичнее осуществлять через банальный http. Мне нужно написать скрипт для их скачивания(для бекапа).
[/это можно не читать]

Итого имеется куча http адресов файлов, их нужно скачать. Проблема заключается в том, что я не представляю как опеределить что файл закачан полностью? Чтобы отрубания сервера, или проблемы с интернетом и т.п. не влияли на файлы, и недокаченные файлы качались заново. А, ну да, пишется это всё на PHP.

Заранее спасибо.

melky 26.01.2012 20:24

обычно целостность определяют по контрольной сумме (md5) файла.

проблема только в том, чтобы высчитать md5 для файла в источнике.

greatilya 26.01.2012 21:29

Цитата:

Сообщение от melky
проблема только в том, чтобы высчитать md5 для файла в источнике

вот и я думаю как это сделать... ведь если мы просто считаем этот файл, то нет гарантии что нам файл выдался до конца, и не произошло обрывов связи. Хотя если подумать то наверное что-то вроде этого должно стабильно работать:
function safe_copy($source_file, $destination_file) {
	if(!$sMD5_step1=@md5_file($source_file)) return false;
	if(!@copy($source_file, $destination_file)) return false;
	if(!$sMD5_step2=@md5_file($destination_file)) return false;
	if($sMD5_step1!==$sMD5_step2) return false;
	return true;
}

Как я понимаю, тут получилась двойная проверка, т.к. по сути здесь 2 запроса на сервер: md5_file($source_file) и copy($source_file, $destination_file). А при проблемах со связью он не может дважды выдать файл одинаково неполный.

melky 26.01.2012 22:02

хм.. на сервере нельзя это высчитывать? это бы помогло избежать этой трудности.

greatilya 26.01.2012 22:20

Цитата:

Сообщение от melky
на сервере нельзя это высчитывать? это бы помогло избежать этой трудности.

нет, там конечно можно получать доступ через API, там и должны быть md5 хеши, но при работе через API время работы скрипта значительно увеличивается, причем трафик тоже значительно больше потребляется.
Иными словами не подходит для моей конкретной задачи, поэтому ограничиваюсь http запросами.

melky 26.01.2012 22:25

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

greatilya 26.01.2012 22:40

melky,
видимо я Вас не до конца понимаю. Разве функция которую я написал выше не дает достаточную уверенность что файл скачан верно? Ну и тогда файл получается мы скачиваем 2 раза по http, и 1 раз локально проверяя md5. Или я что-то упустил?

melky 26.01.2012 22:58

да нет, всё верно. а если результаты отличаются (1 и 2), то как вы опознаете, какой файл скачен верно? придётся скачивать ещё раз.

greatilya 26.01.2012 23:10

Цитата:

Сообщение от melky
да нет, всё верно. а если результаты отличаются (1 и 2), то как вы опознаете, какой файл скачен верно? придётся скачивать ещё раз.

а тут на мой взгляд уже не важно. Если функция вернула FALSE, значит файл скачать не удалось, и нужно попробовать скачать заново но позже. Поскольку данная ситуация будет возникать крайне редко, то тут можно обычную обработку с очередью заданий на скачивание. Иными словами это уже "дело техники", реализаций придумать можно много.
Спасибо!

B@rmaley.e><e 26.01.2012 23:48

При ответе на запрос веб-сервер обычно отправляет в ответе заголовок Content-Length. Вот и сверяйте размер файла с ним.


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