Safari 5 / Firefox 4以降、このFormData
クラスを使用するのが最も簡単です。
var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file-'+i, file);
});
これFormData
で、XMLHttpRequestと一緒に送信する準備ができたオブジェクトができました。
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
オプションをに設定してfalse
、jQueryにContent-Type
ヘッダーを追加しないように強制する必要があります。そうしないと、境界文字列がヘッダーから失われます。processData
また、フラグをfalseに設定したままにする必要があります。そうしないと、jQueryがFormData
文字列に変換しようとして失敗します。
これで、次を使用してPHPでファイルを取得できます。
$_FILES['file-0']
file-0
(ファイル入力で属性を指定しない限り、ファイルは1つだけです。指定multiple
した場合、番号はファイルごとに増加します。)
古いブラウザでの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);
既存のフォームからFormDataを作成する
ファイルを手動で繰り返す代わりに、既存のフォームオブジェクトのコンテンツを使用してFormDataオブジェクトを作成することもできます。
var data = new FormData(jQuery('form')[0]);
カウンターの代わりにPHPネイティブ配列を使用する
ファイル要素に同じ名前を付け、名前を角かっこで囲みます。
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file[]', file);
});
$_FILES['file']
これにより、アップロードされたすべてのファイルのファイルアップロードフィールドを含む配列になります。反復する方が簡単なので、最初のソリューションよりも実際にこれをお勧めします。