Angular - POST 上传的文件

2023-11-25

我在用着Angular, 打字稿将文件与 JSON 数据一起发送到服务器。

下面是我的代码:

import {Component, View, NgFor, FORM_DIRECTIVES, FormBuilder, ControlGroup} from 'angular2/angular2';
import {Http, Response, Headers} from 'http/http';


@Component({ selector: 'file-upload' })
@View({
directives: [FORM_DIRECTIVES],
template: `
<h3>File Upload</h3>

<div>
     Select file:
    <input type="file" (change)="changeListener($event)">
</div>

`
})
export class FileUploadCmp {

public file: File;
public url: string;
headers: Headers;


constructor(public http: Http) {
    console.log('file upload Initialized');
    //set the header as multipart        
    this.headers = new Headers();
    this.headers.set('Content-Type', 'multipart/form-data');
    this.url = 'http://localhost:8080/test';
}

//onChange file listener
changeListener($event): void {
    this.postFile($event.target);
}

//send post file to server 
postFile(inputValue: any): void {

    var formData = new FormData();
    formData.append("name", "Name");
    formData.append("file",  inputValue.files[0]);

    this.http.post(this.url +,
      formData ,
        {
            headers: this.headers

        });
}

}

我怎样才能改变formDataString 并将其发送到服务器?我记得在AngularJS(v1) 你会使用transformRequest.


看看我的代码,但要注意。我使用 async/await,因为最新的 Chrome beta 可以读取任何 es6 代码,这些代码通过 TypeScript 进行编译。因此,您必须将 asyns/await 替换为.then().

输入更改处理程序:

/**
 * @param fileInput
 */
public psdTemplateSelectionHandler (fileInput: any){
    let FileList: FileList = fileInput.target.files;

    for (let i = 0, length = FileList.length; i < length; i++) {
        this.psdTemplates.push(FileList.item(i));
    }

    this.progressBarVisibility = true;
}

提交处理程序:

public async psdTemplateUploadHandler (): Promise<any> {
    let result: any;

    if (!this.psdTemplates.length) {
        return;
    }

    this.isSubmitted = true;

    this.fileUploadService.getObserver()
        .subscribe(progress => {
            this.uploadProgress = progress;
        });

    try {
        result = await this.fileUploadService.upload(this.uploadRoute, this.psdTemplates);
    } catch (error) {
        document.write(error)
    }

    if (!result['images']) {
        return;
    }

    this.saveUploadedTemplatesData(result['images']);
    this.redirectService.redirect(this.redirectRoute);
}

文件上传服务。该服务还将上传进度存储在progress$属性中,在其他地方,您可以订阅它并每500毫秒获取新值。

import { Component } from 'angular2/core';
import { Injectable } from 'angular2/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/share';

@Injectable()
export class FileUploadService {
/**
 * @param Observable<number>
 */
private progress$: Observable<number>;

/**
 * @type {number}
 */
private progress: number = 0;

private progressObserver: any;

constructor () {
    this.progress$ = new Observable(observer => {
        this.progressObserver = observer
    });
}

/**
 * @returns {Observable<number>}
 */
public getObserver (): Observable<number> {
    return this.progress$;
}

/**
 * Upload files through XMLHttpRequest
 *
 * @param url
 * @param files
 * @returns {Promise<T>}
 */
public upload (url: string, files: File[]): Promise<any> {
    return new Promise((resolve, reject) => {
        let formData: FormData = new FormData(),
            xhr: XMLHttpRequest = new XMLHttpRequest();

        for (let i = 0; i < files.length; i++) {
            formData.append("uploads[]", files[i], files[i].name);
        }

        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    resolve(JSON.parse(xhr.response));
                } else {
                    reject(xhr.response);
                }
            }
        };

        FileUploadService.setUploadUpdateInterval(500);

