'append' được gọi trên một đối tượng không triển khai FormData giao diện


87

Tôi đang cố gắng tải hình ảnh lên bằng jquery và ajax. Nhưng điều kỳ lạ đã xảy ra ở đây. Trong bảng điều khiển Ghi nhật ký hiển thị

TypeError: 'append' được gọi trên một đối tượng không triển khai FormData giao diện.

Xin vui lòng cho tôi biết tôi đã làm gì sai ở đây?

Tập lệnh 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     
        }
    });
});

Đánh dấu HTML của tôi

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

Câu trả lời:


184

để sử dụng dữ liệu biểu mẫu với jquery, bạn phải đặt các tùy chọn chính xác

$.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 tham chiếu

processData (mặc định: true)

Loại: Boolean

Theo mặc định, dữ liệu được chuyển vào tùy chọn dữ liệu dưới dạng một đối tượng (về mặt kỹ thuật, bất kỳ thứ gì khác ngoài chuỗi) sẽ được xử lý và chuyển đổi thành chuỗi truy vấn, phù hợp với loại nội dung mặc định "application / x-www-form-urlencoded" . Nếu bạn muốn gửi DOMDocument hoặc dữ liệu không được xử lý khác, hãy đặt tùy chọn này thành false.


Tôi có một sự nhầm lẫn. bạn vui lòng giúp tôi được không? giả sử tôi muốn gửi một tệp và một chuỗi cùng với một mảng. Giả sử trong tập lệnh của tôi, tôi muốn gửi tệp hình ảnh và một chuỗi có tên người dùng. làm thế nào để làm điều đó? Có thể tạo json hoặc xml hoặc bất kỳ mảng nào khác để giữ tệp và chuỗi lại với nhau không? Tôi là người mới bắt đầu. có thể đây là câu hỏi ngớ ngẩn. tôi cần sự giúp đỡ của bạn ..

1
chỉ gọi phương thức append của đối tượng FormData để thêm các mục, ví dụ:postData.append("name",value);
Patrick Evans

Lưu ý cho các hạng mục phức tạp như các đối tượng, ví dụ: {cat:"meow",dog:"bark"}, bạn phải sử dụng JSON.stringify đầu tiên: postData.append("name",JSON.stringify(someObject));và phân tích các json trên máy chủ kết thúc
Patrick Evans

1
Đừng quên: cache: false Nó đã cho tôi những vấn đề vừa rồi. Với tất cả đã được sửa.
Zri

Cảm ơn bạn, tôi đã gặp khó khăn về vấn đề này trong một giờ qua!
dùng752746

34

Thêm hai tham số này vào AJAX của bạn để giải quyết vấn đề của bạn:

processData: false,
contentType: false,

Đừng quên: cache: falseNó đã cho tôi những vấn đề vừa rồi. Với tất cả đã được sửa.
Zri

@Zri, nghĩa là cache: falsegì?
Fatih Mert Doğancan

Từ tài liệu jQuery: cache (mặc định: true, false cho dataType 'script' và 'jsonp') Loại: Boolean Nếu được đặt thành false, trình duyệt sẽ buộc các trang được yêu cầu không được lưu vào bộ đệm. Lưu ý: Đặt bộ nhớ cache thành false sẽ chỉ hoạt động chính xác với các yêu cầu HEAD và GET. Nó hoạt động bằng cách thêm "_ = {timestamp}" vào các tham số GET. Tham số này không cần thiết cho các loại yêu cầu khác, ngoại trừ trong IE8 khi POST được thực hiện tới một URL đã được GET yêu cầu.
Zri

1
@Zri Bạn có thể đang sử dụng một GETyêu cầu. Nó cache:falsesẽ không hoạt động đúng POSTtheo yêu cầu. Như bạn đã đề cập trong nhận xét ở trên, nó chỉ hoạt động cho HEADGETyêu cầu. Và FormDatađược sử dụng để gửi dữ liệu biểu mẫu POSTthay vì GET. Vì vậy, tôi khuyên bạn nên luôn sử dụng POST để gửi dữ liệu biểu mẫu.
May mắn

2

Bạn phải đặt tham số này trong lệnh gọi ajax:

enctype: 'multipart/form-data'

2

Thêm:

processData: false,
contentType: false,

chắc chắn sẽ giúp ích với tệp, một bên là nếu bạn đang thực hiện bất kỳ loại chuyển lỗi hoặc thông báo thành công nào trở lại trang, bạn sẽ muốn sử dụng json để làm cho cuộc sống của bạn dễ dàng hơn.

thí dụ:

dataType: 'json',

điều này sẽ giúp phân tích câu trả lời của bạn. Nếu không có nó, nó sẽ tạo ra một lỗi.


0

Chỉ cần chỉnh sửa dòng của bạn:

var postData = new FormData(this);

đến:

var postData = new FormData($(this));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.