Node.js를 사용하여 Firebase 스토리지에 파일 업로드
Node.js를 사용하여 Firebase Storage에서 파일을 업로드하는 방법을 이해하려고 합니다.첫 번째 시도는 Firebase 라이브러리를 사용하는 것이었습니다.
"use strict";
var firebase = require('firebase');
var config = {
apiKey: "AIz...kBY",
authDomain: "em....firebaseapp.com",
databaseURL: "https://em....firebaseio.com",
storageBucket: "em....appspot.com",
messagingSenderId: "95...6"
};
firebase.initializeApp(config);
// Error: firebase.storage is undefined, so not a function
var storageRef = firebase.storage().ref();
var uploadTask = storageRef.child('images/octofez.png').put(file);
// Register three observers:
// 1. 'state_changed' observer, called any time the state changes
// 2. Error observer, called on failure
// 3. Completion observer, called on successful completion
uploadTask.on('state_changed', function(snapshot){
...
}, function(error) {
console.error("Something nasty happened", error);
}, function() {
var downloadURL = uploadTask.snapshot.downloadURL;
console.log("Done. Enjoy.", downloadURL);
});
그러나 Firebase는 문서에 명시되어 있듯이 서버 측에서 파일을 업로드할 수 없습니다.
Firebase 저장소는 서버 측 Firebase npm 모듈에 포함되어 있지 않습니다.대신 gcloud Node.js 클라이언트를 사용할 수 있습니다.
$ npm install --save gcloud
코드에서 다음을 사용하여 스토리지 버킷에 액세스할 수 있습니다.
var gcloud = require('gcloud')({ ... }); var gcs = gcloud.storage(); var bucket = gcs.bucket('<your-firebase-storage-bucket>');
사용할 수 있습니까?
gcloud
Google Cloud Platform에 계정이 없는 상태에서? 어떻게?그렇지 않다면 클라이언트 측에서 Firebase 스토리지로 파일을 업로드할 수 있는 이유는 무엇입니까?
서버 측에서 동일한 요청을 하는 라이브러리를 만들면 안 될까요?
Firebase Storage는 Google Cloud Platform과 어떻게 연결됩니까?Firebase에서 클라이언트 측에서만 이미지를 업로드할 수 있는 이유는 무엇입니까?
제 두 번째 시도는gcloud
문서에 언급된 것과 같은 라이브러리:
var gcloud = require("gcloud");
// The following environment variables are set by app.yaml when running on GAE,
// but will need to be manually set when running locally.
// The storage client is used to communicate with Google Cloud Storage
var storage = gcloud.storage({
projectId: "em...",
keyFilename: 'auth.json'
});
storage.createBucket('octocats', function(err, bucket) {
// Error: 403, accountDisabled
// The account for the specified project has been disabled.
// Create a new blob in the bucket and upload the file data.
var blob = bucket.file("octofez.png");
var blobStream = blob.createWriteStream();
blobStream.on('error', function (err) {
console.error(err);
});
blobStream.on('finish', function () {
var publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
console.log(publicUrl);
});
fs.createReadStream("octofez.png").pipe(blobStream);
});
서버에서 Firebase 라이브러리를 사용할 때 일반적으로 서비스 계정을 사용하여 권한을 부여합니다. 이 경우 관리자가 실시간 데이터베이스에 액세스할 수 있습니다.동일한 서비스 계정의 자격 증명 파일을 사용하여 G클라우드를 인증할 수 있습니다.
참고로 Firebase 프로젝트는 본질적으로 Google Cloud Platform 프로젝트이기도 합니다. Firebase 프로젝트는 https://console.firebase.google.com 과 https://console.cloud.google.com , https://developers.google에서 모두 액세스할 수 있습니다.com Firebase Console > Project Settings 또는 Cloud Console Dashboard에서 프로젝트 ID를 확인할 수 있습니다
gcloud SDK를 사용할 때는 Firebase 스토리지에서 사용 중인 버킷과 동일한 버킷을 사용해야 합니다.Firebase 웹에서 버킷 이름을 찾을 수 있습니다.config
개체 또는 Firebase 저장소 탭에 있습니다.기본적으로 코드는 다음과 같이 시작해야 합니다.
var gcloud = require('gcloud');
var storage = gcloud.storage({
projectId: '<projectID>',
keyFilename: 'service-account-credentials.json'
});
var bucket = storage.bucket('<projectID>.appspot.com');
...
이제 Firebase 스토리지가 노드가 포함된 관리 SDK에서 지원됩니다.JS:
https://firebase.google.com/docs/reference/admin/node/admin.storage
// Get the Storage service for the default app
var defaultStorage = firebaseAdmin.storage();
var bucket = defaultStorage.bucket('bucketName');
...
Firebase Admin SDK를 사용하면 Google 클라우드 스토리지에 직접 액세스할 수 있습니다.
자세한 내용은 관리 클라우드 스토리지 API 소개를 참조하십시오.
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
storageBucket: "<BUCKET_NAME>.appspot.com"
});
var bucket = admin.storage().bucket();
bucket.upload('Local file to upload, e.g. ./local/path/to/file.txt')
그것이 당신에게 도움이 되기를 바랍니다.로컬에서 파일 하나를 업로드한 다음 UUID를 사용하여 액세스 토큰을 추가했습니다. 그 후 Firebase 스토리지에 업로드했습니다.다운로드 url을 생성하고 있습니다.generate url을 누르면 자동으로 파일이 다운로드됩니다.
const keyFilename="./xxxxx.json"; //replace this with api key file
const projectId = "xxxx" //replace with your project id
const bucketName = "xx.xx.appspot.com"; //Add your bucket name
var mime=require('mime-types');
const { Storage } = require('@google-cloud/storage');
const uuidv1 = require('uuid/v1');//this for unique id generation
const gcs = new Storage({
projectId: projectId,
keyFilename: './xxxx.json'
});
const bucket = gcs.bucket(bucketName);
const filePath = "./sample.odp";
const remotePath = "/test/sample.odp";
const fileMime = mime.lookup(filePath);
//we need to pass those parameters for this function
var upload = (filePath, remoteFile, fileMime) => {
let uuid = uuidv1();
return bucket.upload(filePath, {
destination: remoteFile,
uploadType: "media",
metadata: {
contentType: fileMime,
metadata: {
firebaseStorageDownloadTokens: uuid
}
}
})
.then((data) => {
let file = data[0];
return Promise.resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid);
});
}
//This function is for generation download url
upload(filePath, remotePath, fileMime).then( downloadURL => {
console.log(downloadURL);
});
Gcloud는 더 이상 사용되지 않으며, 대신 Google-cloud를 사용합니다.프로젝트 설정 ->서비스 계정에서 SERVICE_ACCOUNT_KEY_FILE_PATH를 찾을 수 있습니다.
var storage = require('@google-cloud/storage');
var gcs = storage({
projectId: PROJECT_ID,
keyFilename: SERVICE_ACCOUNT_KEY_FILE_PATH
});
// Reference an existing bucket.
var bucket = gcs.bucket(PROJECT_ID + '.appspot.com');
...
아니면 간단히 폴리필을 할 수도 있습니다.XmlHttpRequest
그런 식으로 -
const XMLHttpRequest = require("xhr2");
global.XMLHttpRequest = XMLHttpRequest
및 가져오기
require('firebase/storage');
바로 그겁니다. 든모.firebase.storage()
이제 방법이 작동해야 합니다.
API를 구현하여 파이어베이스 스토리지에 파일을 업로드했습니다.
const fs = require('firebase-admin');
const app = require('express')();
const serviceAccount = require('./serviceAccountKey_DEV.json');
fs.initializeApp({
credential: fs.credential.cert(serviceAccount),
storageBucket: `${serviceAccount.project_id}.appspot.com`
});
// Upload the file on firebase storage
app.get("/upload-on-firebase", async (req, res, next) => {
var bucket = fs.storage().bucket();
const result = await bucket.upload('data.json');
console.log('result :', result);
return res.send(result);
});
업로드할 API 호출:
curl --location --request GET 'http://localhost:3000/upload-on-firebase'
응답:
[
{
"_events": {},
"_eventsCount": 0,
"metadata": {
"kind": "storage#object",
"id": "project_id.appspot.com/data.json/1678222222",
"selfLink": "https://www.googleapis.com/storage/v1/b/project_id.appspot.com/o/data.json",
"mediaLink": "https://storage.googleapis.com/download/storage/v1/b/project_id.appspot.com/o/data.json",
"name": "data.json",
"bucket": "project_id.appspot.com",
"generation": "16787922222222",
"metageneration": "1",
"contentType": "application/json",
"storageClass": "STANDARD",
....
....
....
},
"baseUrl": "/o",
}
]
언급URL : https://stackoverflow.com/questions/39848132/upload-files-to-firebase-storage-using-node-js
'source' 카테고리의 다른 글
NPOI를 사용하여 Excel을 데이터 테이블로 내보내기 (0) | 2023.06.08 |
---|---|
어떻게 하면 디브에서 절대적으로 위치한 요소를 중심에 둘 수 있습니까? (0) | 2023.06.08 |
대응 유형 스크립트 - 사용자 지정 특성 추가 (0) | 2023.06.08 |
Firebase 장치 간 알림 튜토리얼에서 참조하는 "serviceAccountKey.json"이란 무엇입니까? (0) | 2023.06.08 |
도커 - postgres 컨테이너에서 psql 명령을 실행하려면 어떻게 해야 합니까? (0) | 2023.06.03 |