2011-03-29 2 views
1

Я делаю реальный простой «бэкэнд» (PHP5) для двух флеш-приложений. Один из них загрузит фотографию, бэкэнд сохранит ее в папке, а второе приложение опросит бэкэнд для новых фотографий и покажет их.Только захватить файлы

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

Все это работает как шарм. Тем не менее, я бы очень хотел убедиться, что бэкэнд возвращает только фотографии, которые полностью загружены, что предотвращает попытку второго приложения загрузить незавершенное изображение. Существуют ли какие-либо методы/трюки, которые я могу использовать для проверки файла?

+0

Один из способов гарантировать, что файл полностью написан, - опросить его с помощью 'flock (.., LOCK_EX | LOCK_NB)' - когда процесс загрузки следует этой практике. – mario

ответ

0

Вы можете проверить размер файла пару сотен миллисекунд друг от друга и посмотреть, если он изменяет:

$first = filesize($file); 
// wait 100ms 
usleep(100000); 
$second = filesize($file); 

if($first == $second) { 
    // file is no longer being actively uploaded 
} 
0

очень простой и распространенный способ сделать это было бы создать файл запуска на основе имени файлов, так что вы получите что-то вроде

123.jpg 
123.rdy 

или

123.jpg 
123.jpg.rdy 

вы создать этот файл (только пустой заглушка), как только загрузка будет завершена. Приложение, которое захватывает файлы для загрузки, заботится только о файлах с триггерным файлом, а затем обрабатывает их. В качестве альтернативы вы также можете сохранить загруженный файл как ie. 123.bsy или 123.jpg.bsy, пока он еще загружен, а затем переименуйте его в финал имени 123.jpg после завершения загрузки. Поскольку переименования в том же каталоге обычно являются действительно дешевыми операциями с точки зрения времени обработки, вероятность запуска в условиях гонки должна быть довольно низкой. (Это могло бы или могло бы теперь зависеть от используемой ОС, хотя ...)

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

0

Обычным трюком для операций с атомной файловой системой является запись во временный файл, который не соответствует считывателю (например, XXX.jpg.tmp), и как только он полностью загружен, переименуйте его в целевое имя. Переименование на том же томе является атомарным, поэтому нет смысла, чтобы файл был либо незавершенным, либо недоступным.

0

После того как я написал все это, я сам это понял. То, что я сделал, это добавить точное количество байтов в имени файла, а также проверить, что при выводе списка изображений. Хорошее решение .tmp/.bsy приятно, но я немного почитал его до конца :) Поверхность моего решения заключается в том, что после завершения загрузки больше не требуется переименования. Спасибо всем за ваши быстрые ответы!

Смежные вопросы