【问题标题】:'append' called on an object that does not implement interface FormData在未实现接口 FormData 的对象上调用“附加”
【发布时间】:2014-10-12 23:27:38
【问题描述】:

我正在尝试使用 jquery 和 ajax 上传图片。但是这里发生了奇怪的事情。在控制台记录它的显示

TypeError:在未实现的对象上调用了“附加” 接口表单数据。

请告诉我我在这里做错了什么?

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>

【问题讨论】:

标签: javascript jquery ajax


【解决方案1】:

为了在 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     
    }
});

.ajax reference

processData(默认:true)

类型:布尔值

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

【讨论】:

  • 我有点困惑。你能帮帮我吗?假设我想发送一个文件和一个字符串以及一个数组。假设在我的脚本中我想发送图像文件和带有用户名的字符串。怎么做?是否可以制作一个 json 或 xml 或任何其他数组来将文件和字符串保存在一起?我是初学者。可能这是个愚蠢的问题。我需要你的帮助..
  • 只需调用FormData对象的append方法即可添加项目,即:postData.append("name",value);
  • 注意对象之类的复杂项目,即:{cat:"meow",dog:"bark"},你必须先使用JSON.stringify:postData.append("name",JSON.stringify(someObject));并在服务器端解析json
  • 别忘了:cache: false 刚才给我出了问题。一切都解决了。
  • 谢谢,过去一个小时我一直被这个问题困扰!
【解决方案2】:

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

processData: false,
contentType: false,

【讨论】:

  • 别忘了:cache: false 刚才给我出了问题。一切都解决了。
  • @Zri,cache: false 是什么意思?
  • 来自 jQuery 文档:缓存(默认:true,对于 dataType 'script' 和 'jsonp' 为 false) 类型:Boolean 如果设置为 false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为 false 仅适用于 HEAD 和 GET 请求。它通过将“_={timestamp}”附加到 GET 参数来工作。其他类型的请求不需要该参数,除非在 IE8 中对已由 GET 请求的 URL 进行 POST。
  • @Zri 您可能正在使用GET 请求。 cache:false 不适用于 POST 请求。正如您在上面的评论中提到的,它仅适用于 HEADGET 请求。而FormData 用于提交表单数据,该表单数据应该是POST 而不是GET。所以我建议你总是使用 POST 来提交表单数据。
【解决方案3】:

添加:

processData: false,
contentType: false,

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

示例:

dataType: 'json',

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

【讨论】:

    【解决方案4】:

    你必须在ajax调用中设置这个参数:

    enctype: 'multipart/form-data'
    

    【讨论】:

      【解决方案5】:

      只需编辑您的行:

      var postData = new FormData(this);
      

      到:

      var postData = new FormData($(this));
      

      【讨论】:

        猜你喜欢
        • 2017-08-12
        • 2014-03-24
        • 2016-09-18
        • 1970-01-01
        • 2022-09-13
        • 2014-05-22
        • 1970-01-01
        • 2013-11-01
        相关资源
        最近更新 更多