首頁  >  文章  >  web前端  >  Ajax操作表單非同步上傳文件

Ajax操作表單非同步上傳文件

php中世界最好的语言
php中世界最好的语言原創
2018-04-03 15:43:191351瀏覽

這次帶給大家Ajax操作表單異步上傳文件,Ajax操作表單異步上傳文件的注意事項有哪些,下面就是實戰案例,一起來看一下。

1.起因

做前台頁面時,需要呼叫WebAPI的Post請求,發送一些欄位和文件(相當於把表單透過ajax非同步送出去,得到回傳結果),然後得到回傳值判斷是否成功。

2.試試

先是試了一下"jQuery Form Plugin" ,這玩意就是的巨大的坑,實現他和jquery1. 9.2相容性就不是太好,好不容易把$.browser的問題解決了,發現用他上傳檔案就得不到回傳值。

$("#view").submit(
$("#view").ajaxSubmit({
type: "post",
url: "../api/Article/Add",
dataType: "json",
success: function (msg) {
console.log(msg);
},
error: function (msg) {
$("#resultBox").html("连接服务器失败");
console.log(msg);
}
})
);

例如上面的程式碼,不過怎麼配置,只要上傳了文件,success裡面回傳的msg一定是null(chromium瀏覽器下),但實際是有回傳值的,而且沒有檔案時也是正常的。更可怕的是IE/EDGE下提示下載那個Json回傳值。

翻了一下jquery.form.js的原始碼,發現他是用Iframe實現的偽Ajax,不清楚真,Pass!

// are there files to upload?
var files = $('input:file', this).fieldValue();
var found = false;
for (var j=0; j < files.length; j++)
if (files[j]) 
found = true;
if (options.iframe || found) // options.iframe allows user to force iframe mode
fileUpload();
else
$.ajax(options);

這是有無檔案時,分別呼叫2個不同的函數。

3.解決方案

經過多重反調查,發現xhr(XMLHttpRequest)是個好東西。經過測試主流瀏覽器和手機瀏覽器都支援這個東西。以下介紹在jquery/zepto的ajax 取得原生XMLHttpRequest 物件上傳表單(檔案)的方法。 參考文章:http://www.jb51.net/article/91267.htm

function AjaxForm(formID, options) {
var form = $(formID);
//将form对象直接作为参数 new FormData对象
var formData = new FormData(form[0]);
$("input[type='file']").forEach(function (item, i) {
//获取file对象 即相当于可以直接post的$_FILES数据
var domFile = $(item)[0].files[0];
//追加file 对象
formData.append('file', domFile);
})
if (!options)options = {};
options.url = options.url ? options.url : form.attr("action");
options.type = options.type ? options.type : form.attr("method");
options.data = formData;
options.processData = false; // tell jQuery not to process the data
options.contentType = false; // tell jQuery not to set contentType
options.xhr = options.xhr ? options.xhr : function () {
//这是关键 获取原生的xhr对象 做以前做的所有事情
var xhr = $.ajaxSettings.xhr();
xhr.upload.onload = function () {
console.log("onload");
}
xhr.upload.onprogress = function (ev) {
if (ev.lengthComputable) {
var percent = 100 * ev.loaded / ev.total;
console.log(percent, ev)
}
}
return xhr;
};
options.success = options.success ? options.success : function (data) {
alert(data)
};
$.ajax(options);
}
//调用
$("#sub").click(function (e) {
AjaxForm("#myForm");
});

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

Ajax+mysq實作省市區三級連動列表

Ajax傳輸Json和xml數據步奏詳解(附代碼)

以上是Ajax操作表單非同步上傳文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn