Angular6自定義指令實現多圖片上傳預覽

在作移動端開發多時候常常會遇到用戶圖片上傳的需求,有單圖片上傳預覽的需求,也有多圖片上傳預覽的需求。本身剛遇到這個需求的時候有踩到各類個樣到坑。通過多番嘗試,下面將本人成功的一個案例分享出來(公司對外網訪問很是嚴格,因此只能本身重寫一個demo來擺弄,親測可行): javascript

一、先在咱們的項目經過cli命令行建立出咱們要實現上傳文件的組件: css

ng generate component fileReader
複製代碼

file-reader.component.html文件的html代碼以下: html

<label class="preview-btn">瀏覽圖片
      <input type="file" appFileReader (onLoad)="addLoad($event)" multiple style="display:none"/>
    </label>
    <div *ngIf="previewImg.length > 0">
      <img *ngFor="let img of previewImg" src="{{img}}" alt="">
    </div>
    <br>
    <button *ngIf="previewImg.length > 0" (click)="clearPreviewImg()" class="preview-btn">清除圖片</button>
複製代碼

file-reader.component.scss樣式文件對按鈕對樣式稍加美化: java

.preview-btn{
        width: 100px;
        border-radius: 4px;
        height: 36px;
        line-height: 36px;
        background-color: greenyellow;
        color: #fff;
        text-align: center;
        display: block;
        cursor: pointer;
        border: none;
        outline: none;
    }
複製代碼

file-reader.component.ts裏面的代碼以下: 數組

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-file-reader',
  templateUrl: './file-reader.component.html',
  styleUrls: ['./file-reader.component.scss'],
})
export class FileReaderComponent implements OnInit {
  previewImg: Array<string> = [];
  constructor() { }

  ngOnInit() {
  }

  addLoad(e: string) {
    this.previewImg.push(e);
  }

  clearPreviewImg() {
    this.previewImg = [];
  }
}
複製代碼

二、而後經過cli命令建立出咱們要實現上傳預覽功能的自定義指令: angular2

ng generate directive fileReader
複製代碼

建立的文件file-reader.directive.ts邏輯代碼以下,具體的功能代碼也有相應的註釋 app

import { Directive, ElementRef, HostListener, Output, EventEmitter } from '@angular/core';

/** * 圖片選擇轉換成base64 */
@Directive({
  selector: '[appFileReader]'
})
export class FileReaderDirective {

// tslint:disable-next-line: no-output-on-prefix
  @Output()
  onLoad = new EventEmitter();

  constructor(private elementRef: ElementRef) { }
  /** * HostListener給宿主元素添加change事件 * 獲取到的files是一個文件列表,不能直接遍歷,須要先Array.from轉數組類型 */
  @HostListener('change')
  public onChange(): any {
    const files = this.elementRef.nativeElement.files;
    if (files && files.length > 0) {
      Array.from(files).map((item: File, index: number) => {
        const file: File = item;
        const myReader: FileReader = new FileReader();
        /** * onabort 當讀取操做被停止時調用 * onerror 當讀取操做發生錯誤時調用 * onload 當讀取操做成功完成時調用 * onloadend 當讀取操做完成時調用,無論是成功仍是失敗.該處理程序在onload或者onerror以後調用 * onloadstart 當讀取操做將要開始以前調用 * onprogress 在讀取數據過程當中週期性調用 */
        myReader.onloadend = (loadEvent: any) => {
          this.onLoad.emit(loadEvent.target.result);
        };
        /** * readAsBinaryString(file) 將文件讀取爲二進制編碼 * readAsText(file,[encoding]) 將文件讀取爲文本 * readAsDataURL(file) 將文件讀取爲DataURL * abort(none) 終端讀取操做 */
        myReader.readAsDataURL(file);
      });
    }
  }

}
複製代碼

到這一步咱們就基本已經把angular2+自定義指令實現多圖片上傳預覽這一個功能完成了。接下來要怎麼玩就看你們的具體需求是怎樣子的了,反正預覽的圖片數據已經拿到。ui

第一次寫博客,有不完善的地方但願各位大佬不要吝嗇給出意見。this

相關文章
相關標籤/搜索