В частях 1, 2, 3 мы научились читать файлы с диска.Теперь попробуем разобрать процесс отправки файлов на сервер с помощью технологии ajax.
В начале вспомним как работать с аяксом для передачи файла на сервер:
- Метод передачи будет POST
- Обязательно нужно будет указать Content-Type, а именно multipart/form-data
- Правильно сформировать само тело сообщения
Получим следующий код(по пунктам):
var request = new XMLHttpRequest(); request.onreadystatechange = ajaxReady; request.open('POST', 'uploader.php', true); // (1) request.setRequestHeader('Content-Type', contentType); // (2) request.sendAsBinary(createTestMsg()); // (3)
ajaxReady – это просто callback-функция, которая вызовется при ajax-ответе. Для нее пока установим простую заглушку:
function ajaxReady() { if (request.readyState == 4 && request.status == 200) { alert(request.responseText); } }
uploader.php – тоже пока файл-заглушка на стороне сервера, следующего содержания:
<?php var_dump($_POST); var_dump($_FILES);
Теперь перейдем к более важным моментам. contentType определяем следующим образом:
var boundary = "AJAX-----------------------" + (new Date).getTime(); var contentType = "multipart/form-data; boundary=" + boundary;
boundary – это случайная последовательность байт, которые не должны встречаться в самом файле. Вы можете придумать свой алгоритм для генерации данной последовательности, т.к. это лишь пример.
Ну и самое основное – формирование сообщения:
function createTestMsg(){ var fieldName = 'testfile'; var fileName = '4.jpg'; var CRLF = "\r\n"; var msg = "--" + boundary + CRLF; msg += 'Content-Disposition: form-data; '; msg += 'name="' + fieldName + '"; '; msg += 'filename="'+ fileName + '"' + CRLF; msg += 'Content-Type: application/octet-stream'; msg += CRLF + CRLF; // marks end of the headers part msg += Array(9999).join(7) + CRLF; msg += "--" + boundary + "--" + CRLF; return msg; }
Array(9999).join(7) – это такой вариант генерации фэйкового контента для файла.
Вот тут можно посмотреть весь код: http://learn.javascript.ru/play/E1MhM, но в песочнице он работать не будет, т.к. нет файла uploader.php на строне сервера, так что в любом случае нужно копировать локально и смотреть.