从Java脚本中的本地路径创建文件或Blob

时间:2019-04-07 14:13:29

标签: javascript node.js blob firebase-storage fileapi

我已经在堆栈溢出中进行了广泛而系统的搜索,但是找不到适合我需求的答案。

我正在尝试将许多文件上传到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和其他选项进行了研究,但似乎没有一种方法可以让我仅使用路径将文件导入对象。

简而言之:有什么简单的方法可以从本地路径获取对象?

2 个答案:

答案 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;
}