美文网首页Ionic2开发
Ionic2实战-图片上传功能开发

Ionic2实战-图片上传功能开发

作者: 逃离火星 | 来源:发表于2018-03-29 08:34 被阅读326次

前言

本模块主要实现了通过APP页面向后端上传图片文件的功能,需要前后端配合完成,工作量大概各占了一半吧。

实现思路为首先前端上传图片文件流给后台,后端拿到图片文件以后直接保存在七牛云存储上,七牛会生成一个图片的url,后端将此url返回给前端,前端在提交整个表单的时候带着该url,url即代表该文件。

步骤

1、定义文件上传工具类fileUpload.service.ts

import {Injectable} from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/share';
import {Helper} from "./helper.service";


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

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

private progressObserver: any;

  imageUploadAPI: string = this.helper.getAPP('imageUtil/uploadImage');

constructor (private helper: Helper) {
    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("file", files[i], files[i].name);
        }

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

        FileUploadService.setUploadUpdateInterval(500);

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

            if (this.progressObserver) {
                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);
    }
}

2、需要上传文件的页面添加input file代码

<button ion-button outline item-end icon-left>
        选择图片
        <input class="input-img" #inputReportImg type="file" (change)="uploadImg($event)" accept="image/*">
</button>

3、ts文件内的uploadImg函数

uploadImg(event) {
    let files = event.srcElement.files;

    this.heyApp.fileUploadService.upload(this.heyApp.fileUploadService.imageUploadAPI, files)
      .then(data => {
        this.factory.factoryImage = data;
        this.heyApp.utilityComp.dismissLoading();
      }, () => {
        this.heyApp.utilityComp.dismissLoading();
      });
  }

最后

这里省略了导入上传文件工具类fileUpload.service.ts的过程,如果有不清楚的可以去看我GitHub里面的完整项目。

相关文章

网友评论

  • 7b53d167ba46:方便说一下你的GitHub的地址吗,江湖救急
    7b53d167ba46:@逃离火星 还有请问你的app.service里面的moment模块是自己下载的吗,找不到啊
    7b53d167ba46:@逃离火星 终于找到了,请问可以做那种上传身份证正反面的效果吗?就是APP里面那种身份认证请上传身份证的效果
    逃离火星:@花亦花雾非雾 https://www.jianshu.com/p/d087eba81eb0 这篇文章里面有
  • 神豪VS勇士赢:楼主你这个选择图片上传的时候可以上传多个图片么
    神豪VS勇士赢:@逃离火星 还有想问楼主的 我想控制选择图片的个数 这个需要在哪里进行设置呢 比如说 控制选择相册图片的一张或者 多张
    神豪VS勇士赢:@逃离火星 可以的 我试试 正好最近写的一个 angular的项目需要图片上传
    逃离火星:@神豪VS勇士赢 可以
  • IT人故事会:赞,找了好久才找到!

本文标题:Ionic2实战-图片上传功能开发

本文链接:https://www.haomeiwen.com/subject/yvkpcftx.html