在 Observable 中 xhr.send() 之后获取服务器响应

2024-04-02

我实现了一种在 Angular 2 应用程序中发布文件的方法。它基于我找到的解决方案here https://stackoverflow.com/a/35985489/2018084.

由于 Angular 2 本身不支持文件上传,因此解决方案必须利用xhr。这就是工作解决方案的样子:

组件方法:

onSubmit(): void {
    this.inputModuleService.postFile(this.files).subscribe(() => {
        console.log('sent');
    });
}

服务方式:

postFile (files: File[]): Observable<string> {
    var url = this.uploadURL;

    return Observable.create(observer => {
        var formData: FormData = new FormData()
        var xhr: XMLHttpRequest = new XMLHttpRequest();

        formData.append("upload", files[i], files[i].name);

        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    observer.next(JSON.parse(xhr.response));
                    observer.complete();
                } else {
                observer.error(xhr.response);
                }
            }
        };

        xhr.open('POST', url, true);
        xhr.send(formData);
    });
}

我的问题是我不明白如何将响应返回给onSubmit()调用后的方法xhr.send()。 Angular2 以及可观察量和承诺的概念对我来说都是新的。

我怎样才能从这个可观察到的服务器得到响应?


服务器响应提供给成功和错误回调subscribe():

onSubmit(): void {
    this.inputModuleService.postFile(this.files).subscribe(
      response => {
          //response is the server's response, parsed into a javascript object
          console.log('server responded: ', response);
      },
      error => {
          //server response emitted when xhr.status !== 200
          console.error(error);
      }
   );
}

这行:

formData.append("upload", files[i], files[i].name);

会抛出错误,因为i未定义。您复制的代码在循环内包含该行并且i是当前索引。您的代码中并非如此。

您的函数声明:

postFile (files: File[]): Observable<string>

应该改为

postFile (files: File[]): Observable<any>

因为 Observable 返回的是postFile发出对象,而不是字符串。

如果您只想上传一个文件,您还应该更改files: File[] to file: File并在文件中附加:

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

在 Observable 中 xhr.send() 之后获取服务器响应 的相关文章

