インターフェイスFormDataを実装していないオブジェクトで呼び出された「append」


89

jqueryとajaxで画像をアップロードしようとしています。しかし、ここで奇妙なことが起こりました。コンソールでその表示をログに記録します

TypeError:インターフェイスFormDataを実装していないオブジェクトで「append」が呼び出されました。

ここで私が間違ったことを教えてください。

JSスクリプト

var prosrc=$("#pro_pix img").last().attr("src");
$("#logoform").on('change',function(event){
var postData = new FormData(this);
$("#pro_pix img").last().hide();
$("#pro_pix img").first().show();
event.preventDefault();
$.ajax(
    {
        url : "/function/pro_pic_upload.php",
        type: "POST",
        data : postData,
        success:function(data, textStatus, jqXHR)
        {
        $("#pro_pix img").last().show();
        $("#pro_pix img").first().hide();
        $("#pro_pix h6").text(data);
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            //if fails     
        }
    });
});

私のHTMLマークアップ

 <div class="row">
    <!-- left column -->
    <div id="pro_pix" class="col-md-4 col-sm-6 col-xs-12">
      <div class="text-center">
        <img src="template/image/725.GIF" class="avatar img-circle img-thumbnail" style="display:none" alt="avatar">
        <img src="<?php echo $rowuser['profile_logo']; ?>" class="avatar img-circle img-thumbnail" alt="avatar">
        <h6>Upload a different photo...</h6>
        <form role="form" id="logoform" enctype="multipart/form-data">
        <input id="logo" name="logo" type="file" class="text-center center-block well well-sm">
        </form>
      </div>
    </div>

回答:


187

jqueryでformdataを使用するには、正しいオプションを設定する必要があります

$.ajax({
    url : "/function/pro_pic_upload.php",
    type: "POST",
    data : postData,
    processData: false,
    contentType: false,
    success:function(data, textStatus, jqXHR){
        $("#pro_pix img").last().show();
        $("#pro_pix img").first().hide();
        $("#pro_pix h6").text(data);
    },
    error: function(jqXHR, textStatus, errorThrown){
        //if fails     
    }
});

.ajaxリファレンス

processData(デフォルト:true)

タイプ:ブール

デフォルトでは、オブジェクトとしてデータオプションに渡されたデータ(技術的には文字列以外のもの)が処理され、クエリ文字列に変換され、デフォルトのコンテンツタイプ「application / x-www-form-urlencoded」に適合します。 。DOMDocumentまたはその他の未処理のデータを送信する場合は、このオプションをfalseに設定します。


混乱しています。手伝ってくれませんか。ファイルと文字列を配列と一緒に送信したいとします。スクリプトで、画像ファイルとユーザー名の文字列を送信するとします。どうやってするか?ファイルと文字列を一緒に保持するためにjsonやxml、またはその他の配列を作成することは可能ですか?私は初心者です。これはばかげた質問かもしれません。私はあなたの助けが必要...

1
FormDataオブジェクトのappendメソッドを呼び出すだけで、次のようになります。– postData.append("name",value);
Patrick Evans

オブジェクトのような複雑なアイテムに注意してください。つまり{cat:"meow",dog:"bark"}、最初にJSON.stringifyを使用する必要がpostData.append("name",JSON.stringify(someObject));あります。サーバー側でjsonを解析します
Patrick Evans

1
忘れないでください: cache: false それは私にちょうど今問題を与えました。すべて修正されました。
zri 2015年

ありがとう、私はこの問題でこの1時間立ち往生しています!
user752746 2016年

34

問題を解決するには、AJAXに次の2つのパラメーターを追加します。

processData: false,
contentType: false,

忘れないでください:cache: falseそれは私にちょうど今問題を与えました。すべて修正されました。
zri 2015年

@Zri、どういう意味cache: falseですか?
ファティMERTDoğancan

jQueryドキュメントから:cache(デフォルト:true、dataType'script 'および' jsonp 'の場合はfalse)タイプ:ブール値falseに設定すると、要求されたページがブラウザーによってキャッシュされないように強制されます。注:キャッシュをfalseに設定すると、HEADリクエストとGETリクエストでのみ正しく機能します。これは、GETパラメーターに「_ = {timestamp}」を追加することで機能します。IE8で、GETによって既に要求されているURLに対してPOSTが行われる場合を除いて、他のタイプの要求にはこのパラメーターは必要ありません。
zri 2016年

1
@ZriGETリクエストを使用している可能性があります。cache:false以下のために正常に動作しませんPOST要求。上記のコメントで述べたように、それはリクエストに対してのみ機能HEADGETます。そしてFormData、のPOST代わりにあるべきフォームデータを送信するために使用されGETます。したがって、フォームデータの送信には常にPOSTを使用することをお勧めします。
ラッキー


2

追加:

processData: false,
contentType: false,

間違いなくファイルに役立ちますが、それ以外に、エラーや成功メッセージをページに戻すような場合は、jsonを使用して作業を楽にすることができます。

例:

dataType: 'json',

これは、応答の解析に役立ちます。これがないと、エラーがスローされます。


0

行を編集するだけです。

var postData = new FormData(this);

に:

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