'append'调用了一个没有实现接口FormData的对象

72 javascript ajax jquery

我正在尝试使用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     
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

Pat*_*ans 151

为了使用带有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     
    }
});
Run Code Online (Sandbox Code Playgroud)

.ajax参考

processData(默认值:true)

类型:布尔值

默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型"application/x-www-form-urlencoded" .如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false.

  • 不要忘记: `cache: false` 刚才它给我带来了问题。一切都解决了。 (2认同)

Sah*_*pto 29

在AJAX中添加这两个参数来解决您的问题:

processData: false,
contentType: false,
Run Code Online (Sandbox Code Playgroud)

  • @Zri 您可能正在使用 `GET` 请求。`cache:false` 对 `POST` 请求无法正常工作。正如您在上面的评论中提到的,它仅适用于“HEAD”和“GET”请求。并且 `FormData` 用于提交表单数据,该数据应该是 `POST` 而不是 `GET`。所以我建议你总是使用 POST 提交表单数据。 (2认同)

mod*_*dom 7

添加:

processData: false,
contentType: false,
Run Code Online (Sandbox Code Playgroud)

肯定会对文件有所帮助,除此之外,如果您正在将任何类型的错误或成功消息传递回页面,您将需要使用 json 来让您的生活更轻松。

例子:

dataType: 'json',
Run Code Online (Sandbox Code Playgroud)

这将有助于解析您的回复。没有它,它会抛出错误。