【问题标题】:Destination not being set while uploading files using multer and gcloud使用 multer 和 gcloud 上传文件时未设置目标
【发布时间】:2020-12-25 16:09:12
【问题描述】:

我正在尝试将文件上传到我的谷歌存储桶的特定文件夹中。我用Google documentations写了我的代码

app.js

const multerMid = multer({
    storage: multer.memoryStorage(),
    limits: {
        // no larger than 5mb.
    fileSize: 5 * 1024 * 1024,
},
});

app.disable("x-powered-by");
app.use(
    multerMid.fields([
        { name: "avatar", maxCount: 1 },
        { name: "gallery", maxCount: 8 },
    ])
);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.post("/uploads", async (req, res, next) => {
    try {
        const myFile = req.files;
        console.log(myFile);
        const imageUrl = await uploadImage(myFile.gallery[0]);
        res.status(200).json({
            message: "Upload was successful",
            data: imageUrl,
        });
    } catch (error) {
        next(error);
    }
});

上传图片功能

const uploadImage = (file) =>
new Promise((resolve, reject) => {
    const { originalname, buffer } = file;

    const blob = bucket.file(originalname.replace(/\s+/g, "_"));
    const blobStream = blob.createWriteStream({
        destination: "documents/image.png",
        resumable: false,
    });
    blobStream
        .on("finish", () => {
            const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
            resolve(publicUrl);
        })
        .on("error", () => {
            reject(`Unable to upload image, something went wrong`);
        })
        .end(buffer);
});

在这里,我将目标设置为documents/image.png,但文件仍存储在存储桶根目录中,而不是文档文件夹中。如何使文件存储在存储桶中的特定文件夹中?

【问题讨论】:

    标签: node.js google-cloud-storage blob multer


    【解决方案1】:

    createWriteStream 在其configuration 选项中没有名为destinationproperty

    https://googleapis.dev/nodejs/storage/latest/global.html#CreateWriteStreamOptions

    uploadOptions 对象: https://googleapis.dev/nodejs/storage/latest/global.html#UploadOptions

    解决方案:您应该使用upload 便捷方法(包装createWriteStream)并将uploadOptions 对象作为destionation 属性传递给它! https://googleapis.dev/nodejs/storage/latest/Bucket.html#upload

    【讨论】:

    • 通过这种方式,我无法将图像上传到云端。我收到一个错误 - 错误:ENOENT:没有这样的文件或目录,stat 'D:\Ezasptal\aditya\cristiano-ronaldo-3840x2160-portugal-real-madrid-soccer-4k-19809.jpg'。我的代码的链接 - codeshare.io/5D1OeO
    • 其实我明白了。早些时候,在使用 createwritestream 时,我能够从本地机器的任何地方获取图像。但是,在使用上传便捷方法时,文件应该存在于我的根文件夹中。如果我必须从前端获取文件并将其发布到谷歌云中,createWriteStream 可以在不将其保存在服务器中的情况下执行此操作,但我认为上传方法需要先将文件保存在服务器中。
    【解决方案2】:

    我已经找到了将文件存储在谷歌存储桶中特定子目录中的方法。谷歌在其存储桶中存储一个文件,其名称也包含它的路径。例如,如果图像名称 xyz.jpg 存储在 mnp 存储桶中的 abc 文件夹中。文件名将是mnp/abc/xyz.jpg。因此,要将文件保存在特定目录中,我们只需在原始文件名中添加路径即可。

    const uploadImage = (file) =>
        new Promise((resolve, reject) => {
        const { originalname, buffer } = file;
    
        const blob = 
        bucket.file(originalname.replace(originalname,"document/"+originalname));
        const blobStream = blob.createWriteStream({
            resumable: false,
        });
        blobStream
        .on("finish", () => {
            const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
            resolve(publicUrl);
        })
        .on("error", () => {
            reject(`Unable to upload image, something went wrong`);
        })
        .end(buffer);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-09
      • 2018-08-12
      • 2016-10-22
      • 2016-06-02
      • 2023-01-20
      • 2021-11-28
      • 1970-01-01
      • 2017-08-30
      相关资源
      最近更新 更多