        xhr.upload.onprogress = (event) => {
            this.progress = Math.round(event.loaded / event.total * 100);

            this.progressObserver.next(this.progress);
        };

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

/**
 * Set interval for frequency with which Observable inside Promise will share data with subscribers.
 *
 * @param interval
 */
private static setUploadUpdateInterval (interval: number): void {
    setInterval(() => {}, interval);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular - POST 上传的文件 的相关文章

随机推荐

  • 如何在 bash 脚本中使用 bash 配置文件中定义的函数?

    我的 bash profile 中有一个投影函数 现在我尝试从 bash 脚本调用此函数 但出现未找到错误 如何使投影函数对 bash 脚本可见 您必须导出该函数 export f foo ref
  • Firebase 挂起的动态链接不起作用

    根据 Firebase 动态链接文档 即使未安装应用程序 如果用户在设备上打开链接 Appstore 上的应用程序页面也会打开 并且一旦安装应用程序 应用程序就会在首次启动时处理该链接 经过一番调查后 我发现 Firebase 有一种称为
  • “在 MATLAB 路径中隐藏它”是什么意思?如何在文件中做到这一点?

    我需要在运行 unitTester 文件之前始终执行此操作 我不明白为什么需要这样做 这是什么意思 为什么是 Add to Path gt Selected Folders and Subfolders 不够 Update This her
  • 如何定位直接文本而不是标签内的文本?

    有没有办法只定位直接文本 h1 Tag 这是我想做的事情的一个例子 h1 I want to select this text with a css selector h1 h1
  • Swift 中的 UTTypeCreatePreferredIdentifierForTag 和 CFStringRef

    import Foundation import MobileCoreServices func checkFileExtension fileName NSString println fileName var fileExtension
  • RecyclerView notificationItemRangeChanged 不显示新数据

    我遇到了一个问题RecyclerView Adapter关于notifyItemRangeChanged 看来如果Adapter认为它的大小为0从上次通话到getItemCount 然后我打电话Adapter notifyItemRange
  • git 拒绝在没有代理的情况下连接

    我在 Windows 环境中使用 Linux 系统 为了使用 NT 代理服务器进行身份验证 我进行了设置cntlm并配置系统程序以通过设置使用它http proxy环境变量中的 etc environment file 现在我想删除此代理设
  • 在 Pyspark Dataframe 上透视字符串列

    我有一个像这样的简单数据框 rdd sc parallelize 0 A 223 201603 PORT 0 A 22 201602 PORT 0 A 422 201601 DOCK 1 B 3213 201602 DOCK 1 B 321
  • 如何在 swift 中使用 .a 静态库?

    我想在 swift 中使用我的 webrtc a 静态库 你能帮忙吗 我读到你不能在 swift 中使用静态库 是真的吗 你问的这个问题解决了吗 我今天也遇到这个问题了 一会儿就解决了 如果您尚未解决此问题 您可以尝试以下步骤 p s 这两
  • 如何验证国际化域名[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想验证 php 中的域名 url 该域名可能采用国际化域名格式 如希腊语 域名 http 他们有什么方法可以使用正则表达式来验证它吗 这是一个所谓的国际化域名 支持 IDN 域
  • 通过浏览器操作/图标禁用/启用 Chrome 扩展

    我正在开发的 chrome 扩展将内容脚本和 CSS 插入到网站的每个页面上 但是 用户可能有一个或多个页面 他或她不希望扩展程序在其上运行 因此如果我可以将浏览器操作设置为基本上打开 关闭切换 那就太好了 我想做的是这样的 chrome
  • 将 React Redux 与 next.js 结合使用

    我尝试将 Redux 与next js 启动器项目和我安装的next redux wrapper在该项目中 但我不确定该项目中的根文件在哪里 我尝试按照显示的教程进行操作next redux 包装器但没有成功 没变化 请帮助我如何将 Red
  • 如何在 iOS 上重置沙盒应用内购买以进行测试?

    我做了一个沙盒 iTunes 用户 购买了一个项目 这有效 但我的显示该项目的代码中存在一些问题 所以我想重新买来测试一下 问题是 我无法清除我的购买 我注销了我的沙盒用户 删除了应用程序并重新安装了它 更改了 iTunes 用户几次 该项
  • 如何使用 Eigen 3 表达“ = <= ”?

    我正在移植一些MATLAB代码到C 使用Eigen 3模板库 我正在寻找这个常见的良好映射MATLAB idiom K gt gt 1 2 3 4 5 lt 3 ans 1 1 1 0 0 因此 比较数组和标量 返回具有相同形状的布尔值数组
  • 用于检查多个值的 jQuery 'if' 条件

    在下面的代码中 是否有更好的方法使用 jQuery 检查条件 if test1 val first value test2 val second value test3 val third value test4 val fourth va
  • “条件调用”在 amd64 上的性能

    当考虑代码关键部分中的条件函数调用时 我发现 gcc 和 clang 都会围绕该调用进行分支 例如 对于以下 诚然微不足道的 代码 int32 t attribute noinline negate int32 t num return n
  • 将 SpriteKit 视图集成到 xib 视图中

    我有一个已经使用 xib 文件创建的视图 现在我想向此视图添加一些小元素 这些元素将使用 SpriteKit 中的一些物理动画 所以现在我需要一个 SKView 是否可以添加 SKView 作为与我的 xib 视图相对应的视图的子视图 我尝
  • Fortran 2018+ 中过时的 DO 循环

    我正在使用可能是在最新版本的 gfortran 之前编写的源代码 我知道 DO END DO 和 CONTINUE 的方式已更改 因此不能共享循环终止 有一个方便的链接here 问题是 我不知道该页面上的解释到底告诉我要做什么 如果我在新脚
  • Tomcat 7 tomcat-users manager-script /deploy 示例

    我正在尝试让管理器 部署在新安装的 Tomcat 7 0 34 上工作 但是当我尝试通过执行 PUT 进行部署时 我不断收到 403http localhost 8080 manager deploy 我还没有在 Tomcat 7 中使用它
  • Angular - POST 上传的文件

    我在用着Angular 打字稿将文件与 JSON 数据一起发送到服务器 下面是我的代码 import Component View NgFor FORM DIRECTIVES FormBuilder ControlGroup from an