jQuery Upload Progress и AJAX file upload
похоже, что я не ясно передал свою проблему. Мне нужно отправить файл (с помощью AJAX) , и мне нужно получить ход загрузки файла с помощью Nginx HttpUploadProgressModule. Мне нужно хорошее решение этой проблемы. Я пробовал с jquery.плагин uploadprogress, но мне приходится переписывать большую его часть, чтобы заставить его работать во всех браузерах и отправлять файл с помощью AJAX.
Мне нужен код для этого и он должен работать во всех основных браузерах (Chrome, Safari, FireFox и IE). Было бы еще лучше, если бы я мог получить решение, которое будет обрабатывать несколько загрузок файлов.
я использую jquery.плагин uploadprogress чтобы получить ход загрузки файла из NginxHttpUploadProgressModule. Это внутри iframe для приложения facebook. Он работает в firefox, но он не работает в chrome/safari.
когда я открываю консоль я вам этот.
Uncaught ReferenceError: progressFrame is not defined
jquery.uploadprogress.js:80
есть идеи, как я мог бы это исправить?
Я хотел бы также отправить файл с помощью AJAX, когда он будет завершен. Как бы я это реализовал?
EDIT:
Мне это нужно в ближайшее время, и это важно, поэтому я собираюсь поставить 100 баллов за этот вопрос. Первый человек, который ответит на него, получит 100 баллов.
EDIT 2:
Jake33 помог мне решить первую проблему. Первым человеком, чтобы оставить ответ с тем, как отправить файл с ajax тоже получит 100 баллов.
2 ответов:
загрузка файлов на самом деле возможно с AJAX в эти дни. Да, AJAX, а не какие-то дерьмовые подражатели AJAX, такие как swf или java.
этот пример может помочь вам:https://webblocks.nl/tests/ajax/file-drag-drop.html
(он также включает в себя интерфейс перетаскивания/падения, но это легко игнорировать.)
в основном это сводится к следующему:
<input id="files" type="file" /> <script> document.getElementById('files').addEventListener('change', function(e) { var file = this.files[0]; var xhr = new XMLHttpRequest(); (xhr.upload || xhr).addEventListener('progress', function(e) { var done = e.position || e.loaded var total = e.totalSize || e.total; console.log('xhr progress: ' + Math.round(done/total*100) + '%'); }); xhr.addEventListener('load', function(e) { console.log('xhr upload complete', e, this.responseText); }); xhr.open('post', '/URL-HERE', true); xhr.send(file); }); </script>(демо: http://jsfiddle.net/rudiedirkx/jzxmro8r/)
так что в основном это сводится к это =)
xhr.send(file);здесь
fileis typeofBlob: http://www.w3.org/TR/FileAPI/другой (лучший ИМО) способ-использовать
FormData. Это позволяет 1) имя файла, как в форме и 2) отправить другие вещи (файлы тоже), как в форме.var fd = new FormData; fd.append('photo1', file); fd.append('photo2', file2); fd.append('other_data', 'foo bar'); xhr.send(fd);
FormDataделает код сервера более чистым и обратно совместимым (поскольку запрос теперь имеет тот же формат, что и обычные формы).все это не экспериментально, но очень современно. Chrome 8+ и Firefox 4 + знают, что делать, но я не знаю ни о каких других.
вот как я обработал запрос (1 Изображение на запрос) в PHP:
if ( isset($_FILES['file']) ) { $filename = basename($_FILES['file']['name']); $error = true; // Only upload if on my home win dev machine if ( isset($_SERVER['WINDIR']) ) { $path = 'uploads/'.$filename; $error = !move_uploaded_file($_FILES['file']['tmp_name'], $path); } $rsp = array( 'error' => $error, // Used in JS 'filename' => $filename, 'filepath' => '/tests/uploads/' . $filename, // Web accessible ); echo json_encode($rsp); exit; }
вот несколько вариантов использования AJAX для загрузки файлов:
AjaxFileUpload - требуется элемент формы на странице, но загружает файл без перезагрузки страницы. Смотрите демо.
Uploadify - Флэш - метод загрузки файлов.
десять примеров загрузки файлов AJAX - это было опубликовано в этом году.
обновление: вот плагин JQuery для Загрузка Нескольких Файлов.
Comments