如何使用具有离子和角度的照片相机在firebase中同时保存多个图像

Posted

技术标签:

【中文标题】如何使用具有离子和角度的照片相机在firebase中同时保存多个图像【英文标题】:How to save several images at the same time in firebase using the photo camera with ionic and angular 【发布时间】:2021-04-13 04:50:58 【问题描述】:

如何将多张图片保存到存储空间?这段代码,完成的是,使用相机,当你拍照时创建一个图像排列,点击上传只上传一张图片到firestorage,但我不知道如何上传多张图片,有什么想法吗?

完整详细的代码:

public imagesArray: Array<any> = new Array<any>();
captureDataUrl: string;
alertCtrl: AlertController;
capture() 
  const options: CameraOptions = 
    quality: 50,
    destinationType: this.camera.DestinationType.DATA_URL,
    encodingType: this.camera.EncodingType.JPEG,
    mediaType: this.camera.MediaType.PICTURE,
  ;

  this.camera.getPicture(options).then(
    imageData => 
      // imageData is either a base64 encoded string or a file URI
      // If it's base64:

      this.captureDataUrl = 'data:image/jpeg;base64,' + imageData;
      this.imagesArray.push(this.captureDataUrl);
    ,
    err => 
      // Handle error
    ,
  );
 // End of capture camera

upload() 
  let storageRef = firebase.storage().ref();
  // Create a timestamp as filename

  const filename = Math.floor(Date.now() / 1000);

  // Create a reference to 'images/todays-date.jpg'

  const imageRef = storageRef.child(`images/$filename.jpg`);

  imageRef
    .putString(this.captureDataUrl, firebase.storage.StringFormat.DATA_URL)
    .then(snapshot => 
      // Do something here when the data is succesfully uploaded!
    );

the html component:

<ng-container *ngFor="let i of imagesArray;">
       <img src='i' /> 
  </ng-container>

 <ion-button ion-button (click)="capture()"> take a photo!</ion-button>
 <ion-button ion-button (click)="upload()"  >upload firebase!</ion-button>

我想同时上传两张或多张照片,或者更确切地说是多张照片,代码的作用是在拍摄照片时将其保存在 Firebase 中,但如果我拍摄两张照片,则只保存一张。

【问题讨论】:

问题不清楚。究竟是什么问题?你想上传你刚刚拍了2次的照片吗?如果第一张照片是从相机拍摄的,那么第二张照片的来源是什么? 我想同时上传两张或多张照片,或者更确切地说是多张,代码的作用是拍照时将其保存在firebase中,但如果我拍两张照片只保存一个 尝试使用Date.now(); 而不是Math.floor(Date.now() / 1000);。也许有名字冲突 不行,就是每次点击上传,都是上传单张图片 如何同时拍两张照片? 【参考方案1】:

我假设:

应用中某处有一个UPLOAD 按钮。 当您单击它时,它会调用upload() 方法。

如果是这样,当然只上传一张图片。在您编写的capture() 方法中:

// You save the data of the LAST captured image
this.captureDataUrl = 'data:image/jpeg;base64,' + imageData;
// You then push it to an array containing all images (that's good!)
this.imagesArray.push(this.captureDataUrl);

upload() 你有:

// You pass `this.captureDataUrl`, i.e. the LAST captured image! That's not what you want!
imageRef.putString(this.captureDataUrl, firebase.storage.StringFormat.DATA_URL)

相反,您应该迭代 this.imagesArray,如下所示:

upload() 
  let storageRef = firebase.storage().ref();

  Promise.all(
    // Go over ALL captured images
    // UPDATE 1
    this.imagesArray.map((imageUrl, imageIndex) => 
      // Create a timestamp as filename
      // UPDATE 1
      const filename = `$Date.now()-$imageIndex`;

      // Create a reference to 'images/todays-date.jpg'
      const imageRef = storageRef.child(`images/$filename.jpg`);

      // Upload that particular image and return the upload Promise
      return imageRef
        .putString(imageUrl, firebase.storage.StringFormat.DATA_URL)
        .then(snapshot => 
          // Do something here when the data is succesfully uploaded!
        );
    ),
  ).then(
    () => 
      console.log('All images uploaded!');
    ,
    err => 
      console.error('Some images failed to upload...', err);
    ,
  );

【讨论】:

只保存一张图片,还是很感激的 啊,对了,可能还有文件名冲突。我已经更新了代码(更新用 cmets UPDATE 1 表示),检查一下。

以上是关于如何使用具有离子和角度的照片相机在firebase中同时保存多个图像的主要内容,如果未能解决你的问题,请参考以下文章

如何从离子3中的firebase-storage获取图像

离子从相机中排除谷歌照片。PictureSourceType.PHOTOLIBRARY

尝试离子构建时出现角度firebase构建错误

如何在离子定制应用程序内打开相机

使用相机角度失真从屏幕高度查找图像的实际高度

firebase 存储 - 使用 android 相机上传照片,但在将照片提交到 firebase 存储时崩溃