Логика загрузки файлов на сервер: PHP, JavaScript и AJAX
Веб-ресурс - это «точка» в информационном пространстве всемирной сети. Информация, отображаемая на нем, обычно представлена статически, и посетитель ее просматривает. Можно указать ссылку на документ или иной ресурс и посетитель загрузит себе файл с информацией или перейдет по ссылке.
Для передачи информации на сервер или ее получения с него используются простые инструменты. Но их разумное применение и удобная логика использования не так просты, когда требуется организовать безопасную, стабильную и надежную обработку данных.
Загрузка файла
Сложилось простое представление: есть upload и download. Первое - отправить файл на сервер, второе - получить его. Для реализации первой задачи информацию можно просто вывести в браузер, в окошко на странице или предоставить ссылку на информационный ресурс. Для реализации второй задачи достаточно написать форму загрузки файла и код ее обработки на сервере.
В данном примере (1) - два варианта ссылки (без применения PHP) загрузки файлов с сервера, (2) - форма для передачи файлов на сервер. Здесь применение PHP принципиально. Используется более прогрессивная логика загрузки, чем обычно.
В общем случае достаточно написать в коде страницы приведенную форму и предусмотреть обработку массива $_FILES.
Проверка имени файла (функция scCheckFileName) не является обязательным условием, но для безопасности и надежности - это целесообразно делать. Определить правила для любого загружаемого файла - залог надежной работы веб-ресурса и уважительного отношения к нему со стороны посетителя.
Логика загрузки на сервер
Хостинг хостингу рознь, но использовать русские буквы и некоторые символы в именах файлов - чревато опасностью. Он может «записать» файл, но затем «не сможет» его прочитать или удалить. Чтобы избежать неопределенностей, лучше сразу файл переименовать и сохранить под таким именем, к которому адекватно отнесется любой хостинг.
В таком контексте загрузка файлов на сервер: PHP + MySQL. При помощи языка выполняется загрузка файла. Посредством базы данных устанавливается ассоциация между реальным именем файла и уникальным, которое формируется автоматически. Самое простое решение, как получить по реальному имени файла его MD5 код - это уникальная последовательность из 32 байт. Выполняя загрузку файлов на сервер, PHP «включается» на сервере через AJAX.
Здесь функция scfCheckFile() кодирует реальное имя файла, формирует по нему уникальный MD5 код и запускает механизм передачи данных через AJAX. В этот момент сервер не делает загрузку файла, а проверяет только его наличие по уникальному коду. Если такого файла не обнаружено, формируется новое имя файла, а в строку таблицы помещается запись о начале загрузки.
Функция scfGetFile() подтверждает факт загрузки файла и обеспечивает обновление записи о нем.
В результате: файл загружен, запись в таблице сформирована. Загрузка файлов на сервер на PHP & AJAX при помощи JavaScript - хорошее и надежное решение.
Механизм AJAX для загрузки файлов
Запуск передачи данных по AJAX инициируется функцией InitXML(). Выполнить загрузку файлов на сервер на PHP, JavaScript и AJAX предлагаемым кодом - безопасно и надежно.
Получение ответа от сервера исполняется функцией WaitReplySC(). Справа внизу приведены коды для двух ситуаций: проверка наличия файла перед загрузкой и собственно процедура загрузки.
Варианты кодирования могут быть иными, существенным является то, что кнопка загрузки файла не активна до того момента, как он не будет выбран и проверен сервером.
Серверный код на PHP
Сервер должен проверить возможность загрузки файла. Препятствия для загрузки определяются решаемой задачей, но всегда важно не затереть информацию, то есть предусмотреть и заблокировать загрузку файлов на сервер на PHP повторно.
Для решения данной задачи проще всего завести таблицу в базе данных MySQL и отмечать там одной строчкой загрузку каждого файла. Здесь можно хранить реальное имя файла, его расширение, дату загрузки, вести учет операций над ним и пр.
Это код проверки наличия файла по его уникальному имени. Функция объекта базы данных $oBase NewViuq() определяет уникальное имя для загружаемого элемента и ставит его в соответствие реальному имени файла.
Если проверка имени была удачной, посетитель нажимает на кнопку загрузки и механизм AJAX инициирует загрузку файлов на сервер. PHP код корректирует запись в таблице MySQL и получается следующий результат:
В файловой системе появился еще один элемент, а строка таблицы этого файла получила окончательное содержание. Поле статуса (f_status) содержит символ "N", то есть операций над загруженным файлом еще не было.
Логика обмена данными
Повсеместное распространение файлов *docx, *.xlsx, *.pdf и архивов привели к формированию не совсем корректной концепции: HTML & PHP загрузка файлов с сервера - это ссылка на них. При этом вовсе не обязательно, что посетитель скачивает элемент. Часто программист просто открывает файл в браузере для просмотра.
Многие задачи сопряжены с изменением информации в таких файлах. Сотрудник компании, администрирующий сайт, проверяет комплект актуальных файлов, скачивает их, изменяет и отправляет обратно на сервер. Такая логика обуславливает существенный трафик, загружает каналы связи и делает трудоемкими как сопровождение веб-ресурса, так и работу с ним.
Разумеется, невозможно изменить сложившуюся систему информационных отношений в той или иной компании. Если приоритет предоставлен файловой организации, то следует ее оптимизировать. Если есть возможность трансформировать файлы в данные и работать с ними непосредственно, то идеальным будет вариант: загрузка, преобразование их в активную форму, которая допускает изменение контента по его элементам. Когда необходимо загрузить файл с сервера, он преобразуется в текущем актуализированном состоянии и направляется потребителю.