4 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
從Safari 5 / Firefox 4開始,最簡單的方法是使用FormData
該類:
var data = new FormData();jQuery.each(jQuery('#file')[0].files, function(i, file) { data.append('file-'+i, file);});
所以現(xiàn)在你有了一個(gè)FormData
對象,隨時(shí)可以與XMLHttpRequest一起發(fā)送。
jQuery.ajax({ url: 'php/upload.php', data: data, cache: false, contentType: false, processData: false, method: 'POST', type: 'POST', // For jQuery < 1.9 success: function(data){ alert(data); }});
您必須將contentType
選項(xiàng)設(shè)置為false
,強(qiáng)制jQuery不Content-Type
為您添加標(biāo)題,否則,邊界字符串將丟失。此外,您必須將processData
標(biāo)志設(shè)置為false,否則,jQuery將嘗試將您FormData
轉(zhuǎn)換為字符串,這將失敗。
您現(xiàn)在可以使用以下方法在PHP中檢索文件:
$_FILES['file-0']
(只有一個(gè)文件,file-0
除非您multiple
在文件輸入中指定了屬性,在這種情況下,數(shù)字將隨每個(gè)文件遞增。)
為舊版瀏覽器使用FormData仿真
var opts = { url: 'php/upload.php', data: data, cache: false, contentType: false, processData: false, method: 'POST', type: 'POST', // For jQuery < 1.9 success: function(data){ alert(data); }};if(data.fake) { // Make sure no text encoding stuff is done by xhr opts.xhr = function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.send = xhr.sendAsBinary; return xhr; } opts.contentType = "multipart/form-data; boundary="+data.boundary; opts.data = data.toString();}jQuery.ajax(opts);
從現(xiàn)有表單創(chuàng)建FormData
而不是手動(dòng)迭代文件,也可以使用現(xiàn)有表單對象的內(nèi)容創(chuàng)建FormData對象:
var data = new FormData(jQuery('form')[0]);
使用PHP本機(jī)數(shù)組而不是計(jì)數(shù)器
只需將文件元素命名為相同,并在括號(hào)中結(jié)束名稱:
jQuery.each(jQuery('#file')[0].files, function(i, file) { data.append('file[]', file);});
$_FILES['file']
然后將是一個(gè)包含上傳的每個(gè)文件的文件上載字段的數(shù)組。我實(shí)際上推薦這個(gè)在我的初始解決方案,因?yàn)樗菀椎?/p>

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
只是想為拉斐爾的回答添加一些內(nèi)容。$_FILES
無論您是否使用JavaScript提交,以下是如何讓PHP生成相同的內(nèi)容。
HTML表單:
<form enctype="multipart/form-data" action="/test.php" method="post" class="putImages"> <input name="media[]" type="file" multiple/> <input class="button" type="submit" alt="Upload" value="Upload" /></form>
PHP $_FILES
在沒有JavaScript的情況下提交時(shí)生成:
Array ( [media] => Array ( [name] => Array ( [0] => Galata_Tower.jpg [1] => 518f.jpg ) [type] => Array ( [0] => image/jpeg [1] => image/jpeg ) [tmp_name] => Array ( [0] => /tmp/phpIQaOYo [1] => /tmp/phpJQaOYo ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 258004 [1] => 127884 ) ) )
如果你進(jìn)行漸進(jìn)增強(qiáng),使用Raphael的JS提交文件......
var data = new FormData($('input[name^="media"]')); jQuery.each($('input[name^="media"]')[0].files, function(i, file) { data.append(i, file);});$.ajax({ type: ppiFormMethod, data: data, url: ppiFormActionURL, cache: false, contentType: false, processData: false, success: function(data){ alert(data); }});
...這是PHP的$_FILES
數(shù)組在使用JavaScript提交之后的樣子:
Array ( [0] => Array ( [name] => Galata_Tower.jpg [type] => image/jpeg [tmp_name] => /tmp/phpAQaOYo [error] => 0 [size] => 258004 ) [1] => Array ( [name] => 518f.jpg [type] => image/jpeg [tmp_name] => /tmp/phpBQaOYo [error] => 0 [size] => 127884 ) )
這是一個(gè)很好的數(shù)組,實(shí)際上有些人會(huì)變換$_FILES
,但我發(fā)現(xiàn)使用相同的數(shù)據(jù)是有用的$_FILES
,無論JavaScript是否用于提交。所以,這里有一些JS的小改動(dòng):
// match anything not a [ or ]regexp = /^[^[\]]+/;var fileInput = $('.putImages input[type="file"]'); var fileInputName = regexp.exec( fileInput.attr('name') ); // make files availablevar data = new FormData(); jQuery.each($(fileInput)[0].files, function(i, file) { data.append(fileInputName+'['+i+']', file);});
(2017年4月14日編輯:我從FormData()的構(gòu)造函數(shù)中刪除了表單元素 - 在Safari中修復(fù)了此代碼。)
那段代碼做了兩件事。
input
自動(dòng)檢索name屬性,使HTML更易于維護(hù)?,F(xiàn)在,只要form
有類putImages,其他一切都會(huì)自動(dòng)處理。也就是說,input
不需要任何特殊名稱。普通HTML提交的數(shù)組格式由data.append行中的JavaScript重新創(chuàng)建。注意括號(hào)。
通過這些更改,現(xiàn)在使用JavaScript $_FILES
提交與使用簡單HTML提交的數(shù)組完全相同。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
看看我的代碼,它為我做的工作
$( '#formId' ) .submit( function( e ) { $.ajax( { url: 'FormSubmitUrl', type: 'POST', data: new FormData( this ), processData: false, contentType: false } ); e.preventDefault(); } );
添加回答
舉報(bào)