web-dev-qa-db-ja.com

base64でエンコードされたjpegをFirebaseStorage(Admin SDK)にアップロードします

モバイルハイブリッドアプリ(Ionic 3)からHerokuバックエンド(Node.js)に画像を送信し、バックエンドで画像をFirebase Storageにアップロードして、新しくアップロードしたfilダウンロードURLをモバイルアプリに返そうとしています。

Node.js用のFirebaseAdminSDKを使用していることに注意してください。

そこで、base64でエンコードされた画像をHerokuに送信します(エンコードされた文字列をオンラインのbase64デコーダーで確認しますが、問題ありません)。これは次の関数で処理されます。

_const uploadPicture = function(base64, postId, uid) {
  return new Promise((resolve, reject) => {
    if (!base64 || !postId) {
      reject("news.provider#uploadPicture - Could not upload picture because at least one param is missing.");
    }

    let bufferStream = new stream.PassThrough();
    bufferStream.end(new Buffer.from(base64, 'base64'));

    // Retrieve default storage bucket
    let bucket = firebase.storage().bucket();

    // Create a reference to the new image file
    let file = bucket.file(`/news/${uid}_${postId}.jpg`);

    bufferStream.pipe(file.createWriteStream({
      metadata: {
        contentType: 'image/jpeg'
      }
    }))
    .on('error', error => {
      reject(`news.provider#uploadPicture - Error while uploading picture ${JSON.stringify(error)}`);
    })
    .on('finish', (file) => {
      // The file upload is complete.
      console.log("news.provider#uploadPicture - Image successfully uploaded: ", JSON.stringify(file));
    });
  })
};
_

私には2つの大きな問題があります:

  1. アップロードは成功しましたが、Firebase Storageコンソールに移動すると、画像のプレビューを表示しようとするとエラーが発生し、ダウンロード時にコンピューターから開くことができません。エンコーディングだと思いますが……?
  2. 新しくアップロードされたファイルのダウンロードURLを取得するにはどうすればよいですか? .on('finish)関数のように、オブジェクトがupload()で返されることを期待していましたが、何も返されません(ファイルは未定義です)。このURLを取得して、サーバーの応答で送り返すにはどうすればよいですか?

upload()関数は専用サーバーではないため、バックエンドでファイルをホストしたくないので、使用を避けたいと思います。

17

私の問題は、base64オブジェクト文字列の先頭にdata:image/jpeg;base64,を追加することでした。私はそれを削除する必要がありました。

ダウンロードURLについては、次のようにしました。

const config = {
        action: 'read',
        expires: '03-01-2500'
      };
      let downloadUrl = file.getSignedUrl(config, (error, url) => {
        if (error) {
          reject(error);
        }
        console.log('download url ', url);
        resolve(url);
      });
10