モバイルハイブリッドアプリ(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つの大きな問題があります:
.on('finish)
関数のように、オブジェクトがupload()
で返されることを期待していましたが、何も返されません(ファイルは未定義です)。このURLを取得して、サーバーの応答で送り返すにはどうすればよいですか?upload()
関数は専用サーバーではないため、バックエンドでファイルをホストしたくないので、使用を避けたいと思います。
私の問題は、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);
});