Ajax操作フォームはファイルを非同期にアップロードします

php中世界最好的语言
リリース: 2018-04-03 15:43:19
オリジナル
1401 人が閲覧しました

今回は、ファイルを非同期にアップロードするための Ajax 操作フォームについて説明します。 Ajax 操作フォームでファイルを非同期にアップロードするための 注意事項 は何ですか? 以下は実際的なケースです。

1. 原因

フロントエンドページを作成するとき、WebAPIの

Postリクエストを呼び出し、いくつかのフィールドとファイルを送信する必要があります(ajaxを介して非同期でフォームを送信し、戻り結果を取得するのと同等) ) を実行し、戻り値を取得して成功を判断します。

2. まずは「jQuery Form Plugin」を試してみました。これは、jquery1.9.2 との互換性を実現するのにあまり良くありませんでした。 、それを使用してファイルをアップロードすると戻り値が得られないことがわかりました。

$("#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);
}
})
);
ログイン後にコピー
たとえば、上記のコードですが、その設定方法は、ファイルがアップロードされている限り、成功時に返されるメッセージはnullでなければなりません(Chromeブラウザでは)が、実際には戻り値があり、それはファイルがない場合は通常です。さらに恐ろしいのは、IE/EDGE でダウンロードを求められたときの Json の戻り値です。 jquery.form.js のソース コードを調べたところ、Iframe を使用して擬似 Ajax が実装されていることがわかりました。これは明確ではありません。

// 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で都道府県・市区町村の3段階連携リストを実現

JsonとXMLデータのAjax送信手順を詳しく解説(コード付き)

以上がAjax操作フォームはファイルを非同期にアップロードしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート