我已经在堆栈溢出中进行了广泛而系统的搜索,但是找不到适合我需求的答案。
我正在尝试将许多文件上传到Firebase Storage,这需要File或Blob对象。
var file = ... // use the Blob or File API
ref.put(file).then(function(snapshot) {
console.log('Uploaded a blob or file!');
});
我的项目中有一个文件夹,其中包含我要上传的所有文件,并且我正在尝试使用路径创建此类对象。但是,我的尝试都没有成功。
我尝试导入文件:
let file = require('./Images/imagename.jpg');
并且我使用'fs',File API和其他选项进行了研究,但似乎没有一种方法可以让我仅使用路径将文件导入对象。
简而言之:有什么简单的方法可以从本地路径获取对象?
答案 0 :(得分:0)
首先告诉我,您正在使用哪种技术进行前端。
如果您使用的是angular,则每次更改事件都只需要获取$ event即可。 比您需要创建FormData对象。 将该对象传递到节点,节点侧使用multer来存储文件。
如果您需要演示,请告诉我,我可以为您提供帮助。...
答案 1 :(得分:0)
以下是将文件从驱动器上传到Firebase存储的方法:
let bucket = admin.storage().bucket();
let uploadRes = await bucket.upload(filePath, options);
您可以在google cloud storage docs中找到该选项的说明。
您很可能会在Google Cloud Console中创建具有权限的密钥,并将文件导出为json。您可以在Google Cloud Platform console
-> IAM & admin
-> Service accounts
-> Create service account
中找到它(使用密钥创建)。导出json后,按如下所示设置环境变量:
export GOOGLE_APPLICATION_CREDENTIALS='./the_exported_file.json'
由于已读取和写入访问权限,请将该文件安全地存储在您的服务器上!
下面是上传功能的完整示例,该功能还以其哈希名称保存文件。
<!-- language: typescript -->
import admin from "firebase-admin";
import path from 'path'
const sha256File = require('sha256-file');
const firebaseConfig = {
apiKey: "...",
authDomain: "abc.firebaseapp.com",
databaseURL: "https://abc.firebaseio.com",
projectId: "abc",
storageBucket: "abc.appspot.com",
messagingSenderId: "123",
appId: "1:123:web:xxx",
measurementId: "G-XXX"
};
admin.initializeApp(firebaseConfig);
async function uploadFile(filePath: string, uploadFolder: string, contentType: string, hash: string | undefined = undefined,)
: Promise<string> {
if (!hash) {
hash = await sha256File(filePath);
}
let bucket = admin.storage().bucket();
const ext = path.extname(filePath);
const uploadPath = uploadFolder + hash + ext;
const options = {destination: uploadPath};
console.debug("starting upload");
let uploadRes = await bucket.upload(filePath, options);
console.debug("finished upload");
let newMetadata = {
contentType: contentType
};
if(uploadRes) {
let file = uploadRes[0];
file.setMetadata(newMetadata).then(() => {
// Updated metadata for 'images/forest.jpg' is returned in the Promise
}).catch(function (error) {
console.error(error)
});
}
return uploadPath;
}