随机推荐

  • 找不到绳线(-bash:绳线:找不到命令)

    我正在尝试使用 twine 在 pypi 上发布我的第一个 python 包 当然会首先添加 test pypi 我遵循了官方指南https packaging python org tutorials packaging projects
  • Freemarker:从模板文件 (*.ftl) 调用静态 util 方法

    在 Freemarker FTL 文件中 我想调用StringUtils capatilize myString 例如 p You selected selectionString p p StringUtils capatilize se
  • 绘制圆形渐变

    我想绘制一个圆形渐变 如下图所示 我可以轻松管理径向渐变 但我不知道如何做圆形渐变 我正在考虑在一条线上绘制渐变 然后将其转换为圆形 这可能吗 这就是我绘制径向渐变的方法 CGFloat a MIN self frame size widt
  • 使用 codeigniter 403 的 Ajax 请求(禁止)

    我正在尝试使用 Ajax 向 Codeigniter 中的控制器文件发送一个值 但没有成功 我已经搜索过这个问题 现在这个问题在这里被提出了很多次 但仍然找不到解决方案 希望任何人都可以帮助我 谢谢 Js file function sub
  • 在堆栈上为 execve 创建一个 arg 数组

    我想编写一个汇编程序 通过 EXECVE 系统调用 0x3C 使用开关 al 执行程序 bin ls 手册页 man 2 execve 指出该调用需要三个值 int execve const char filename char const
  • 通过 http 拉取大型存储库(大小超过 1GB)失败

    存储库的大小超过 1GB 当我拉到 50 时 出现错误 gt remote Counting objects 23891 done remote Compressing objects gt 100 19980 19980 done fat
  • 如何仅在 log4j 中记录警告

    在 Struts 2 应用程序中 我们使用 log4j 进行日志记录 我只想记录警告 但是当我尝试在 log4j properties 中使用时 log4j rootLogger warn stdout 它也打印错误和致命日志 我只想要警告
  • 如何在 Visual Basic .NET 中从 Internet“读取”XML?

    因此 我正在 Visual Basic 2010 中创建一个程序 它将处理来自 Internet 的大约 120 万个 XML 文件 每个文件的 URL 格式如下 website com xmlfeed action number VARI
  • 从 Android Wear 上的日历获取数据

    我正在查询这样的日历数据 Constructor of the class mCursor context getContentResolver query CalendarContract Events CONTENT URI mColu
  • Axios 未传递 Content-Type 标头

    我在后端运行一个 Odoo 实例 并创建了一个公开 Web 控制器的自定义模块 如下所示 网页控制器 coding utf 8 from odoo import http import odoo from odoo http import
  • Linux/Unix 中是否有与 futex 等效的东西?

    我正在寻找可以用来做的东西polling like select kqueue epoll即不忙轮询 在 C C 中 换句话说 我需要阻塞一个线程 然后在另一个线程中唤醒它尽可能少的开销 A mutex condition variable
  • iOS Playground 中的 NSUserDefaults

    iOS Playgrounds 似乎有一个奇怪的问题NSUserDefaults总是返回nil而不是实际值 在 iOS Playground 中 最后一行错误地返回nil import UIKit let defaults NSUserDe
  • 如何升级现有的 Flutter 应用?

    我有一个半年前构建的现有 Flutter 应用程序 我查了一下pubspec lock 它有这一行 sdks dart gt 2 10 0 110 lt 2 11 0 flutter gt 1 16 0 lt 2 0 0 所以我假设该应用程
  • sql server中事务回滚的机制是什么?

    sql server中事务回滚的机制是什么 数据库中的每个更新都会首先将一个条目写入包含更改描述的日志中 例如 如果您将列值从 A 更新到 B 日志将包含更新记录 类似于 在表 T 中 列 C 已从 A 更改为 B 以通过 id I 的事务
  • 获取ArrayList中重复项的数量

    例如 假设我有一个ArrayList可能包含以下值 x x x y y 现在我想要检索的是x and x我希望能够区分我所拥有的x or y因为实际上 我可以在 ArrayList 中拥有任何对象 并且我必须能够区分它们 我想做的是首先转换
  • 操作 struct tm 中的 tm_mon?

    我无法理解这个程序 即tm mon 1 part 我是 C 语言新手 通常我总是编写自己的小程序来应对我在遵循的课程书中设置的任何挑战 但我不得不咨询其他人来解决这个问题 它是课本和他们的代码 所以不是我的 我不明白为什么 1被添加到tm
  • node.js/MySQL:当我尝试插入数据库时​​,某些字符串编码(表情符号)抛出错误

    我正在运行一个 node js 脚本 该脚本从公共 数据库 它是一个 区块链 中提取数据 然后对其执行一些操作 然后将其插入到 MySQL 数据库中 我已经使用 MySQL 数据库UTF8 general ci编码 绝大多数数据都可以很好地
  • 对于每个循环:仅删除第一个附件

    在使用 for 每个循环复制附件后 我一直尝试删除 Outlook 中的附件 它只是在复制后删除第一个附件 但不会处理第二个附件 它只是下降到 End Sub Private Sub Items ItemAdd ByVal item As
  • 如何在 Laravel Vapor 应用程序中获取 HTTP 请求的 IP?

    我最近将 Laravel 应用程序从服务器移至 Vapor 此应用程序依赖于使用日志记录请求IP地址Request ip 但自从切换到 Vapor 后 所有 IP 都记录为 127 0 0 1 我查看了可信代理文档https laravel
  • 在 Observable 中 xhr.send() 之后获取服务器响应

    我实现了一种在 Angular 2 应用程序中发布文件的方法 它基于我找到的解决方案here https stackoverflow com a 35985489 2018084 由于 Angular 2 本身不支持文件上传 因此解决方案必