В настоящее время я хочу реализовать загрузку изображения, не используя плагинов.
Моя форма загрузки похожа на это
<form action="/Member/UploadPicture" enctype="multipart/form-data" id="uploadform" method="post">
<span>
<div class="upload" id="imgUpl">
<h3>Upload profile picture</h3>
<div class="clear5"></div>
<input type="file" name="file" id="file" />
<button class="btn-bl" id="upComplete"><span>Upload</span></button>
</div>
</span>
</form>
И мой код jQuery:
$('#upComplete').click(function () {
$('#up').hide();
$('#upRes').show();
var form = $("#uploadform");
$.ajax({
type: "POST",
url: "/Member/UploadPicture",
data: form.serialize(),
success: function (data) {
alert(data);
}
});
$.fancybox.close();
return false;
});
Если я открываю поджигателя, я вижу, что ajax () метод делает простое сообщение формы (не многослойный), и содержание POST пусто
Действительно ли возможно сделать загрузку файлов с помощью jQuery ajax () метод, или я должен сделать это каким-либо другим способом?
Большое спасибо
jQuery ajax не поддерживает загрузку файлов, и реализация этого вручную может быть обременительной. Я бы посоветовал вам взглянуть на плагин jQuery form .
Конечно, вы всегда можете проверить исходный код плагина, чтобы увидеть, как он реализован, если вы не хотите его включать (он использует скрытый iFrame, поскольку файлы не могут быть загружены с помощью AJAX), но зачем это делать, если вы можете использовать его напрямую: -)
Вот пример того, как может выглядеть ваш код:
$(function() {
$('#uploadform').ajaxForm();
});
также сделайте кнопку загрузки кнопкой отправки:
<button class="btn-bl" id="upComplete" type="submit">
<span>Upload</span>
</button>
AJAX
или, точнее, XMLHttpRequest
пока не поддерживает загрузку файлов. Есть обходные пути, такие как загрузка через
, но это довольно громоздко. Лучше потратить время на создание приложений, чем на изобретение этих решений заново.
Но если вам интересно, как это работает внутри, не стесняйтесь проверить исходный код некоторых плагинов, которые предлагают эту функциональность. Очень простое объяснение можно найти по этой ссылке - http://www.openjs.com/articles/ajax/ajax_file_upload/
По сути, вы меняете форму target
для отправки внутри
, что позволяет избежать обновления страницы и имитировать AJAX, чего на самом деле нет, но кого это волнует - конечный пользователь не может сказать.
Минимальный пример загрузки на основе iframe может выглядеть следующим образом:
$("#upComplete").click(function() {
// create a dynamic iframe, or use existing one
var iframe = $("<iframe id='f' name='f' src=''>");
// attach a load event to handle response/ know about completion
iframe.load(function() { alert('complete'); });
iframe.appendTo('body');
// change form's target to the iframe (this is what simulates ajax)
$('#uploadForm').attr('target', 'f');
$('#uploadForm').submit();
});
Обратите внимание, что это не выполняет никакой обработки ответа, а просто отправляет изображение на сервер. Чтобы обработать ответ, необходимо написать обратный вызов для события iframe load
.
Хотя вы можете самостоятельно создать тело запроса multipart/form-data
для включения поля загрузки файла, это не поможет вам, потому что вы не можете прочитать клиентские файлы из поля загрузки файла.
(За исключением использования интерфейса FileList, но в настоящее время это поддерживает только Firefox.)