实际上,我正在使用一个用 Angular 2 编码的接口开发一个 Spring REST API。
我的问题是我无法使用 Angular 2 上传文件。
我在 java 中的 Webresources 是:
@RequestMapping(method = RequestMethod.POST, value = "/upload")
public String handleFileUpload(@RequestParam MultipartFile file) {
//Dosomething
}
当我通过带有 Auth 标头等的 URL 请求调用它时,它工作正常……(使用 Chrome 的 Advanced Rest Client 扩展)
证明:(在那种情况下一切正常)
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
Spring配置文件和Pom依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2</version>
</dependency>
但是当我尝试用网络表单做同样的事情时:
<input type="file" #files (change)="change(files)"/>
<pre>{{fileContents$|async}}</pre>
使用(更改)方法:
change(file) {
let formData = new FormData();
formData.append("file", file);
console.log(formData);
let headers = new Headers({
'Authorization': 'Bearer ' + this.token,
'Content-Type': 'multipart/form-data'
});
this.http.post(this.url, formData, {headers}).map(res => res.json()).subscribe((data) => console.log(data));
/*
Observable.fromPromise(fetch(this.url,
{method: 'post', body: formData},
{headers: this.headers}
)).subscribe(()=>console.log('done'));
*/
}
我的网络服务返回错误 500,在 tomcat 日志中:http: //pastebin.com/PGdcFUQb
我也尝试了 'Content-Type': undefined
方法但没有成功(在这种情况下,Web 服务返回 415 错误。
有人可以帮我弄清楚问题出在哪里吗?
问题已解决,稍后我将用我的代码更新该问题 :) 但是,看看它运行良好的 plunker。谢谢。
原文由 Slater 发布,翻译遵循 CC BY-SA 4.0 许可协议
这在最终版本中实际上很容易做到。我花了一些时间来思考它,因为我遇到的大多数关于它的信息都已经过时了。在这里发布我的解决方案以防其他人为此苦苦挣扎。
然后像这样使用它:
这真的就是它的全部。
或者,捕获事件对象并从 srcElement 获取文件。老实说,不确定是否有任何方法比另一种更好!
请记住 FormData 是 IE10+,所以如果你必须支持 IE9,你将需要一个 polyfill。
更新时间 2017-01-07
更新的代码能够处理多个文件的上传。此外,我的原始答案缺少有关 FormData 的相当关键的一点(因为我将实际的上传逻辑移动到我自己的应用程序中的单独服务,我在那里处理它)。