angular2的文件上传

本文详细介绍如何使用ng2-file-upload库实现Angular2项目中的文件上传功能,包括安装配置、使用方法及核心组件FileUploader和FileItem的深入解析。

转载自:http://www.jianshu.com/p/0741186f60ab

可以参考:http://blog.youkuaiyun.com/baidu_28660921/article/details/74779584

Angular2中有两个比较好用的上传文件的第三方库,一个是ng2-file-upload,一个是ng2-uploaderng2-uploader是一个轻便的上传文件的支持库,功能较弱,而ng2-file-upload是一个功能比较全面的上传文件的支持库。这里主要介绍一下ng2-file-upload的使用。

以下以Mac OS操作系统介绍。


1. 安装

使用npm安装即可。在项目中打开“终端”,运行命令:

sudo npm install ng2-file-upload --save

如果是以systemjs的方式打包,安装完成后需要打开systemjs.config.js文件,在System.configmap字段中的最后一行输入以下字段:

'ng2-file-upload':            'npm:ng2-file-upload'

System.configpackages字段中的最后一行输入:

'ng2-file-upload': {    
    main: 'index.js',    
    defaultExtension: 'js'
}

之后便可以在项目中使用了。


2. 使用

在需要用到的模块中引用模块:

import { CommonModule }     from '@angular/common';
import { FileUploadModule } from 'ng2-file-upload';

然后在@NgModuleimports字段中引用CommonModuleFileUploadModule

在对应需要使用的组件内引用:

import { FileUploader } from 'ng2-file-upload';

初始化FileUploader

uploader:FileUploader = new FileUploader({    
    url: "http://www.download.com:80/uploadFile",   
    method: "POST",    
    itemAlias: "uploadedfile"
});

初始化FileUploader需要传入FileUploaderOptions类型的参数:

参数名参数类型是否是可选值参数说明
allowedMimeTypeArray<string>可选值 
allowedFileTypeArray<string>可选值允许上传的文件类型
autoUploadboolean可选值是否自动上传
isHTML5boolean可选值是否是HTML5
filtersArray<FilterFunction>可选值 
headersArray<Headers>可选值上传文件的请求头参数
methodstring可选值上传文件的方式
authTokenstring可选值auth验证的token
maxFileSizenumber可选值最大可上传文件的大小
queueLimitnumber可选值 
removeAfterUploadboolean可选值是否在上传完成后从队列中移除
urlstring可选值上传地址
disableMultipartboolean可选值 
itemAliasstring可选值文件标记/别名
authTokenHeaderstring可选值auth验证token的请求头
2.1 选择文件

在组件对应的HTML模版中设置input标签:

<input type="file" ng2FileSelect [uploader]="uploader" (change)="selectedFileOnChanged($event)" />

在组件.ts文件中设置声明函数:

selectedFileOnChanged() {
    // 这里是文件选择完成后的操作处理
}

选择文件默认支持选择单个文件,如需支持文件多选,请在标签中添加multiple属性,即:

<input type="file" ng2FileSelect [uploader]="uploader" (change)="selectedFileOnChanged($event)" multiple />
2.2 拖拽文件

拖拽文件默认支持多文件拖拽。
对块级元素进行设置(这里以div标签为例):

<div class="beforeDrop" ng2FileDrop [ngClass]="{dropping: isDropZoneOver}" (fileOver)="fileOverBase($event)" (onFileDrop)="fileDropOver($event)" [uploader]="uploader"><div>

在组件.ts文件中设置声明函数:

fileOverBase(event) {
    // 拖拽状态改变的回调函数
}
fileDropOver(event) {
    // 文件拖拽完成的回调函数
}
2.3 文件上传

FileUploader有个数组类型的属性queue,里面是所有拖拽的和选择的文件,只要操作这个属性便可以进行文件上传。

this.uploader.queue[0].onSuccess = (response, status, headers) => {    
    // 上传文件成功   
    if (status == 200) {
        // 上传文件后获取服务器返回的数据
        let tempRes = JSON.parse(response);        
    }else {            
        // 上传文件后获取服务器返回的数据错误        
    }
};
this.uploader.queue[0].upload(); // 开始上传

3. FileUploader详解

FileUploader是ng2-file-upload最主要的部件,里面包含了所有对文件的处理。

3.1 属性详解
  • isUploading:[boolean] 是否正在上传文件中。
  • queue:[array<FileItem>] 已经拖拽或选择的所有文件。
  • progress:[number] 所有的上传文件的整体进度。
  • options:[FileUploaderOptions] 上传文件的配置信息,前面已经介绍过。
