のXMLHttpRequest レベル 2標準 (まだ作業草案) はFormData
インターフェイスを定義します。このインターフェイスにより、File
XHR リクエスト (Ajax リクエスト) にオブジェクトを追加できるようになります。
ちなみに、これは新しい機能です。以前は、「hidden-iframe-trick」が使用されていました(これについては私のもう一つの質問)。
仕組みは以下のとおりです(例):
var xhr = new XMLHttpRequest(),
fd = new FormData();
fd.append( 'file', input.files[0] );
xhr.open( 'POST', 'http://example.com/script.php', true );
xhr.onreadystatechange = handler;
xhr.send( fd );
input
はフィールドであり、<input type="file">
はhandler
Ajax リクエストの成功ハンドラです。
これは、すべてのブラウザ (繰り返しますが、IE を除く) で正常に動作します。
さて、この機能を jQuery で動作させたいと思います。私はこれを試しました:
var fd = new FormData();
fd.append( 'file', input.files[0] );
$.post( 'http://example.com/script.php', fd, handler );
残念ながら、それは機能しません(「不正な呼び出し」エラーが発生します -スクリーンショットはこちら)。jQuery はフォーム フィールド名 / 値を表す単純なキー値オブジェクトを想定していると思われますが、FormData
渡しているインスタンスは明らかに互換性がありません。
FormData
さて、にインスタンスを渡すことが可能になったのでxhr.send()
、jQuery でも動作させることが可能になることを期待しています。
アップデート:
jQuery の Bug Tracker に「機能チケット」を作成しました。こちらです:http://bugs.jquery.com/ticket/9995
「Ajax プレフィルター」を使用するように提案されました...
アップデート:
まず、どのような動作を実現したいかを示すデモを紹介します。
HTML:
<form>
<input type="file" id="file" name="file">
<input type="submit">
</form>
JavaScript:
$( 'form' ).submit(function ( e ) {
var data, xhr;
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
xhr = new XMLHttpRequest();
xhr.open( 'POST', 'http://hacheck.tel.fer.hr/xml.pl', true );
xhr.onreadystatechange = function ( response ) {};
xhr.send( data );
e.preventDefault();
});
上記のコードを実行すると、次の HTTP リクエストが生成されます。
これが私が必要としているものです- 「multipart/form-data」コンテンツ タイプが欲しいのです!
提案される解決策は次のようになります。
$( 'form' ).submit(function ( e ) {
var data;
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
$.ajax({
url: 'http://hacheck.tel.fer.hr/xml.pl',
data: data,
processData: false,
type: 'POST',
success: function ( data ) {
alert( data );
}
});
e.preventDefault();
});
ただし、次の結果になります。
ご覧のとおり、コンテンツ タイプが間違っています...
ベストアンサー1
次のようにできると思います:
var fd = new FormData();
fd.append( 'file', input.files[0] );
$.ajax({
url: 'http://example.com/script.php',
data: fd,
processData: false,
contentType: false,
type: 'POST',
success: function(data){
alert(data);
}
});
ノート: