[解決済み] jQuery.ajaxでmultipart/formdataを送信する。
質問
jQueryのajax機能を使って、サーバーサイドのPHPスクリプトにファイルを送信する際に問題が発生しました。
ファイルリストを取得することは可能です。
$('#fileinput').attr('files')
このデータをサーバーに送るにはどうすればいいのでしょうか?結果として得られる配列 (
$_POST
) サーバーサイドのphpスクリプトでは、0 (
NULL
) を使用する場合、ファイル入力はできません。
可能であることは知っています(ただし、今までjQueryの解決策は見つからず、Prototyeのコードのみ( http://webreflection.blogspot.com/2009/03/safari-4-multiple-upload-with-progress.html )).
これは比較的新しいようなので、XHR/Ajax経由のファイルアップロードが不可能であることは言及しないでください。
Safari 5での機能が必要です。FFとChromeがあれば良いのですが、必須ではありません。
今のところ私のコードは
$.ajax({
url: 'php/upload.php',
data: $('#file').attr('files'),
cache: false,
contentType: 'multipart/form-data',
processData: false,
type: 'POST',
success: function(data){
alert(data);
}
});
解決方法は?
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']
(ファイルは1つだけです。
file-0
を指定しない限り
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']
は、アップロードされたすべてのファイルのファイルアップロードフィールドを含む配列になります。私は、反復処理がより単純になるため、最初の解決策よりもこの方法を実際にお勧めします。
関連
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み] jQueryで要素にスクロールする
-
[解決済み] jQueryで入力を無効化/有効化する?
-
[解決済み] ユーザーがEnterキーを押してフォームを送信できないようにする
-
[解決済み] jQuery UI DatePicker - 日付フォーマットの変更
-
[解決済み] jQuery: outer html() [重複]。
-
[解決済み] FirefoxでjQuery $.ajax(), $.post がREQUEST_METHODとして "OPTIONS "を送信する問題
-
[解決済み】enctype='multipart/form-data'とはどういう意味ですか?
-
[解決済み】iPad版SafariでjQueryを使ってタッチイベントを認識させる方法は?可能でしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] セレクトした要素の外側のHTMLを取得する
-
[解決済み] 既存の非順序型リストにリストアイテムを追加する方法
-
[解決済み] jQueryのAjax-requestsでFormDataオブジェクトを送信する方法は?[重複している]をクリックします。
-
[解決済み] クリックボタンでクリップボードにコピー
-
[解決済み] jQueryを使用してCSSのdisplay noneまたはblockプロパティを変更するにはどうすればよいですか?
-
[解決済み] チェックボックスがチェックされた場合のjQuery
-
[解決済み] GoogleのCDNからjQuery UI CSSをダウンロードする
-
[解決済み] jQuery セレクタ。Id Ends With?
-
[解決済み] jQuery: テキストで要素を検索する
-
[解決済み] jQueryで選択されたオプションのインデックスを取得する