使用Javascript从本地路径创建文件或Blob

5

我在Stack Overflow广泛并系统地搜索过答案,但都没有找到符合我需求的。

我正在尝试将一些文件上传到Firebase存储中,这需要一个文件或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和其他选项,但似乎没有一种方法可以仅使用路径将文件转换为对象。

简而言之:是否有任何简单的方法可以从本地路径获取对象?


1
fs.readFile() 可以获取一个Buffer对象,您可以将其传递给HTTP请求方法以发送它。 - Patrick Evans
3个回答

1
以下是如何将文件从驱动器上传到Firebase存储的方法:
let bucket = admin.storage().bucket();
let uploadRes = await bucket.upload(filePath, options);

你可以在Google Cloud Storage文档中找到该选项的描述。您很可能会在Google Cloud控制台中创建具有权限的密钥并将文件导出为json格式。您可以在 Google Cloud平台控制台 -> IAM和管理 -> 服务帐户 -> 创建服务帐户(使用密钥创建)。导出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;
}

0

这应该适用于最近版本的Node.js:

import fs from "fs";
import { Blob } from "buffer";

let buffer = fs.readFileSync("./your_file_name");
let blob = new Blob([buffer]);

-1
首先告诉我你正在使用哪种前端技术。
如果你正在使用Angular,那么你只需要每次获取$event,例如change事件。 然后你需要创建FormData对象。 将该对象传递到Node中,Node端使用multer来存储文件。
如果你需要演示,请告诉我,我可以帮助你...

纯JavaScript和Node.js - Jacobo Koenig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接