【问题标题】:Can't get the hang of FormData and ngResource无法掌握 FormData 和 ngResource 的窍门
【发布时间】:2018-04-25 15:51:32
【问题描述】:

我正在尝试通过 AngularJS 1.6.4 将文件作为 MIME/multipart 上传,然后将其发送到 ASP.Net WebAPI。我引用了一个使用版本 1.3.1 的示例项目,其中以下工作:

 var formData = new FormData(); 

 angular.forEach(photos, function (photo) { 
      formData.append(photo.name, photo); 
 }); 

 return photoManagerClient.save(formData) 
                                    .$promise 
                                    .then(function (result) { 
                                        if (result && result.photos) { 
                                            result.photos.forEach(function (photo) { 
                                                if (!photoExists(photo.name)) { 
                                                    service.photos.push(photo); 
                                                } 
                                            }); 
                                        } 
.
.
.
function photoManagerClient($resource) { 
    return $resource("api/photo/:fileName", 
            { id: "@fileName" }, 
            { 
                'save': { method: 'POST', transformRequest: angular.identity, headers: { 'Content-Type': undefined } }
            }); 
} 

我无法使用 1.6.4 让它工作,我找不到原因。 MIME/multipart 标头在 1.6.4 中不存在,所以我一直在直接从内容中读取字节,但我无法以这种方式获取文件名。

很明显,FormData 实际上正在通过,因为我可以访问请求中的字节。

我已经看到其他答案/文档建议添加一个 transformRequest 函数,否则 Content-Type 默认为 JSON。但是当我这样做时,该代码不会执行,因此服务器端的请求中缺少该文件。

我有点迷路了,希望有人可以指出 1.3.1 和 1.6.4 之间的这种差异有一个明显的原因。

编辑以添加请求标头:

接受:应用程序/json、文本/纯文本、*/*
接受编码:gzip、deflate、br
接受语言:en-US,en;q=0.9
连接:保持活动
内容长度:31761
内容类型:application/json;charset=utf-8
主机:本地主机:40981
来源:http://localhost:51609
推荐人:http://localhost:51609/app/
用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3266.0 Safari/537.36

【问题讨论】:

    标签: angularjs ngresource


    【解决方案1】:

    在开发工具中检查header requestNetwork,也许它有用。 如果不起作用,请粘贴header reuqest 或许可以提供更多信息。

    【讨论】:

    • 在编辑中添加。它似乎默认为 json,但这似乎是 1.3.1 中不存在的新行为,我还没有确定一种工作方式来覆盖它。
    • @barthooper Content-Type:application/json;charset=utf-8 Content-type 仍在 requeset.header 中,所以你应该删除它。
    • 谢谢。我尝试将 Content-Type 设置为 application/x-www-form-urlencoded 而不是 undefined,但它仍然恢复为 json。我确信这不是处理它的方法,但是我遇到的几乎所有其他答案都将它设置为未定义。
    • 也许您可以使用$http 而不是$resource$http可以设置header,docs.angularjs.org/api/ng/service/$http
    • 是的,就是这张票。我什至不需要设置标题。显然,关键是直接在 $http 帖子中发送 FormData。
    猜你喜欢
    • 2020-06-25
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2010-10-03
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多