3.2 方法详解
  • setOptions(options: FileUploaderOptions): void;
    设置上传文件的配置信息。
  • addToQueue(files: File[], options?: FileUploaderOptions, filters?: FilterFunction[] | string): void;
    手动添加文件到FileUploader的上传队列中。
  • removeFromQueue(value: FileItem): void;
    FileUploader的上传队列中移除指定文件。
  • clearQueue(): void;
    清除FileUploader上传队列中的所有文件。
  • uploadItem(value: FileItem): void;
    上传指定文件。
  • cancelItem(value: FileItem): void;
    取消指定文件的上传。
  • uploadAll(): void;
    上传FileUploader的上传队列中的所有文件。
  • cancelAll(): void;
    取消FileUploader的上传队列中的所有文件的上传。
  • isFile(value: any): boolean;
    判断是否是文件。
  • getIndexOfItem(value: any): number;
    获取文件在FileUploader上传队列中的位置。
  • getNotUploadedItems(): Array<any>;
    获取FileUploader上传队列中的所有未上传的文件。
  • getReadyItems(): Array<any>;
    获取FileUploader上传队列中的所有准备上传的文件。
  • destroy(): void;
    销毁FileUploader实例。
3.3 监听详解
  • onAfterAddingAll(fileItems: any): any;
    添加完所有文件之后的回调
    返回:
    • fileItems - 添加的文件的数组
  • onBuildItemForm(fileItem: FileItem, form: any): any;
    创建文件之后的回调
    返回:
    • fileItem - 创建的文件
    • form - 添加的方式
  • onAfterAddingFile(fileItem: FileItem): any;
    添加一个文件之后的回调
    返回:
    • fileItem - 添加的文件
  • onWhenAddingFileFailed(item: FileLikeObject, filter: any, options: any): any;
    添加文件失败的回调
    返回:
    • item -
    • filter -
    • options -
  • onBeforeUploadItem(fileItem: FileItem): any;
    要上传文件之前的回调
    返回:
    • fileItem - 将要上传的文件
  • onProgressItem(fileItem: FileItem, progress: any): any;
    上传文件的进度(开始上传后调用非常频繁)
    返回:
    • fileItem - 正在上传的文件
    • progress - 该文件的上传进度
  • onProgressAll(progress: any): any;
    整体的上传进度的回调(开始上传后调用非常频繁)
    返回:
    • progress - 整体的上传文件的进度
  • onSuccessItem(item: FileItem, response: string, status: number, headers: ParsedResponseHeaders): any;
    上传一个文件成功的回调
    返回:
    • item - 上传成功的文件
    • response - 上传成功后服务器的返回
    • status - 状态码
    • headers - 上传成功后服务器的返回的返回头
  • onErrorItem(item: FileItem, response: string, status: number, headers: ParsedResponseHeaders): any;
    上传一个文件错误的回调
    返回:
    • item - 上传错误的文件
    • response - 返回的错误
    • status - 状态码
    • headers - 返回的错误返回头
  • onCancelItem(item: FileItem, response: string, status: number, headers: ParsedResponseHeaders): any;
    取消上传一个文件的回调
    返回:
    • item - 取消上传的文件
    • response - 取消的返回信息
    • status - 状态码
    • headers - 取消的返回信息的返回头
  • onCompleteItem(item: FileItem, response: string, status: number, headers: ParsedResponseHeaders): any;
    完成上传一个文件的回调
    返回:
    • item - 上传成功的文件
    • response - 上传成功后服务器的返回
    • status - 状态码
    • headers - 上传成功后服务器的返回的返回头
  • onCompleteAll(): any;
    完成上传所有文件的回调

4. FileItem详解

FileItemFileUploaderqueue属性的元素类型,在FileUploader中存储的文件的基本类型。

4.1 属性详解
  • alias [string] : 上传的标志/别名。
  • url [string] : 地址。
  • method [string] : 上传的方法。
  • headers [any] : 上传的头部参数。
  • withCredentials: [boolean] : 是否使用证书。
  • formData [any] : 格式化数据?
  • isReady [boolean] : 是否准备上传(是否可以上传)。
  • isUploading [boolean] : 是否正在上传。
  • isUploaded [boolean] : 是否已经上传过。
  • isSuccess [boolean] : 是否上传成功。
  • isCancel [boolean] : 是否取消上传。
  • isError [boolean] : 是否上传错误。
  • progress [number] : 上传进度。
  • index [number] : 在队列中的位置。
