jqueryシリアル化を使用してファイルをアップロードする方法


83

だから私はフォームを持っていて、jqueryシリアル化機能を使用してajaxを介してフォームを送信しています

        serialized = $(Forms).serialize();

        $.ajax({

        type        : "POST",
        cache   : false,
        url     : "blah",
        data        : serialized,
        success: function(data) {

        }

しかし、フォームに<input type="file">フィールドがある場合はどうなりますか....このajaxシリアル化メソッドを使用してファイルをフォームに渡すにはどうすればよいですか... $ _FILESを印刷しても何も出力されません

回答:


52

クライアントコンピューターに保存されているファイルの内容にアクセスし、javascriptを使用してリクエストで送信できないため、AJAXを使用してファイルをアップロードすることはできません。これを実現する手法の1つは、非表示のiframeを使用することです。フォームをAJAX化できる優れたjqueryフォームプラグインがあり、ファイルのアップロードサポートしています。したがって、このプラグインを使用すると、コードは次のようになります。

$(function() {
    $('#ifoftheform').ajaxForm(function(result) {
        alert('the form was successfully processed');
    });
});

プラグインsubmitは、フォームのイベントへのサブスクライブ、デフォルトの送信のキャンセル、値のシリアル化、適切な方法の使用、ファイルアップロードフィールドの処理などを自動的に処理します...


42
これはもはや真実ではありません。<input type = 'file' name = 'myfile' />とFormData()オブジェクトを使用すると、AJAXを使用して非常に簡単にファイルを保存できます。以下のSilver89の回答を参照してください。
Rook777 2013

1
@ Rook777、もちろん、使用しているブラウザがHTML5 FileAPIをサポートしている場合はそうです。IEでこれを試したことがありますか?HTML5が標準になり、すべてのブラウザーでサポートされるまで、AJAXを使用してファイルをアップロードできないため、プラグインが存在します。
ダリンディミトロフ2013

2
あなたは正しいです。IEをサポートしていない開発環境にいることができて幸運だったので、それを検討するのを忘れました。はい、HTML5との互換性がないと、この機能は機能しません。caniuse.com/xhr2によると、これまでのところIE10以降のみがこの機能をサポートしています。
Rook777 2013

jQueryフォームプラグインは素晴らしいです!
user1570144 2014年

50

FormDataオブジェクトを使用します。あらゆるタイプのフォームで機能します

$(document).on("submit", "form", function(event)
{
    event.preventDefault();
    $.ajax({
        url: $(this).attr("action"),
        type: $(this).attr("method"),
        dataType: "JSON",
        data: new FormData(this),
        processData: false,
        contentType: false,
        success: function (data, status)
        {

        },
        error: function (xhr, desc, err)
        {
            

        }
    });        

});

これに関する重要な注意:エラーprocessData: false, contentType: false,を回避するために必要です。Illegal invocationこれらがないと、jQueryはフォームデータを送信するときに文字列に変換しようとしますが、この場合は不要です。
JeppeMariager-ラム

23
   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に設定するだけです。


16

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();
?>

送信ボタン名の送信方法は?
ムハンマドタリック

@MuhammadTariqueのようなボタンを追加するだけ<button type="button" name="button_name" value="Contact Button">Submit</button>で、php側に応答button_name = "Contact Button"が表示されます
RenishPatel19年

お返事ありがとうございますが、このようには機能しないと思います。しかし、私はすでにこれを使用してこれを行っていますformData.append("btnName", "true");
MuhammadTarique19年

@MuhammadTariqueこの例はすでにこの投稿に次のように追加されていますdata.append('key', 'value');
RenishPatel19年

11

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);
    }
});

新しいFormData( 'form')の 'form'とは何ですか、それはIDですか、それは私には機能しません
Mohamed Selim

はい、これは通常、フォームIDになります
Rossco 2015年

私にとっては、FormDataコンストラクターに渡される「form」文字列ではなくdocument.forms.formでのみ機能します
Mohamed Selim

10
$(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!');
    }
)};});

ファイル入力を使用したフォームのajax呼び出し送信を利用しnew FormData()て設定することで、processData: false, contentType:false私はうまくいきました

上記のコードを使用して、Ajaxを介してファイルフィールドを含むフォームデータを送信することもできます


0

うーん、FormDataでサポートされているブラウザだけでなく、すべてのブラウザをターゲットにしたい人のために特別に作成する効率的な方法があると思います

ページにIFRAMEを非表示にし、From insideIFrameの例で通常の送信を行うというアイデア

<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>

フォームのターゲットに隠さのiframe作るために最も重要なIDまたは名前 とのenctypeマルチパート/フォームデータを写真を受諾できるようにします

javascript側

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);
?>

0

HTML5が導入 FormData、ajaxを使用してファイルをアップロードするために使用できるクラスがれています。

FormDataのサポートは、デスクトップブラウザの次のバージョンから始まります。IE 10以降、Firefox 4.0以降、Chrome 7以降、Safari 5以降、Opera12以降

FormData-Mozilla.org

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.