如何从Ionic上传图像到Firebase存储?

时间:2018-10-10 23:58:54

标签: javascript firebase ionic3 firebase-storage

我需要帮助以将离子图像发送到Firebase存储。因此,我使用此功能拍照:

  async takePicture() {
    const options: CameraOptions = {
      quality: 100,
      destinationType: this.camera.DestinationType.FILE_URI,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE
    }

    try {
      let imageURI = await this.camera.getPicture(options);
      let newImageURI = await this.cropImage(imageURI);
      let imageSanitized = await this.encodeFile(newImageURI);
      this.imgSrc = imageSanitized;
    } catch (e) {
      console.error(JSON.stringify(e));
    }
  }

然后使用此功能进行裁剪:

  cropImage(imgURI): Promise<string> {
    return new Promise((resolve,reject) => {
      this.cropService.crop(imgURI, { quality: 100 }).then((newImageURI: string) => {
        resolve(newImageURI);
      }, (err) => {
        reject(err);
      })
    })
  }

使用此功能完成编码:

 encodeFile(ImageURI: string): Promise<any>{
    return new Promise((resolve, reject) => {
      this.base64.encodeFile(ImageURI).then((base64File: string) => {
        this.imgUri = base64File;
        resolve(this.domSanitizer.bypassSecurityTrustResourceUrl(base64File));
      }, (err) => {
        reject(err);
      })
    })
  }

this.imgSrc是我清理过的图像,在我的file.html中显示得很好。但是,我需要将此图像发送到Firebase存储。为此,我创建了以下功能:

uploadToStorage(imgString) {
    console.log(imgString);
    this.storage.child('exemplo.JPEG').putString(imgString, 'data_url').then((res) => {
      console.log(res);
    }, (error) => {
      console.error(error);

    });
  }

imgString是从函数encodeFile获取this.domSanitizer.bypassSecurityTrustResourceUrl(base64File)或base64File的值的人。

我的上传功能没有出现错误,但是我没有获得成功,对我来说什么也没有。

如何将图像正确发送到服务器?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用以下方式将图像捕获为base64:

destinationType: this.camera.DestinationType.DATA_URL

代替FILE_URI。

无论如何,为了记录图像,我在AngularFire2中使用了以下代码,该代码可以正常工作。这是我保存base64图像的位置。但是,如果您的编码器在base64字符串的开头添加““ data:image / jpeg; base64”,这可能会变得棘手。如果此代码无法按预期工作,则可以尝试添加或不添加字符串。

import { AngularFireStorage, AngularFireStorageReference } from 'angularfire2/storage/public_api';

//...

const storageRef: AngularFireStorageReference = this.afStorage.ref(`images/${this.userId}/profilePic/`);

storageRef.putString(this.data.image, 'data_url', {
contentType: 'image/jpeg'
}).then(() => {

storageRef.getDownloadURL().subscribe(url => {

console.log('download url: ' + url);
//function to save download URL of saved image in database

    });
  })
})

答案 1 :(得分:0)

我这样做了:

 encodeFile(ImageURI: string): Promise<any>{
    return new Promise((resolve, reject) => {
      this.base64.encodeFile(ImageURI).then((base64File: string) => {
        this.imgUri = base64File;
        ...
      }, (err) => {
        ...
      })
    })
  }

this.imgUri存储我的图像base64编码。但是有必要修改它的开始。如此拆分:

let messageSplit = this.imgUri.split('data:image/*;charset=utf-8;base64,')[1];

添加到她的位置

let message64 = 'data:image/jpg;base64,' + messageSplit;

因此请上传到Firebase存储。

const filePath = `my-pet-crocodile_${ new Date().getTime() }.jpg`;
let task = this.afStorage.ref(filePath).putString(message64, 'data_url');