4.2 方法详解
  • upload(): void;
    开始上传这个文件。
  • cancel(): void;
    取消上传这个文件。
  • remove(): void;
    将这个文件从上传队列中移除。
4.3 监听详解
  • onBeforeUpload(): void;
    开始上传之前的回调函数。
  • onBuildForm(form: any): any;
    创建文件的回调函数。
    返回:
    • form - 文件来源。
  • onProgress(progress: number): any;
    上传文件的进度回调函数。
    返回:
    • progress - 上传文件的进度。
  • onSuccess(response: string, status: number, headers: ParsedResponseHeaders): any;
    上传文件成功的回调函数。
    返回:
    • response - 成功后的回调数据
    • status - 状态码
    • headers - 回调数据的返回头
  • onError(response: string, status: number, headers: ParsedResponseHeaders): any;
    上传文件错误的回调函数。
  • onCancel(response: string, status: number, headers: ParsedResponseHeaders): any;
    取消上传的回调函数。
  • onComplete(response: string, status: number, headers: ParsedResponseHeaders): any;
    上传文件完成的回调函数。


作者:Shmily落墨
链接:http://www.jianshu.com/p/0741186f60ab
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Angular 中实现大文件上传功能,通常需要采用分片上传(Chunked Upload)的方式,以提高上传的稳定性和效率。以下是几种实现方法及技术细节: ### 使用 ng-flow 实现大文件上传 `ng-flow` 是一个专为 Angular.js 项目设计的高效文件上传插件,适用于需要处理大文件或多文件上传的场景。它具备以下优势: - **轻量级与独立性**:不依赖第三方 JS 库,减少项目依赖,简化部署。 - **高度可定制**:通过 Angular 指令,可以轻松定制上传按钮、文件预览等界面元素。 - **支持多种安装方式**:可以通过 NPM、Bower 等方式安装,方便集成到现有项目中。 - **事件驱动**:提供丰富的事件接口,便于开发者根据上传状态进行相应处理。 - **兼容性**:支持旧版浏览器,确保广泛的设备兼容性[^1]。 ### 使用原生 HTML5 文件 API 实现分片上传 通过 Angular 中的 `FileReader` 和 `XMLHttpRequest` 可以手动实现分片上传逻辑。这种方式适合需要高度自定义的场景,具体步骤如下: 1. **选择文件**:使用 `<input type="file">` 获取用户选择的文件。 2. **切片处理**:利用 `File.slice()` 方法将大文件分割成多个小块(chunk)。 3. **逐片上传**:使用 `XMLHttpRequest` 将每个切片上传到服务器。 4. **服务器端合并**:服务器接收所有切片后,将其合并为完整文件。 示例代码如下: ```typescript // 文件选择事件 inputFileChange(event: Event): void { const input = event.target as HTMLInputElement; if (input.files && input.files.length > 0) { const file = input.files[0]; const chunkSize = 1024 * 1024; // 每个切片大小为1MB let start = 0; let end = chunkSize; let index = 0; while (start < file.size) { const chunk = file.slice(start, end); this.uploadChunk(chunk, index, file.name); start = end; end = Math.min(end + chunkSize, file.size); index++; } } } // 分片上传函数 uploadChunk(chunk: Blob, index: number, filename: string): void { const formData = new FormData(); formData.append('file', chunk, `${filename}.part${index}`); const xhr = new XMLHttpRequest(); xhr.open('POST', '/api/upload-chunk', true); xhr.onload = () => { if (xhr.status === 200) { console.log(`Chunk ${index} uploaded successfully.`); } }; xhr.send(formData); } ``` ### 使用第三方库:如 `ng2-file-upload` `ng2-file-upload` 是一个专为 Angular 2+ 设计的文件上传组件,支持大文件上传、进度条显示、上传取消等功能。它可以通过简单的配置实现高效的上传流程,并且支持多种后端框架(如 Node.js + Express)[^2]。 ### 服务器端处理 服务器端需要接收所有分片,并在上传完成后合并这些分片。例如,在 Node.js 中可以使用 `fs.appendFile()` 方法将每个分片追加到临时文件中,最终合并为完整文件。完成后,清理临时文件并返回上传成功状态。 ### 前端 UI 交互 为了提升用户体验,可以结合 Angular 的 UI 组件(如 `nz-progress`)显示上传进度条,并提供“取消上传”功能,让用户能够控制上传过程[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值