当前位置: 首页 > 面试题库 >

使用Angular2将文件上传到REST API

曾承弼
2023-03-14
问题内容

实际上,我正在使用带有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)方法:

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'));
    */
}

我的Web服务向我返回错误500,并在tomcat日志中显示该错误:http : //pastebin.com/PGdcFUQb

我也尝试过该'Content-Type': undefined方法,但没有成功(在这种情况下,Web服务向我返回415错误。


问题答案:

在最终版本中,这实际上很容易做到。花了我一些时间来解决这个问题,因为我遇到的有关它的大多数信息都已过时。如果其他人为此感到困扰,请在此处发布我的解决方案。

import { Component, ElementRef, Input, ViewChild } from '@angular/core';
import { Http } from '@angular/http';

@Component({
    selector: 'file-upload',
    template: '<input type="file" [multiple]="multiple" #fileInput>'
})
export class FileUploadComponent {
    @Input() multiple: boolean = false;
    @ViewChild('fileInput') inputEl: ElementRef;

    constructor(private http: Http) {}

    upload() {
        let inputEl: HTMLInputElement = this.inputEl.nativeElement;
        let fileCount: number = inputEl.files.length;
        let formData = new FormData();
        if (fileCount > 0) { // a file was selected
            for (let i = 0; i < fileCount; i++) {
                formData.append('file[]', inputEl.files.item(i));
            }
            this.http
                .post('http://your.upload.url', formData)
                // do whatever you do...
                // subscribe to observable to listen for response
        }
    }
}

然后像这样使用它:

<file-upload #fu (change)="fu.upload()" [multiple]="true"></file-upload>

这就是全部。

或者,捕获事件对象并从srcElement获取文件。老实说,不确定是否有任何方法比其他方法更好!

请记住,FormData是IE10 +,因此,如果必须支持IE9,则需要使用polyfill。



 类似资料:
  • 问题内容: 尝试将文件上传到S3存储桶时遇到问题。一切正常,除了我的文件参数似乎不合适。我正在使用Amazon S3 SDK从Node.js上载到S3。 这些是我的路线设置: 这是items.upload()函数: 将param 设置为类似字符串的效果很好。根据doc,param必须获取 (缓冲区,类型数组,Blob,字符串,ReadableStream)对象数据。 但是,上传文件对象失败,并显示

  • 问题内容: 是否可以使用http put方法将本地文件上传到保管箱?我正在上传文件,但没有文件?(“字节”:0) 如何向文件添加内容? 我的代码如下: 我的文件已成功上传,但没有内容?它是空的!该文档对我来说有点困惑:https : //www.dropbox.com/developers/core/docs#files_put 问题答案: @smarx:我正在发送一个空的HTTP PUT请求,最

  • 问题内容: 我试图了解如何使用Node.js在Firebase Storage中上传文件。我的第一次尝试是使用Firebase库: 但是事实证明,Firebase无法从服务器端上传文件,正如在文档中明确指出的那样: Firebase存储不包含在服务器端Firebase npm模块中。相反,您可以使用gcloud Node.js客户端。 在代码中,您可以使用以下方式访问存储分区: 我们可以在没有Go

  • 我的upload.js文件包含以下代码: 它通过终端工作,但我如何调用它在表单提交按钮点击或只是从不同的文件? 当我尝试的时候,它给我: 无法读取未定义的属性“prototype” 我对NodeJs还很陌生,我真的不知道该怎么做。 Google文档对我一点帮助都没有:/

  • 我在dropbox示例中没有看到任何有用的上传。 你能帮帮我吗?我在用Angularjs。

  • 我正在尝试复制一个邮递员放置请求,其中它正在代码给出的S3位置上传csv文件。 网址就像https://us-east-1-e9qpbo283.s3.amazonaws.com/bulk-bucket/a4894e7b-7e42-4fcc-9f84-e7n00db6d581/input/file 查询参数为