使用 Angular2 将文件上传到 REST API

2023-12-05

实际上,我正在开发一个 Spring REST API,其接口是用 Angular 2 编码的。

我的问题是我无法使用 Angular 2 上传文件。

我的java网络资源是:

@RequestMapping(method = RequestMethod.POST, value = "/upload")
public String handleFileUpload(@RequestParam MultipartFile file) {
    //Dosomething 
}

当我通过带有 Auth 标头等的 URL 请求调用它时,它工作得很好...... (带有适用于 Chrome 的高级 Rest 客户端扩展)

证明:(在这种情况下一切正常)

enter image description here I added the

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

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

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

有人可以帮我找出问题所在吗?

问题解决了,我稍后会用我的代码更新这个问题:)但是,看看这个 plunker,它工作得很好。 谢谢。


这实际上在最终版本中很容易做到。我花了一段时间才弄清楚它,因为我遇到的大多数有关它的信息都已经过时了。在这里发布我的解决方案,以防其他人遇到这个问题。

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。

更新2017-01-07

更新了代码以能够处理多个文件的上传。另外,我最初的答案缺少有关 FormData 的相当重要的一点(因为我将实际的上传逻辑移至我自己的应用程序中的单独服务中,我在那里处理它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Angular2 将文件上传到 REST API 的相关文章

随机推荐

  • 有没有办法进行内联多值比较?

    我什至觉得问这个问题很愚蠢 因为这看起来很微不足道 但我的大脑却让我失望了 如果我有以下内容 let a b c 1 1 1 有没有一种优雅的方法来确定 a b 和 c 是否都具有相同的值 就像是 let result a b c 这会失败
  • python中如何检查两个字符串是否有交集?

    例如 a abcdefg b krtol 它们没有交集 c hflsfjg 则a和c有交集 检查这个最简单的方法是什么 只需要一个 True 或 False 结果 def hasIntersection a b return not set
  • 使用powershell登录后如何从网站获取表数据?

    我的公司希望我从他们的内部网站获取数据 对其进行组织 然后将其发送到数据库 数据显示在您在站点内导航到的表格上 我想将这些字段提取到文件或内存中以进行进一步处理 到目前为止 我可以通过获取提交登录按钮的 ID 并传递我的用户名 密码来在 p
  • ffmpeg通过python子进程无法找到相机

    这里有一个奇怪的问题 我使用这个命令通过 ffmpeg 捕获我的网络摄像头 通过 Windows 上的 cmd ffmpeg y t 300 rtbufsize 1024M f dshow i video Lenovo EasyCamera
  • 视图需要相互依赖的逻辑:没有模型是否可行?

    我正在尝试编写一些 Oracle 11g SQL 但遇到了一些先有鸡还是先有蛋的问题 我正在寻找类似电子表格的行为 我找到了一个使用 Oracle 的解决方案MODEL条款 但性能并不好 所以我想知道是否 非MODEL 解决方案在技术上甚至
  • 在 django 项目中导入应用程序

    我在 django 项目中的另一个应用程序中导入应用程序时遇到问题 我知道有几个关于这个主题的问题 asnwsers 相信我 我读了很多 甚至还有一些关于 python import 的 这是我的项目树 我将放置真实的文件夹名称 was f
  • 将 URL 变量传递到 xsl 中

    是否可以将 URL 变量传递到 xsl xml 中 例如 http www somedomain com index aspx myVar test myVar2 anotherTest 我希望能够在 xsl 文件的逻辑中使用 myVar
  • 在 Nifi 中从 Avro Schema 创建 Postgresql 表

    使用 InferAvroSchema 我获得了文件的 Avro 架构 我想使用此 Avro 架构在 PostregSql 中创建一个表 我必须使用哪个处理器 我使用 GetFile gt InferAvroSchema gt 我想从此架构创
  • ItemsControl 调整大小时边框消失(使用“stretchpanel”)

    昨天我问如何让 ItemsControl 使其子项均匀分布在可用空间中 在愉快地阅读答案后 我写了 实际上是复制并调整了它 我自己的 stretchpanel 它正是我想要的 然而 我的孩子应该在右侧有一个边框 只要孩子比其内容大 它就可以
  • 与 python pandas 中的melt相反

    我不知道如何在 python 中使用 Pandas 进行 反向熔化 这是我的起始数据 label type value 0 x a 1 1 x b 2 2 x c 3 3 y a 4 4 y b 5 5 y c 6 6 z a 7 7 z
  • 如何解决 AMD 路径冲突?

    我正在尝试使用Esri ArcGis JavaScript API 其加载方式为Dojo using dojo require 我有一个现有的模块化AMD requirejs我需要将此代码集成到其中的 Typescript 应用程序 在初始
  • 如何获取点击“赞”按钮的用户的 Facebook ID?

    有没有办法获取在我自己的网站上点击社交插件的 赞 按钮的用户的 Facebook ID 尽管我花了一整天的时间寻找它 但我找不到任何方法 据我所知 您不可能知道谁点击了 喜欢 按钮 但是如果用户通过您的网站登录 Facebook 意味着您编
  • Spring-React frontend-maven-plugin 不工作

    我正在关注的文档是https spring io guides tutorials react and spring data rest 构建一个使用 Spring 的 React 应用程序 spring 部分很好 直到到达建议使用插件安装
  • Android 回收器视图中的水平和垂直滚动

    我有一个要求 我需要在回收器视图中进行水平滚动和垂直滚动 它基于来自服务器的数据类型 如果服务器的响应将第一个元素作为数组 我需要将其放在水平滚动列表中 如果第二个元素是单个对象 那么我需要将其显示在卡片中 同样 顺序会发生变化 并应反映在
  • Excel VBA 项目未关闭

    我有一个 COM 插件 在其中处理 Excel 事件 我点击Alt F11查看与Excel相关的VBA项目 但是 当我关闭工作簿时 项目资源管理器中的 Excel VBA 项目也没有关闭 当我的 COM 插件未安装时 它会正常关闭 发生了什
  • .NET MVC 4 JSON Post/Put Web.config 中的字符限制

    我使用 PUT 动词将 JSON 发送到 MVC 控制器 当我达到某个限制时 我会收到 500 错误 如果我缩小发送的 JSON 那么它发送得很好 有谁知道 web config 中的配置允许将更大量的 JSON 传递到我的应用程序吗 答案
  • Power Query - 从单列到整个表的数据转换

    我有一个要求 我有一张这样的桌子 实际表有 2 列 Column1 Column2 ColAValue ColBValue New Row ColCValue Above Row ColCValue2 Above Row ColDValue
  • 我们可以在EF中进行交叉连接吗?

    所以基本上我回来时问了这个问题 查询包含对不同数据上下文中定义的项目的引用 但这次我是在 EF 中进行的 EF是否支持两个表之间的交叉连接 您无法在不同的数据上下文之间进行连接 您必须使用 linq objects 进行连接 var cro
  • 在 JWASM/MASM 中 - pshufw 产生错误 A2030:当前 CPU 模式下不接受指令或寄存器

    我有以下汇编程序 在编译时出现错误 686 mmx model flat c code MmxAdd proc push ebp mov ebp esp mov eax ebp 24 cmp eax AddOpTableCount jae
  • 使用 Angular2 将文件上传到 REST API

    实际上 我正在开发一个 Spring REST API 其接口是用 Angular 2 编码的 我的问题是我无法使用 Angular 2 上传文件 我的java网络资源是 RequestMapping method RequestMetho