'परिशिष्ट' ने एक ऐसे ऑब्जेक्ट पर कॉल किया जो इंटरफ़ेस फॉर्मडेटा को लागू नहीं करता है


89

मैं jquery और ajax के साथ छवि अपलोड करने का प्रयास कर रहा हूं। लेकिन यहाँ अजीब बात हुई। कंसोल में अपना दिखा लॉग करें

TypeError: 'परिशिष्ट' एक ऐसे ऑब्जेक्ट पर कॉल करता है जो इंटरफ़ेस फॉर्मडैट को लागू नहीं करता है।

कृपया बताएं कि मैंने यहां क्या गलत किया?

जेएस लिपि

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 के साथ फॉर्मडेटा का उपयोग करने के लिए आपको सही विकल्प सेट करना होगा

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

.जैक्स संदर्भ

प्रक्रियाडेटा (डिफ़ॉल्ट: सत्य)

प्रकार: बूलियन

डिफ़ॉल्ट रूप से, डेटा विकल्प को ऑब्जेक्ट के रूप में पास किया जाता है (तकनीकी रूप से, स्ट्रिंग के अलावा कुछ भी) संसाधित किया जाएगा और एक क्वेरी स्ट्रिंग में बदल जाएगा, डिफ़ॉल्ट सामग्री-प्रकार "एप्लिकेशन / x-www-form-urlencoded" के लिए फिटिंग । यदि आप एक DOMDocument, या अन्य गैर-संसाधित डेटा भेजना चाहते हैं, तो इस विकल्प को गलत पर सेट करें।


मुझे एक भ्रम है। क्या आप कृपया मेरी मदद करेंगे? मान लीजिए मैं एक फ़ाइल और एक स्ट्रिंग एक साथ एक सरणी के साथ भेजना चाहता हूं। मान लीजिए कि मेरी स्क्रिप्ट में मैं उपयोगकर्ता नाम के साथ छवि फ़ाइल और एक स्ट्रिंग भेजना चाहता हूं। उसको कैसे करे? क्या फ़ाइल और स्ट्रिंग को एक साथ रखने के लिए एक json या xml या कोई अन्य सरणी बनाना संभव है? मैं शुरुआती हूं। यह मूर्खतापूर्ण सवाल हो सकता है। मुझे आपकी मदद चाहिए ..

1
केवल आइटम जोड़ने के लिए फ़ॉर्मडैट ऑब्जेक्ट के परिशिष्ट पद्धति को कॉल करें, जैसे:postData.append("name",value);
पैट्रिक इवांस

वस्तुओं जैसे जटिल वस्तुओं के लिए ध्यान दें, अर्थात: {cat:"meow",dog:"bark"}आपको पहले JSON.stringify का उपयोग करना होगा: postData.append("name",JSON.stringify(someObject));और सर्वर के अंत में जोंस को पार्स करें
पैट्रिक इवांस

1
मत भूलो: cache: false इसने मुझे अभी समस्याएं दी हैं। इसके साथ सब ठीक हो गया।
ज़री

धन्यवाद, मैं इस मुद्दे पर पिछले एक घंटे से अटका हुआ हूँ!
user752746

34

अपनी समस्या को हल करने के लिए अपने AJAX में इन दो मापदंडों को जोड़ें:

processData: false,
contentType: false,

मत भूलो: cache: falseइसने मुझे अभी समस्याएं दीं। इसके साथ सब ठीक हो गया।
ज़री

@ श्री, क्या मतलब है cache: false?
फातिह मर्ट डूनसन

JQuery के दस्तावेज़ीकरण से: कैश (डिफ़ॉल्ट: सत्य, डेटा टाइप 'स्क्रिप्ट' और 'jsonp' के लिए) टाइप करें: बूलियन यदि गलत पर सेट किया गया है, तो यह अनुरोधित पृष्ठों को ब्राउज़र द्वारा कैश नहीं करने के लिए बाध्य करेगा। नोट: कैश को गलत पर सेट करना केवल HEAD और GET अनुरोधों के साथ सही ढंग से काम करेगा। यह "_ = {टाइमस्टैम्प}" को GET के मापदंडों से जोड़कर काम करता है। आईई 8 के लिए एक पोस्ट जो पहले से ही जीईटी द्वारा अनुरोध किया गया है, को छोड़कर IE8 को छोड़कर अन्य प्रकार के अनुरोधों के लिए पैरामीटर की आवश्यकता नहीं है।
जरी

1
@Zri आप एक GETअनुरोध का उपयोग कर सकते हैं। cache:falseके लिए ठीक से काम नहीं करेगा POSTअनुरोध। जैसा कि आपने उपरोक्त टिप्पणी में उल्लेख किया है, यह केवल HEADऔर GETअनुरोधों के लिए काम करता है । और FormDataएक फॉर्म डेटा जमा करने के लिए उपयोग किया जाता है जो POSTइसके बजाय होना चाहिए GET। इसलिए मेरा सुझाव है कि फ़ॉर्म डेटा जमा करने के लिए आप हमेशा POST का उपयोग करें।
लकी


2

जोड़ना:

processData: false,
contentType: false,

निश्चित रूप से फ़ाइल के साथ मदद करेगा, एक तरफ यह है कि यदि आप किसी भी प्रकार की त्रुटि या सफलता संदेश पृष्ठ पर वापस कर रहे हैं, तो आप अपने जीवन को आसान बनाने के लिए json का उपयोग करना चाहेंगे।

उदाहरण:

dataType: 'json',

यह आपकी प्रतिक्रियाओं को पार्स करने में मदद करेगा। इसके बिना, यह एक त्रुटि फेंक देगा।


0

बस अपनी पंक्ति संपादित करें:

var postData = new FormData(this);

सेवा:

var postData = new FormData($(this));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.