フォームがあり、jqueryシリアル化関数を使用してajax経由でフォームを送信しています
serialized = $(Forms).serialize();
$.ajax({
type : "POST",
cache : false,
url : "blah",
data : serialized,
success: function(data) {
}
しかし、フォームに<input type="file">
フィールドがある場合はどうなりますか?...このajaxシリアル化メソッドを使用してファイルをフォームに渡す方法... $ _FILESを印刷しても何も出力されません
AJAXを使用してファイルをアップロードすることはできません。クライアントコンピューターに保存されているファイルのコンテンツにアクセスし、JavaScriptを使用してリクエストで送信することができないためです。これを達成するためのテクニックの1つは、非表示のiframeを使用することです。 Nice jquery form plugin があります。これにより、フォームとそれをAJAX化できます ファイルのアップロードをサポート も同様です。したがって、このプラグインを使用すると、コードは次のようになります。
$(function() {
$('#ifoftheform').ajaxForm(function(result) {
alert('the form was successfully processed');
});
});
プラグインは、フォームのsubmit
イベントへのサブスクライブ、デフォルトの送信のキャンセル、値のシリアル化、適切なメソッドの使用、ファイルアップロードフィールドの処理を自動的に処理します。
Ajaxでファイルをアップロードできるようになりました!
例:
https://stackoverflow.com/a/8758614/1072492
http://net.tutsplus.com/tutorials/javascript-ajax/uploading-files-with-ajax/
あらゆるタイプのフォームで機能します
$(document).on("submit", "form", function(event)
{
event.preventDefault();
var url=$(this).attr("action");
$.ajax({
url: url,
type: $(this).attr("method"),
dataType: "JSON",
data: new FormData(this),
processData: false,
contentType: false,
success: function (data, status)
{
},
error: function (xhr, desc, err)
{
}
});
});
var form = $('#job-request-form')[0];
var formData = new FormData(form);
event.preventDefault();
$.ajax({
url: "/send_resume/", // the endpoint
type: "POST", // http method
processData: false,
contentType: false,
data: formData,
それは私のために働いた! processDataとcontentTypeをFalseに設定するだけです。
FormDataメソッドを使用して、AJAX経由でファイルをアップロードできます。 IE7、8、9はFormData機能をサポートしていませんが。
$.ajax({
url: "ajax.php",
type: "POST",
data: new FormData('form'),
contentType: false,
cache: false,
processData:false,
success: function(data) {
$("#response").html(data);
}
});
HTML
<form name="my_form" id="my_form" accept-charset="multipart/form-data" onsubmit="return false">
<input id="name" name="name" placeholder="Enter Name" type="text" value="">
<textarea id="detail" name="detail" placeholder="Enter Detail"></textarea>
<select name="gender" id="gender">
<option value="male" selected="selected">Male</option>
<option value="female">Female</option>
</select>
<input type="file" id="my_images" name="my_images" multiple="" accept="image/x-png,image/gif,image/jpeg"/>
</form>
JavaScript
var data = new FormData();
//Form data
var form_data = $('#my_form').serializeArray();
$.each(form_data, function (key, input) {
data.append(input.name, input.value);
});
//File data
var file_data = $('input[name="my_images"]')[0].files;
for (var i = 0; i < file_data.length; i++) {
data.append("my_images[]", file_data[i]);
}
//Custom data
data.append('key', 'value');
$.ajax({
url: "URL",
method: "post",
processData: false,
contentType: false,
data: data,
success: function (data) {
//success
},
error: function (e) {
//error
}
});
PHP
<?php
echo '<pre>';
print_r($_POST);
print_r($_FILES);
echo '</pre>';
die();
?>
$(document).on('click', '#submitBtn', function(e){
e.preventDefault();
e.stopImmediatePropagation();
var form = $("#myForm").closest("form");
var formData = new FormData(form[0]);
$.ajax({
type: "POST",
data: formData,
dataType: "json",
url: form.attr('action'),
processData: false,
contentType: false,
success: function(data) {
alert('Sucess! Form data posted with file type of input also!');
}
)};});
new FormData()
を利用して、ファイル入力を使用したフォームのajax呼び出し送信でprocessData: false, contentType:false
を設定することで、うまくいきました。
上記のコードを使用して、Ajaxを介してファイルフィールドでフォームデータを送信できます
うーん、FormDataサポートされているブラウザだけでなく、すべてのブラウザをターゲットにしたい人のために特別に作る効率的な方法があると思います
非表示IFRAMEをページに表示し、From Inside IFrameの例に対して通常の送信を行うというアイデア
<FORM action='save_upload.php' method=post
enctype='multipart/form-data' target=hidden_upload>
<DIV><input
type=file name='upload_scn' class=file_upload></DIV>
<INPUT
type=submit name=submit value=Upload /> <IFRAME id=hidden_upload
name=hidden_upload src='' onLoad='uploadDone("hidden_upload")'
style='width:0;height:0;border:0px solid #fff'></IFRAME>
</FORM>
ターゲットを非表示のiframeIDまたはnameおよびenctypemultipart/form-data写真の受け入れを許可する
javascript side
function getFrameByName(name) {
for (var i = 0; i < frames.length; i++)
if (frames[i].name == name)
return frames[i];
return null;
}
function uploadDone(name) {
var frame = getFrameByName(name);
if (frame) {
ret = frame.document.getElementsByTagName("body")[0].innerHTML;
if (ret.length) {
var json = JSON.parse(ret);
// do what ever you want
}
}
}
サーバー側の例PHP
<?php
$target_filepath = "/tmp/" . basename($_FILES['upload_scn']['name']);
if (move_uploaded_file($_FILES['upload_scn']['tmp_name'], $target_filepath)) {
$result = ....
}
echo json_encode($result);
?>
HTML5には、ajaxを使用したファイルのアップロードに使用できるFormData
クラスが導入されています。
FormDataのサポートは、次のデスクトップブラウザーバージョンから開始されます。 IE 10 +、Firefox 4.0 +、Chrome 7 +、Safari 5 +、Opera 12+
https://developer.mozilla.org/en/docs/Web/API/FormData/FormData