在未实现接口FormData的对象上调用了“ append”


87

我正在尝试使用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     
        }
    });
});

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

Answers:


184

为了将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(默认值:true)

类型:布尔

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


我很困惑。你能帮我吗?假设我要发送文件和字符串以及数组。假设我想在脚本中发送图像文件和带有用户名的字符串。怎么做?是否可以制作json或xml或任何其他数组来将文件和字符串保存在一起?我是初学者。可能这是一个愚蠢的问题。我需要你的帮助..

1
只需调用FormData对象的append方法即可添加项,即: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 2015年

谢谢,过去一个小时我一直在这个问题上困扰!
user752746'6

34

在AJAX中添加以下两个参数即可解决您的问题:

processData: false,
contentType: false,

不要忘记:cache: false这给我带来了问题。一切都固定了。
Zri 2015年

@Zri,是什么意思cache: false
法提赫·梅特·多安坎

从jQuery文档中获取:cache(默认值:true,对于dataType'script'和'jsonp',为false)类型:Boolean如果设置为false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为false只能与HEAD和GET请求一起正常使用。它通过在GET参数后附加“ _ = {timestamp}”来工作。对于其他类型的请求,不需要此参数,但在IE8中,当GET对已经由GET请求的URL进行POST时除外。
Zri

1
@Zri您可能正在使用一个GET请求。该cache:false用于将无法正常工作POST的要求。正如您在上面的注释中提到的,它仅适用于HEADGET请求。并且FormData用于提交表单数据,该数据应为POST而不是GET。因此,我建议您始终使用POST提交表单数据。
幸运


2

新增:

processData: false,
contentType: false,

肯定会对文件有帮助,此外,如果您在将任何错误或成功消息传递回页面,您将希望使用json来简化生活。

例:

dataType: 'json',

这将有助于解析您的回复。没有它,它将引发错误。


0

只需编辑您的行:

var postData = new FormData(this);

至:

var postData = new FormData($(this));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.