Javascript 图像没有通过Multer上传到谷歌云存储?

Javascript 图像没有通过Multer上传到谷歌云存储?,javascript,google-cloud-storage,multer,Javascript,Google Cloud Storage,Multer,编辑:解决了问题,解决方案如下 我正在使用multer和multer google storage尝试将图像文件上载到我的google Cloud Bucket中,但由于某些原因,这些文件没有保存到google Cloud Bucket中,我无法记录任何错误,不确定我在这里做错了什么。(已尝试遵循多个不同的教程,阅读文档,检查其他SO问题等,但仍然没有解决方案) @google cloud/storage的文档如下: multer google storage的文档包括: 谷歌云存储使用指南的文

编辑:解决了问题,解决方案如下

我正在使用multer和multer google storage尝试将图像文件上载到我的google Cloud Bucket中,但由于某些原因,这些文件没有保存到google Cloud Bucket中,我无法记录任何错误,不确定我在这里做错了什么。(已尝试遵循多个不同的教程,阅读文档,检查其他SO问题等,但仍然没有解决方案)

@google cloud/storage的文档如下: multer google storage的文档包括: 谷歌云存储使用指南的文档如下:

任何提示和帮助都将不胜感激

编辑:我想出了解决办法。我必须将uploadHandler和fileFilter移到const{storage}导入上方。然后在路由内部,我必须在blobStream.on('finish')之后添加“blobStream.end();”。这样做之后,它解决了这个问题。我已经编辑了下面的工作代码

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const passport = require('passport');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const multer = require('multer');
const path = require('path');
const multerGoogleStorage = require('multer-google-storage');


const fileFilter = (req, file, cb) => {
    // Reject a file 
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true);
    } else {
        cb(null, false);
    }
};

var uploadHandler = multer({ 
    storage: multer.memoryStorage(), 
    limits: {
        fileSize: 1024 * 1024 * 1
    },
    fileFilter: fileFilter
});


const { Storage } = require('@google-cloud/storage'); 

const gc = new Storage({
    projectId: '{projectIdRedacted}',
    keyFilename: path.join(__dirname, '../{keyFileNameRedacted.json}')
});

gc.getBuckets().then(x => console.log(x));

const bucket = gc.bucket('{bucketNameRedacted}');

// Testing GCP Bucket Image Upload
// @route   POST image-upload
// @desc    Add image
// @access  Private
router.post('/image-upload', uploadHandler.single('UploadBox'), passport.authenticate('jwt', {
    session: false
}), (req, res, next) => {

    // This is showing the req.file is being passed through
    console.log(req.file);

    const blob = bucket.file(req.file.originalname);

    const blobStream = blob.createWriteStream({
        metadata: {
            contentType: req.file.mimetype
        },
        resumable: false
    });

    // The err is not getting console logged even though it is not saving to the google cloud bucket properly?
    blobStream.on('error', err => {
        next(err);
        console.log(err);
        return;
    })

    // The publicUrl is not getting console.logged - presumably cause something is breaking before this and it won't save it
    blobStream.on('finish', () => {
        // the public url can be used to directly access the file via HTTP
        const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
        console.log(publicUrl);

        // Make the image public to the web (since we'll be displaying it in the browser)
        blob.makePublic().then(() => {
            res.status(200).send(`Success!\n Image uploaded to ${publicUrl}`);
        })
    })

    blobStream.end();
});

顺便说一句,你并不真的需要
multer-google-storage
软件包


当您点击此上传的路径时,请评论您收到的响应错误消息。

我找到了解决方案。我必须将uploadHandler和fileFilter移到const{storage}导入上方。然后在路由内部,我必须在blobStream.on('finish')之后添加“blobStream.end();”。这样做之后,它解决了这个问题。我已经编辑了下面的工作代码

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const passport = require('passport');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const multer = require('multer');
const path = require('path');
const multerGoogleStorage = require('multer-google-storage');


const fileFilter = (req, file, cb) => {
    // Reject a file 
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true);
    } else {
        cb(null, false);
    }
};

