【问题标题】:Angular 2/4 FileReader ServiceAngular 2/4 FileReader 服务
【发布时间】:2017-11-01 20:17:14
【问题描述】:

我试图创建 Angular 2/4 服务以上传文件。我找不到任何资源的解决方案,所以我可能想问你们。所以这个想法是在 Component 的某个地方有 type=file 的输入字段。它有指令 (change)="uploadFile($event)"。 在组件 .ts 文件中:

uploadFile(event) {
   this.images.push(this.uploadImgService.uploadImage(event));
}

UploadImgService 看起来是这样的:

private img: string;

uploadImage(e) {
  const file = e.target.files[0];
  const pattern = /image-*/;

  if (!file.type.match(pattern)) {
    alert('You are trying to upload not Image. Please choose image.');
    return;
  }
  const reader = new FileReader();
  reader.readAsDataURL(file);
  reader.onloadend = () => {
    this.img = reader.result;
  };

  return this.img;
}

所以,我知道操作是异步的,但我不知道如何以等待 img 加载的方式包装它。我认为这是缺乏技能的结果:( 当我将此代码发布到组件中时,它肯定可以工作,但我的想法是提供服务。 另外,我只是 Angular 的初学者。所以,如果有更好的方法来实现这个想法,我很高兴收到你的来信。谢谢!

【问题讨论】:

    标签: javascript angular angular2-services filereader


    【解决方案1】:

    你应该像这样返回一个 observable:

    uploadImage(e) {
      const file = e.target.files[0];
      const pattern = /image-*/;
    
      if (!file.type.match(pattern)) {
        alert('You are trying to upload not Image. Please choose image.');
        return;
      }
      const reader = new FileReader();
      reader.readAsDataURL(file);
      return Observable.create(observer => {
        reader.onloadend = () => {
          observer.next(reader.result);
          observer.complete();
        };
      });
    }  
    

    并在组件中,订阅 observable:

    this.service.uploadImage(event).subscribe((img) => {
        // Do what you want with the image here
    });
    

    【讨论】:

    • 哦,非常感谢!是的,它真的帮了我很多!另外,我想知道我将这些东西放在服务中是否正确?有没有别的办法处理?
    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多