使用 ajax 提交 multipart/form-data 时,文件为空

Posted

技术标签:

【中文标题】使用 ajax 提交 multipart/form-data 时,文件为空【英文标题】:When submitting a multipart/form-data with ajax, file is empty 【发布时间】:2014-09-02 03:02:11 【问题描述】:

我在使用 ajax 提交 multipart/form-data 时遇到问题。

html 代码:

<form id='form_foto' method='post' enctype='multipart/form-data'>
   <input type='hidden' id='id_noticia' name='id_noticia' value='"+id_noticia+"' />
   <input name='foto[]' type='file' multiple />
</form>

jQuery 和 Ajax:

          $("#form_foto").submit(function(e)

                $("#form_foto").append("<br />Aguarde...");

                var formData = new FormData(this);

                $.ajax(
                    url: "/PortalGBD/services",
                    type: "POST",
                    data: formData,
                    async: false,
                    dataType: "multipart/form-data",
                    processData: false,
                    contentType: false,
                    success: function(resposta)
                        alert(resposta);
                    
                );
                e.preventDefault(); 
            );
            $("#form_foto").submit();
            self.close();
        

并且文件输入为空的请求:

--------------65942623427134 内容处置:表单数据;名称="id_noticia"

336 -----------------------------65942623427134 内容处置:表单数据;名称=“照片[]”;文件名="" 内容类型:application/octet-stream

--------------65942623427134--

请帮我解决这个问题。谢谢。

【问题讨论】:

contentType: false!? 是的,在所有示例中我都看到了 contentType: false。 【参考方案1】:

请将您的代码var formData = new FormData(this); 中的一行更改为var formData = new FormData($(this)[0]);,然后检查。

当我们创建 FormData 的实例时,我们传递 form[0] 而不是 form.这意味着实际的表单元素,而不是 jQuery 选择器。

【讨论】:

问题依旧,提交的是id_noticia输入,而不是文件输入。 在事件处理程序中 this 是实际元素,而不是 jQuery 对象。 我正在创建一个带有 js 表单的弹出窗口,所以this 是表单。

以上是关于使用 ajax 提交 multipart/form-data 时,文件为空的主要内容,如果未能解决你的问题,请参考以下文章

ajax上传文件提交时,enctype=multipart/form-data怎么带过去?

工作中如何使用ajax提交form表单,包括ajax文件上传

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

使用iframe实现页面无刷新提交表单