FormData arabirimini uygulamayan bir nesnede çağrılan 'append'


89

Jquery ve ajax ile resim yüklemeye çalışıyorum. Ama burada garip bir şey oldu. Konsolda gösterimini günlüğe kaydet

TypeError: FormData arabirimini uygulamayan bir nesnede çağrılan 'append'.

Lütfen bana burada neyi yanlış yaptığımı söyle?

JS betiği

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 İşaretlemem

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

Yanıtlar:


187

formdata'yı jquery ile kullanmak için doğru seçenekleri ayarlamanız gerekir

$.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 referansı

processData (varsayılan: true)

Tür: Boole

Varsayılan olarak, veri seçeneğine bir nesne olarak aktarılan veriler (teknik olarak, bir dizeden başka herhangi bir şey) işlenecek ve varsayılan içerik türü "application / x-www-form-urlencoded" e uyan bir sorgu dizesine dönüştürülecektir. . Bir DOMDocument veya diğer işlenmemiş verileri göndermek istiyorsanız, bu seçeneği false olarak ayarlayın.


Kafam karışık. lütfen bana yardım eder misin bir dizi ile birlikte bir dosya ve bir dize göndermek istediğimi varsayalım. Komut dosyamda resim dosyasını ve kullanıcı adıyla bir dizeyi göndermek istediğimi varsayalım. bu nasıl yapılır? Dosya ve dizeyi bir arada tutmak için bir json veya xml veya başka bir dizi yapmak mümkün müdür? Ben acemiyim Aptalca soru bu olabilir. yardımına ihtiyacım var ..

1
öğeleri eklemek için sadece FormData nesnesinin ekleme yöntemini çağırın, yani:postData.append("name",value);
Patrick Evans

Nesneler gibi karmaşık öğeler için not, yani: {cat:"meow",dog:"bark"}önce JSON.stringify kullanmalısınız: postData.append("name",JSON.stringify(someObject));ve json'u sunucu tarafında ayrıştırmalısınız
Patrick Evans

1
Unutma: cache: false Şu anda bana problemler verdi. Her şey düzeldi.
Zri

Teşekkürler, son bir saattir bu konuda takılıp kaldım!
user752746

34

Sorununuzu çözmek için bu iki parametreyi AJAX'ınıza ekleyin:

processData: false,
contentType: false,

Unutma: cache: falseŞu anda bana problemler verdi. Her şey düzeldi.
Zri

@Zri, ne demek cache: false ?
Fatih Mert Doğancan

JQuery belgelerinden: önbellek (varsayılan: true, dataType 'script' ve 'jsonp' için false) Tür: Boolean false olarak ayarlanırsa, istenen sayfaları tarayıcı tarafından önbelleğe alınmamaya zorlar. Not: Önbelleği yanlış olarak ayarlamak yalnızca HEAD ve GET istekleriyle doğru şekilde çalışacaktır. GET parametrelerine "_ = {timestamp}" ekleyerek çalışır. Bir GET tarafından zaten talep edilen bir URL'ye POST yapıldığında IE8 dışında diğer istek türleri için parametreye gerek yoktur.
Zri

1
@Zri Bir GETistek kullanıyor olabilirsiniz . cache:falseİçin düzgün çalışmaz POSTistek. Yukarıdaki yorumda belirttiğiniz gibi, sadece HEADve GETistekler için çalışır . Ve yerine FormDataolması gereken bir form verisi göndermek için kullanılır . Bu nedenle, form verilerini göndermek için her zaman POST kullanmanızı öneririm. POSTGET
Lucky

2

Bu parametreyi ajax çağrısında ayarlamanız gerekir:

enctype: 'multipart/form-data'

2

Ekleme:

processData: false,
contentType: false,

kesinlikle dosyaya yardımcı olacaktır, bunun yanı sıra herhangi bir tür hata veya başarı mesajını sayfaya geri dönüyorsanız, hayatınızı kolaylaştırmak için json kullanmak isteyeceksiniz.

misal:

dataType: 'json',

bu, yanıtlarınızın ayrıştırılmasına yardımcı olacaktır. Onsuz, bir hata atar.


0

Sadece satırınızı düzenleyin:

var postData = new FormData(this);

to:

var postData = new FormData($(this));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.