ファイルをXMLHttpRequest
によってマルチパートとしてサーブレットに送信できますか?フォームを作成してマルチパートとして送信していますが、どういうわけか、アップロードに成功したことに対する応答が得られません。ページを更新したくないので、ajaxで実行する必要があります。
これは、XHR FormData
API (以前は「XHR2」または「XHR Level 2」の一部として知られており、現在「XHR Advanced Features」として知られている)でのみ可能です。
このHTMLを考えると、
_<input type="file" id="myFileField" name="myFile" />
_
以下のようにアップロードできます:
_var formData = new FormData();
formData.append("myFile", document.getElementById("myFileField").files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "myServletUrl");
xhr.send(formData);
_
XHRは適切なヘッダーとリクエストボディエンコーディングを処理し、この例では、ファイルはmyFile
という名前の_form-data
_部分としてサーバー側で利用できます。
古いブラウザではFormData
APIがサポートされていないことに注意する必要があります。 caniuse.com で、Chrome 7 +、Firefox 3.5 +、Safari 5 +、IEで現在実装されていることがわかります。 10+およびOpera 12+。
別の方法は、 jQuery Formプラグイン を使用することです。 JavaScriptコードを何行も書かずにフォーム全体を記述して適切に機能させると、次の行だけで即座にajax化されます。
_$("#formId").ajaxForm(function(response) {
// Handle ajax response here.
});
_
また、非表示のiframeトリックによるファイルのアップロードもサポートしています。詳細な説明については、 このjQueryフォームのドキュメント も参照してください。通常の(同期)要求とajax(非同期)要求の両方でインターセプトできるように、サーブレットコードを変更するだけでよい場合があります。具体的な例については、この回答も参照してください。 JSP/ServletとAjaxを使用した単純な計算機
いずれにせよ、アップロードされたファイルは、次のように _@MultipartConfig
_ サーブレットのdoPost()
メソッドで利用可能になります。
_Part myFile = request.getPart("myFile");
_
または、まだサーブレット2.5以前を使用している場合は、Apache Commons FileUploadを通常の方法で使用します。具体的な例については、この回答も参照してください。 JSP/Servletを使用してファイルをサーバーにアップロードする方法
Xhrでmultipart/form-data
を送信することはできません(pdate:ですが、XHR2
を使用した最新のブラウザでは可能です。BalusCの回答を参照してください)。
それを達成する一般的な方法は、通常のform
を使用することですが、代わりにiframe
を使用します。この方法では、iframe
のみがアップロード時に更新されます。