今回はAjaxとform+iframeでファイルアップロードを実装する方法をお届けします(画像と文章で詳しく解説) Ajaxとform+iframeでファイルアップロードを実装する際の注意点は何ですか?ケースを見てみましょう。
html5の導入以来、ファイルのアップロードが非常に簡単になりました。プロジェクトで使用する必要があるファイルアップロード機能を解決するのに非常に便利です。 HTML5 は、複数の画像のアップロード、Ajax アップロード、アップロード前の画像のプレビュー、およびドラッグ アンド ドロップによる画像のアップロードをサポートしており、JS コードはほとんどありません。
HTML5Ajaxアップロード
html5アップロードの実装には、ファイル制御とXMLHttpRequestリクエストが必要です。以下は私がパッケージ化したアップロード プラグインです:
function fileUpload(options) { var opts = options || {}; var func = function() {}; this.fileInput = opts.fileInput || null; this.url = opts.url || ''; this.fileList = []; this.onFilter = opts.onFilter || function(f) {return f;}; //选择文件组的过滤方法 this.onSelect = opts.onSelect || func; //文件选择后 this.onProgress = opts.onProgress || func; //文件上传进度 this.onSuccess = opts.onSuccess || func; //文件上传成功时 this.onFailure = opts.onFailure || func; //文件上传失败时; this.onComplete = opts.onComplete || func; //文件全部上传完毕时 this.init(); } fileUpload.prototype = { dealFiles: function(e) { //获取要上传的文件数组(用户选择文件后执行) var files = e.target.files || e.dataTransfer.files; this.fileList = this.onFilter(files); for(var i = 0, file; file = this.fileList[i]; i++){ //增加唯一索引值 file.index = i; } this.onSelect(this.fileList); return this; }, removeFile: function(fileDelete) { //删除某一个文件 var arrFile = []; for(var i = 0, file; file = this.fileList[i]; i++){ if (file != fileDelete) { arrFile.push(file); } } this.fileList = arrFile; return this; }, removeAll: function() { //清空文件队列 this.fileList = []; return this; }, uploadFile: function() { //上传文件 var me = this; for(var i = 0, file; file = this.fileList[i]; i++){ (function(file) { var formData = new FormData(); var xhr = new XMLHttpRequest(); if (xhr.upload) { xhr.upload.addEventListener("progress", function(e) { // 上传中 me.onProgress(file, e.loaded, e.total); }, false); xhr.onreadystatechange = function(e) { // 文件上传成功或是失败 if (xhr.readyState == 4) { if (xhr.status == 200) { me.onSuccess(file, xhr.responseText); me.removeFile(file); if (!me.fileList.length) { me.onComplete(); //上传全部完毕。执行回调 } } else { me.onFailure(file, xhr.responseText); } } }; // 开始上传 formData.append('file', file); xhr.open("POST", me.url, true); xhr.send(formData); } })(file); } }, init: function() { var me = this; //文件选择控件选择 if (me.fileInput) { me.fileInput.addEventListener("change", function(e) { me.dealFiles(e); }, false); } } };
コード内に formData が含まれていることもお分かりかと思います。これが html5 の魔法です。 formData の助けを借りて、更新せずに非同期の複数ファイルのアップロード機能を簡単に実装でき、プレビュー画像をサポートします。さらに、多くのブラウザが HTML5 をサポートしていることは喜ばしいことです。
でも! ! ! ie9 より前のバージョンはサポートされていません。 !
さらに、上記の方法には、ajax アップロード方法を使用するため、クロスドメイン アップロードをサポートできないという欠点もあります。これらの 2 つのビジネス シナリオを満たす必要がある場合は、フォームと次の方法を試してください。 iframe を使用してアップロードを実現します。詳しく見てみましょう:
iframe へのフォーム送信
html コード:
<iframe name="demoIframe" style="display:none"></iframe> <form target="demoIframe" action="upload.php" method="post" enctype="multipart/form-data"> <input class="filename" type="file" name="fileLabel"> <input type="submit" value="提交"> </form>
[送信] をクリックすると、次のリクエストが表示されます:
ファイルがアップロードされました。次に、この Upload.php インターフェイスを追加すると、アップロードが成功すると次のメッセージが返されます:
{ "code": "200", "success": true, "data": { ... } }
次のステップを実行するための戻り値を取得するにはどうすればよいですか? iframe にアップロードしたので、戻り値がある場合は、iframe のロード イベントをリッスンするだけで、その後の処理のためにそれを取得できます。 js コードを見てください:
$('iframe').on('load', function() { var responseText = $('iframe')[0].contentDocument.body.textContent; var responseData = JSON.parse(responseText) || {}; if (responseData.isSuccess == true || responseData.code == 200) { //success } else { //error } });
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
どのように beforeSend がユーザー エクスペリエンスを向上させるか
SpringMVC 環境での JSON の Ajax 非同期リクエスト メソッド
以上がAjaxとform+iframeでファイルアップロードを実装する方法(画像と文章で詳しく解説)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。