お世話になってます。
ネット上から画像を取得し、Firebase Storageに保存するアプリをFirebase functionsで動かしたいのですが、Storageへのアップロードができずに困っております。
やりたいこと
- 画像提供サービスからAPI経由で画像情報を取得
- 取得した画像をFirebase Storageに保存
できないこと
- Firebase Storageへのアップロード
書いたソースコード
$ node -v v8.7.0 $ firebase -V 4.2.1
javascript
1//const firebase = require('firebase'); // <=コメントアウトしても結果は変わらず 2const functions = require('firebase-functions'); 3const admin = require('firebase-admin'); 4const rp = require('request-promise'); 5 6const path = require('path'); 7const os = require('os'); 8const fs = require('fs'); 9 10const config = { 11 apiKey: "xxx", 12 authDomain: "xxx.firebaseapp.com", 13 databaseURL: "https://xxx.firebaseio.com", 14 projectId: "xxx", 15 storageBucket: "xxx.appspot.com", 16 messagingSenderId: "00000000" 17 }; 18firebase.initializeApp(config); 19const storageRef = firebase.storage().ref(); 20const fileRef = storageRef.child('test.jpg'); 21 22const options = { 23 uri: 'https://xxx', 24}; 25 26const tmpFile = path.join(os.tmpdir(), 'test.jpg'); 27 28exports.api = functions.https.onRequest((request, response) => { 29 async function main(){ 30 // 画像情報を取得 31 const photoInfo = await getPhotoInfo(); 32 const photo = photoInfo.info.photo[0]; 33 const fileName = photo['image_url'].split('/').pop(); 34 const fileUrl = photo['image_url']; 35 36 // 画像をダウンロード 37 await downloadPhoto(fileUrl, fileName); 38 // ダウンロードできたか確認。console出力されるのでダウンロードはできているはず 39 fs.exists(tmpFile, exists => { 40 if(exists){ 41 console.log('exist downloaded file.'); 42 } 43 }) 44 45 // 画像をアップロード 46 fileRef.put(tmpFile).then(function(snapshot) { 47 console.log('Uploaded file!'); 48 }); 49 } 50 51 main(); 52 53 async function getPhotoInfo() { 54 const result = await rp(options); 55 return JSON.parse(result); 56 } 57 58 async function downloadPhoto(fileUrl, fileName) { 59 await rp(fileUrl) 60 .then(response => { 61 const writeStream = fs.createWriteStream(tmpFile); 62 writeStream.write(response, (err) => { 63 if(err) { 64 console.log(err); 65 } 66 }); 67 }); 68 } 69 70 response.send("Send successfully"); 71}); 72
実行結果
firebase-toolsを使い$ firebase serve --only functions
で実行すると
ReferenceError: firebase is not defined
となり起動しない
聞きたいこと
- アップロードの仕方
※1投稿1質問が基本かもしれませんが、、可能であれば下記も教えて頂けるとありがたいです。
- Admin SDKについて
公式サイトにはFirebase Storageの扱いは2方法掲載されています。
ウェブでファイルをアップロードする
Admin Cloud Storage API の概要
Adminの方は「特権環境から Google Cloud Storage バケットに直接アクセスできます。」と説明がありますが、特権環境ということは管理者用のアプリのみで、ユーザに後悔するアプリでは使わない方がいい、くらいの意味なのでしょうか。
- Firebase StorageとGoogle Cloud Storageの違い
もともとFirebaseは独立したサービスだったが、Googleに買収されて以降はGCPからFirebaseが操作できたり、両者の親和性が高まっている、くらいの理解なのですが、よく「Firebase storage upload」で検索すると「Google Cloud Storage」へアップロードしている記事を見かけるので、もしかして同じ?Admin SDKの方にもFirebaseのサイトなのに「Google Cloud Storage バケットに直接アクセスできます。」という説明があります。。
根本的な部分の理解が乏しいのでお恥ずかしいですが、アドバイスを頂けると幸いです。
よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/04 05:14
2018/11/04 06:38
2018/11/04 10:44
2018/11/04 10:49