var uploadHandler = multer({ 
    storage: multer.memoryStorage(), 
    limits: {
        fileSize: 1024 * 1024 * 1
    },
    fileFilter: fileFilter
});


const { Storage } = require('@google-cloud/storage'); 

const gc = new Storage({
    projectId: '{projectIdRedacted}',
    keyFilename: path.join(__dirname, '../{keyFileNameRedacted.json}')
});

gc.getBuckets().then(x => console.log(x));

const bucket = gc.bucket('{bucketNameRedacted}');

// Testing GCP Bucket Image Upload
// @route   POST image-upload
// @desc    Add image
// @access  Private
router.post('/image-upload', uploadHandler.single('UploadBox'), passport.authenticate('jwt', {
    session: false
}), (req, res, next) => {

    // This is showing the req.file is being passed through
    console.log(req.file);

    const blob = bucket.file(req.file.originalname);

    const blobStream = blob.createWriteStream({
        metadata: {
            contentType: req.file.mimetype
        },
        resumable: false
    });

    // The err is not getting console logged even though it is not saving to the google cloud bucket properly?
    blobStream.on('error', err => {
        next(err);
        console.log(err);


   return;
    })

// The publicUrl is not getting console.logged - presumably cause something is breaking before this and it won't save it
blobStream.on('finish', () => {
    // the public url can be used to directly access the file via HTTP
    const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
    console.log(publicUrl);

    // Make the image public to the web (since we'll be displaying it in the browser)
    blob.makePublic().then(() => {
        res.status(200).send(`Success!\n Image uploaded to ${publicUrl}`);
    })
})

blobStream.end();
});

谢谢你的回复。我让它工作了。我只是把我的一些进口/报关单上的订单搞混了。我还必须添加blobStream.end()。我已经用这个解决方案编辑了我的原始帖子。谢谢你的回复!我认为这更多的是一个评论,而不是一个答案。使用这个代码,我将一个文件放入我的Google Cloud Bucket中,但它的大小为0KB。没有其他错误。知道如何解决这个问题吗?不幸的是我不知道。确保您使用的文件类型正确且目标正确。
const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const passport = require('passport');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const multer = require('multer');
const path = require('path');
const multerGoogleStorage = require('multer-google-storage');


const fileFilter = (req, file, cb) => {
    // Reject a file 
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
        cb(null, true);
    } else {
        cb(null, false);
    }
};

var uploadHandler = multer({ 
    storage: multer.memoryStorage(), 
    limits: {
        fileSize: 1024 * 1024 * 1
    },
    fileFilter: fileFilter
});


const { Storage } = require('@google-cloud/storage'); 

const gc = new Storage({
    projectId: '{projectIdRedacted}',
    keyFilename: path.join(__dirname, '../{keyFileNameRedacted.json}')
});

gc.getBuckets().then(x => console.log(x));

const bucket = gc.bucket('{bucketNameRedacted}');

// Testing GCP Bucket Image Upload
// @route   POST image-upload
// @desc    Add image
// @access  Private
router.post('/image-upload', uploadHandler.single('UploadBox'), passport.authenticate('jwt', {
    session: false
}), (req, res, next) => {

    // This is showing the req.file is being passed through
    console.log(req.file);

    const blob = bucket.file(req.file.originalname);

    const blobStream = blob.createWriteStream({
        metadata: {
            contentType: req.file.mimetype
        },
        resumable: false
    });

    // The err is not getting console logged even though it is not saving to the google cloud bucket properly?
    blobStream.on('error', err => {
        next(err);
        console.log(err);


   return;
    })

// The publicUrl is not getting console.logged - presumably cause something is breaking before this and it won't save it
blobStream.on('finish', () => {
    // the public url can be used to directly access the file via HTTP
    const publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
    console.log(publicUrl);

    // Make the image public to the web (since we'll be displaying it in the browser)
    blob.makePublic().then(() => {
        res.status(200).send(`Success!\n Image uploaded to ${publicUrl}`);
    })
})

blobStream.end();
});