'ผนวก' เรียกบนวัตถุที่ไม่ใช้อินเทอร์เฟซ FormData


89

ฉันพยายามอัปโหลดภาพด้วย jquery และ ajax แต่สิ่งที่น่าประหลาดเกิดขึ้นที่นี่ ในคอนโซลบันทึกการแสดง

TypeError: 'append' เรียกบนวัตถุที่ไม่ใช้อินเทอร์เฟซ FormData

ช่วยบอกฉันทีว่าฉันทำอะไรผิด?

สคริปต์ 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>

ดูคำถามแรกที่เกี่ยวข้อง: วิธีการส่งวัตถุ FormData ด้วย Ajax-request ใน jQuery? .
Felix Kling

คำตอบ:


187

ในการใช้ formdata กับ 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     
    }
});

.ajax อ้างอิง

processData (ค่าเริ่มต้น: จริง)

ประเภท: บูลีน

ตามค่าเริ่มต้นข้อมูลที่ส่งผ่านไปยังตัวเลือกข้อมูลเป็นวัตถุ (ในทางเทคนิคสิ่งอื่นที่ไม่ใช่สตริง) จะถูกประมวลผลและแปลงเป็นสตริงการสืบค้นโดยปรับให้เหมาะสมกับประเภทเนื้อหาเริ่มต้น "application / x-www-form-urlencoded" . หากคุณต้องการส่ง DOMDocument หรือข้อมูลอื่น ๆ ที่ไม่ได้รับการประมวลผลให้ตั้งค่าตัวเลือกนี้เป็นเท็จ


ฉันมีความสับสน คุณจะช่วยฉันได้ไหม สมมติว่าฉันต้องการส่งไฟล์และสตริงพร้อมกับอาร์เรย์ สมมติว่าในสคริปต์ของฉันฉันต้องการส่งไฟล์รูปภาพและสตริงที่มีชื่อผู้ใช้ ทำอย่างไร? เป็นไปได้ไหมที่จะสร้าง json หรือ xml หรืออาร์เรย์อื่น ๆ เพื่อเก็บไฟล์และสตริงเข้าด้วยกัน? ฉันเป็นมือใหม่ อาจเป็นคำถามโง่ ๆ ฉันต้องการความช่วยเหลือจากคุณ ..

1
เพียงแค่เรียกใช้เมธอดต่อท้ายของวัตถุ FormData เพื่อเพิ่มรายการเช่น: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

ขอบคุณฉันติดปัญหานี้มาหลายชั่วโมงแล้ว!
user752746

34

เพิ่มพารามิเตอร์ทั้งสองนี้ใน AJAX ของคุณเพื่อแก้ปัญหาของคุณ:

processData: false,
contentType: false,

อย่าลืม: cache: falseมันทำให้ฉันมีปัญหาในตอนนี้ ด้วยการแก้ไขทั้งหมด
Zri

@ Zri หมายถึงcache: falseอะไร?
Fatih Mert Doğancan

จากเอกสาร jQuery: cache (ค่าเริ่มต้น: true, false สำหรับ dataType 'script' และ 'jsonp') ประเภท: บูลีนหากตั้งค่าเป็นเท็จจะบังคับไม่ให้เบราว์เซอร์แคชเพจที่ร้องขอ หมายเหตุ: การตั้งค่าแคชเป็นเท็จจะใช้ได้กับคำขอ HEAD และ GET เท่านั้น ทำงานโดยต่อท้าย "_ = {timestamp}" กับพารามิเตอร์ GET ไม่จำเป็นต้องใช้พารามิเตอร์สำหรับคำขอประเภทอื่นยกเว้นใน IE8 เมื่อ POST ถูกสร้างไปยัง URL ที่ได้รับการร้องขอโดย GET
Zri

1
@Zri คุณอาจจะใช้GETคำขอ cache:falseจะไม่ทำงานอย่างถูกต้องสำหรับPOSTการร้องขอ ดังที่คุณได้กล่าวไว้ในความคิดเห็นข้างต้นมันใช้ได้กับHEADและGETร้องขอเท่านั้น และFormDataใช้ในการส่งข้อมูลแบบฟอร์มซึ่งควรจะใช้POSTแทนGET. ดังนั้นฉันขอแนะนำให้คุณใช้ POST ในการส่งข้อมูลแบบฟอร์มเสมอ
โชคดี


2

การเพิ่ม:

processData: false,
contentType: false,

จะช่วยเรื่องไฟล์ได้อย่างแน่นอนนอกเหนือจากนั้นก็คือหากคุณส่งข้อผิดพลาดหรือข้อความความสำเร็จกลับไปที่หน้าคุณจะต้องใช้ json เพื่อทำให้ชีวิตของคุณง่ายขึ้น

ตัวอย่าง:

dataType: 'json',

ซึ่งจะช่วยในการแยกวิเคราะห์คำตอบของคุณ หากไม่มีมันจะทำให้เกิดข้อผิดพลาด


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.