如何使用 jQuery 异步上传文件?
問:
我想用 jQuery 異步上傳文件。
$(document).ready(function () { $(“#uploadbutton”).click(function () { var filename = $(“#file”).val(); $.ajax({ type: “POST” , url: “addFile.do”, enctype: ‘multipart/form-data’, data: { file: filename }, success: function () { alert("Data Uploaded: "); } }); }); } ); 文件
我只獲取文件名,而不是上傳文件。我能做些什么來解決這個問題?
答1:
huntsbot.com匯聚了國內外優秀的初創產品創意,可按收入、分類等篩選,希望這些產品與實踐經驗能給您帶來靈感。
使用 HTML5,您可以使用 Ajax 和 jQuery 進行文件上傳。不僅如此,您還可以進行文件驗證(名稱、大小和 MIME 類型)或使用 HTML5 進度標記(或 div)處理進度事件。最近我不得不制作一個文件上傳器,但我不想使用 Flash 也不想使用 iframe 或插件,經過一番研究,我想出了解決方案。
的HTML:
首先,您可以根據需要進行一些驗證。例如,在文件的 .on(‘change’) 事件中:
$(':file').on('change', function () {var file = this.files[0];if (file.size > 1024) {alert('max upload size is 1k');}// Also see .name, .type });現在點擊按鈕提交 $.ajax():
$(':button').on('click', function () {$.ajax({// Your server script to process the uploadurl: 'upload.php',type: 'POST',// Form datadata: new FormData($('form')[0]),// Tell jQuery not to process data or worry about content-type// You *must* include these options!cache: false,contentType: false,processData: false,// Custom XMLHttpRequestxhr: function () {var myXhr = $.ajaxSettings.xhr();if (myXhr.upload) {// For handling the progress of the uploadmyXhr.upload.addEventListener('progress', function (e) {if (e.lengthComputable) {$('progress').attr({value: e.loaded,max: e.total,});}}, false);}return myXhr;}}); });如您所見,使用 HTML5(和一些研究)文件上傳不僅變得可能而且超級容易。嘗試使用 Google Chrome,因為示例的某些 HTML5 組件并非在所有瀏覽器中都可用。
我有文件部分工作......但你可以在其中包含文本字段嗎?這似乎與 var formData = new FormData($('form')[0]); 或 serialize() 無關?
然后我可以在upload.php 中使用$_FILES 嗎?
這應該可以在 Internet Explorer 中使用,但只能在版本 10 中使用。(caniuse.com/xhr2)
嗨,我很欣賞 PHP 是您選擇的語言...但我想知道您是否知道這是否也適用于 ASP.NET MVC?我是一名 .NET 開發人員,我嘗試利用您的簡單示例進行一些 AJAX 文件上傳,但服務器端我沒有獲得通過 AJAX 發布的文件。我正在使用最新的 Chrome。
FormData 在這里施展了所有魔法。請務必查看這些文檔——它涵蓋了您關于多個文件和字段的所有問題。
答2:
huntsbot.com – 高效賺錢,自由工作
2019 年更新:這仍然取決于您的人口統計使用的瀏覽器。
了解“新”HTML5 file API 的重要一點是它wasn’t supported until IE?10。如果您瞄準的特定市場對舊版本 Windows 的傾向高于平均水平,您可能無法訪問它。
截至 2017 年,大約 5% 的瀏覽器是 IE 6、7、8 或 9 之一。如果你進入一家大公司(例如,這是一個 B2B 工具或你提供的培訓工具),這個數字可能會飆升。 2016 年,我與一家公司打交道,他們 60% 以上的機器都使用 IE8。
到本次編輯時是 2019 年,距離我最初的回答已經過去了將近 11 年。 IE9 及更低版本的全球使用率在 1% 左右,但仍有較高使用率的集群。
從中獲得的重要收獲(無論功能如何)是,檢查您的用戶使用的瀏覽器。如果你不這樣做,你將快速而痛苦地學到為什么“為我工作”在交付給客戶時不夠好。 caniuse 是一個有用的工具,但請注意他們從何處獲取人口統計數據。它們可能與您的不一致。這從來沒有比企業環境更真實。
我在 2008 年的回答如下。
但是,有一些可行的非 JS 文件上傳方法。您可以在頁面上創建一個 iframe(使用 CSS 隱藏),然后將表單定位到該 iframe。主頁不需要移動。
這是一個“真實”的帖子,所以它不是完全互動的。如果您需要狀態,則需要在服務器端進行處理。這取決于您的服務器。 ASP.NET 有更好的機制。 PHP plain 失敗,但您可以使用 Perl 或 Apache 修改來繞過它。
如果您需要上傳多個文件,最好一次上傳一個文件(以克服最大文件上傳限制)。將第一個表單發布到 iframe,使用上述方法監視其進度,完成后,將第二個表單發布到 iframe,依此類推。
或者使用 Java/Flash 解決方案。他們可以更靈活地處理他們的帖子…
作為記錄,如果瀏覽器支持 File API,現在可以進行純 AJAX 文件上傳 - developer.mozilla.org/en/using_files_from_web_applications
這是一個相當古老的答案,但它有點誤導.. IE 早在 IE7 就本機支持 XHR,并且早在 IE5 就通過 ActiveX 支持它。 w3schools.com/ajax/ajax_xmlhttprequest_create.asp。執行此操作的實際方法當然是針對 Flash(沖擊波)組件,或推出 Flash/ActiveX (Silverlight) 控件。如果您可以通過 javascript 發起請求并處理響應,那么它就是 ajax。盡管如此,ajax 是 xhr 的同義詞,但它本身并沒有描述傳遞/交換有效負載的下劃線機制/組件。
@BrettCaswell 我并不是說 AJAX/XHR 是不可能的,只是不可能在舊的——但永遠存在的——IE 版本上發布文件。那是并且仍然是完全正確的。
答3:
HuntsBot周刊–不定時分享成功產品案例,學習他們如何成功建立自己的副業–huntsbot.com
為此,我建議使用 Fine Uploader 插件。您的 JavaScript 代碼將是:
$(document).ready(function() {$("#uploadbutton").jsupload({action: "addFile.do",onComplete: function(response){alert( "server response: " + response);}}); });“這個插件在 GNU GPL 2 或更高版本以及 GNU LGPL 2 或更高版本下開源。”因此,只要您不分發副本或修改版本,您就不必打開您的項目。
如果有人試圖走這條路,FineUploader 已于 2018 年停產。github.com/FineUploader/fine-uploader/issues/2073
答4:
huntsbot.com高效搞錢,一站式跟進超10+任務平臺外包需求
注意:此答案已過時,現在可以使用 XHR 上傳文件。
您無法使用 XMLHttpRequest (Ajax) 上傳文件。您可以使用 iframe 或 Flash 模擬效果。優秀的 jQuery Form Plugin 通過 iframe 發布您的文件以獲得效果。
小備注:在最新版本的 chrome 和 firefox 中是可能的,stackoverflow.com/questions/4856917/…
答5:
打造屬于自己的副業,開啟自由職業之旅,從huntsbot.com開始!
為未來的讀者總結。
異步文件上傳
使用 HTML5
如果支持 FormData 和 File API(兩種 HTML5 功能),您可以使用 $.ajax() 方法使用 jQuery 上傳文件。
您也可以發送文件 without FormData,但無論哪種方式,文件 API 都必須存在以處理文件,以便它們可以通過 XMLHttpRequest (Ajax) 發送。
$.ajax({url: 'file/destination.html', type: 'POST',data: new FormData($('#formWithFiles')[0]), // The form with the file inputs.processData: false,contentType: false // Using FormData, no need to process data. }).done(function(){console.log("Success: Files sent!"); }).fail(function(){console.log("An error occurred, the files couldn't be sent!"); });如需快速、純 JavaScript(無 jQuery)示例,請參閱“Sending files using a FormData object”。
倒退
當不支持 HTML5(無 File API)時,唯一的其他純 JavaScript 解決方案(無 Flash 或任何其他瀏覽器插件)是隱藏 iframe 技術,它允許在不使用 XMLHttpRequest 對象的情況下模擬異步請求。
它包括使用文件輸入將 iframe 設置為表單的目標。當用戶提交請求并上傳文件時,響應顯示在 iframe 內,而不是重新呈現主頁。隱藏 iframe 使整個過程對用戶透明并模擬異步請求。
如果處理得當,它幾乎可以在任何瀏覽器上運行,但它有一些關于如何從 iframe 獲取響應的警告。
在這種情況下,您可能更喜歡使用像 Bifr?st 這樣的包裝插件,它使用 iframe 技術,但還提供了一個 jQuery Ajax transport,允許僅使用 $.ajax()send files像這樣的方法:
$.ajax({url: 'file/destination.html', type: 'POST',// Set the transport to use (iframe means to use Bifr?st)// and the expected data type (json in this case).dataType: 'iframe json', fileInputs: $('input[type="file"]'), // The file inputs containing the files to send.data: { msg: 'Some extra data you might need.'} }).done(function(){console.log("Success: Files sent!"); }).fail(function(){console.log("An error occurred, the files couldn't be sent!"); });插件
Bifr?st 只是一個小型包裝器,它為 jQuery 的 ajax 方法添加了回退支持,但許多上述插件(如 jQuery Form Plugin 或 jQuery File Upload)包含從 HTML5 到不同回退的整個堆棧以及一些有用的功能來簡化流程。根據您的需要和要求,您可能需要考慮裸實現或其中任何一個插件。
Bifrost 甚至不附加 POST 數據……強烈不推薦這個,粗略的插件,浪費時間。
答6:
huntsbot.com – 程序員副業首選,一站式外包任務、遠程工作、創意產品分享訂閱平臺。
此 AJAX file upload jQuery plugin 上傳文件,并將響應傳遞給回調,僅此而已。
它不依賴于特定的 HTML,只需給它一個
它不需要您的服務器以任何特定方式響應
使用多少文件或它們在頁面上的位置都沒有關系
– 少用 –
$('#one-specific-file').ajaxfileupload({'action': '/upload.php' });——或多于——
$('input[type="file"]').ajaxfileupload({'action': '/upload.php','params': {'extra': 'info'},'onComplete': function(response) {console.log('custom handler for file:');alert(JSON.stringify(response));},'onStart': function() {if(weWantedTo) return false; // cancels upload},'onCancel': function() {console.log('no file selected');} });答7:
huntsbot.com聚合了超過10+全球外包任務平臺的外包需求,尋找外包任務與機會變的簡單與高效。
我一直在使用下面的腳本來上傳恰好可以正常工作的圖像。
HTML
JavaScript
jQuery('document').ready(function(){var input = document.getElementById("file");var formdata = false;if (window.FormData) {formdata = new FormData();}input.addEventListener("change", function (evt) {var i = 0, len = this.files.length, img, reader, file;for ( ; i < len; i++ ) {file = this.files[i];if (!!file.type.match(/image.*/)) {if ( window.FileReader ) {reader = new FileReader();reader.onloadend = function (e) {//showUploadedItem(e.target.result, file.fileName);};reader.readAsDataURL(file);}if (formdata) {formdata.append("image", file);formdata.append("extra",'extra-data');}if (formdata) {jQuery('div#response').html('');jQuery.ajax({url: "upload.php",type: "POST",data: formdata,processData: false,contentType: false,success: function (res) {jQuery('div#response').html("Successfully uploaded");}});}}else{alert('Not a vaild image!');}}}, false); });解釋
我使用響應 div 來顯示上傳動畫和上傳完成后的響應。
最好的部分是您可以發送額外的數據,例如 ids &等使用此腳本時的文件。我在腳本中提到了它extra-data。
在 PHP 級別,這將像正常的文件上傳一樣工作。額外數據可以作為 $_POST 數據檢索。
在這里,您沒有使用插件和東西。您可以根據需要更改代碼。您不是在這里盲目編碼。這是任何 jQuery 文件上傳的核心功能。實際上是Javascript。
答8:
huntsbot.com聚合了超過10+全球外包任務平臺的外包需求,尋找外包任務與機會變的簡單與高效。
你可以很容易地在 vanilla JavaScript 中做到這一點。這是我當前項目的一個片段:
var xhr = new XMLHttpRequest(); xhr.upload.onprogress = function(e) {var percent = (e.position/ e.totalSize);// Render a pretty progress bar }; xhr.onreadystatechange = function(e) {if(this.readyState === 4) {// Handle file upload complete} }; xhr.open('POST', '/upload', true); xhr.setRequestHeader('X-FileName',file.name); // Pass the filename along xhr.send(file);答9:
huntsbot.com – 程序員副業首選,一站式外包任務、遠程工作、創意產品分享訂閱平臺。
您可以簡單地使用 jQuery .ajax() 上傳。
HTML:
File:CSS
.progress { display: none; }Javascript:
$(document).ready(function(ev) {$("#upload-form").on('submit', (function(ev) {ev.preventDefault();$.ajax({xhr: function() {var progress = $('.progress'),xhr = $.ajaxSettings.xhr();progress.show();xhr.upload.onprogress = function(ev) {if (ev.lengthComputable) {var percentComplete = parseInt((ev.loaded / ev.total) * 100);progress.val(percentComplete);if (percentComplete === 100) {progress.hide().val(0);}}};return xhr;},url: 'upload.php',type: 'POST',data: new FormData(this),contentType: false,cache: false,processData: false,success: function(data, status, xhr) {// ...},error: function(xhr, status, error) {// ...}});})); });進展很好;-)
答10:
HuntsBot周刊–不定時分享成功產品案例,學習他們如何成功建立自己的副業–huntsbot.com
我過去做過的最簡單和最可靠的方法是簡單地將隱藏的 iFrame 標記與您的表單一起定位 - 然后它將在 iframe 內提交而無需重新加載頁面。
也就是說,如果您不想使用插件、JavaScript 或 HTML 以外的任何其他形式的“魔法”。當然,你可以將它與 JavaScript 或你有什么結合起來…
您還可以讀取 iframe onLoad 的內容以了解服務器錯誤或成功響應,然后將其輸出給用戶。
Chrome、iFrame 和 onLoad
-注意-如果您對如何在上傳/下載時設置 UI 阻止程序感興趣,您只需要繼續閱讀
目前,Chrome 在用于傳輸文件時不會觸發 iframe 的 onLoad 事件。 Firefox、IE 和 Edge 都會觸發文件傳輸的 onload 事件。
我發現適用于 Chrome 的唯一解決方案是使用 cookie。
基本上在開始上傳/下載時做到這一點:
[Client Side] 啟動一個間隔來尋找cookie的存在
[服務器端] 對文件數據做任何你想做的事
[服務器端] 為客戶端間隔設置 cookie
[客戶端] Interval 看到 cookie 并像 onLoad 事件一樣使用它。例如,您可以啟動 UI 阻止程序,然后 onLoad(或在制作 cookie 時)刪除 UI 阻止程序。
為此使用 cookie 很難看,但它確實有效。
我在下載時為 Chrome 制作了一個 jQuery 插件來處理這個問題,你可以在這里找到
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
同樣的基本原則也適用于上傳。
使用下載器(顯然包括 JS)
$('body').iDownloader({"onComplete" : function(){$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete}});$('somebuttion').click( function(){$('#uiBlocker').css('display', 'block'); //block the UI$('body').iDownloader('download', 'htttp://example.com/location/of/download');});在服務器端,就在傳輸文件數據之前,創建 cookie
setcookie('iDownloader', true, time() + 30, "/");插件將看到 cookie,然后觸發 onComplete 回調。
答11:
huntsbot.com高效搞錢,一站式跟進超10+任務平臺外包需求
I’ve written this up in a Rails environment。如果你使用輕量級的 jQuery-form 插件,它只有大約五行 JavaScript。
挑戰在于讓 AJAX 上傳工作,因為標準 remote_form_for 不理解多部分表單提交。它不會發送 Rails 通過 AJAX 請求返回的文件數據。
這就是 jQuery-form 插件發揮作用的地方。
這是它的 Rails 代碼:
<% remote_form_for(:image_form, :url => { :controller => "blogs", :action => :create_asset }, :html => { :method => :post, :id => 'uploadForm', :multipart => true }) do |f| %>Upload a file: <%= f.file_field :uploaded_data %> <% end %>這是相關的 JavaScript:
$('#uploadForm input').change(function(){$(this).parent().ajaxSubmit({beforeSubmit: function(a,f,o) {o.dataType = 'json';},complete: function(XMLHttpRequest, textStatus) {// XMLHttpRequest.responseText will contain the URL of the uploaded image.// Put it in an image element you create, or do with it what you will.// For example, if you have an image elemtn with id "my_image", then// $('#my_image').attr('src', XMLHttpRequest.responseText);// Will set that image tag to display the uploaded image.},}); });這是 Rails 控制器動作,非常普通:
@image = Image.new(params[:image_form])@image.saverender :text => @image.public_filename在過去的幾周里,我一直在用 Bloggity 使用它,它的工作就像一個冠軍。
原文鏈接:https://www.huntsbot.com/qa/xMlx/how-can-i-upload-files-asynchronously-with-jquery?lang=zh_CN&from=csdn
huntsbot.com高效搞錢,一站式跟進超10+任務平臺外包需求
總結
以上是生活随笔為你收集整理的如何使用 jQuery 异步上传文件?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【化学信息学】计算机辅助药物设计的发展
- 下一篇: hbuilderx uniapp 【成功