Как загрузить изображения в ведро GCS с Multer и NodeJS? - PullRequest
0 голосов
/ 29 ноября 2018

У меня проблемы с загрузкой локальных изображений в мое облачное хранилище Google.

Я уже попробовал два метода.Первый - загрузка с помощью multer

var storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, './uploads/')
    },
    filename: (req, file, cb) => {
      cb(null, file.fieldname + '-' + Date.now())
    }
});
var upload = multer({storage: storage}).single('image'); 

app.post('/upload',function(req,res,next){
  upload(req,res,(err) => {
    if(err){
      console.log(err)
    }else{
      console.log(req.file)
    }
  })

})

Затем, я попробовал напрямую с GCS

var bucket = admin.storage().bucket('mybucket')
app.post('/upload',function(req,res,next){
 bucket
.save(file)
.then(() => {



})

для обоих этих решений, req.files всегда undefined, тогда как req.body - это такой буфер:

<Buffer 2d 2d 2d 2d ...>

, когда я пытаюсь сохранить этот буфер в моем GCS-контейнере, в нем создается файл .jpg / png, но ониспорчен.

Я просматриваю Интернет в поисках решения, но не нашел ничего, что помогло бы мне преодолеть эту ситуацию.

Любой совет?

1 Ответ

0 голосов
/ 13 февраля 2019

Вам нужны multer, multer-google-storage и конечно же bodyParser, если у вас есть дополнительные значения формы.Вам необходимо отправить данные в multipart / form-data

В вашем файле .env

GCS_BUCKET = <bucket name>
GCLOUD_PROJECT = <project id>
GCS_KEYFILE = <key file location>

Вы можете загрузить файл ключа из Консоли GCP> Ваш проект> Я ЕСМЬ и Администратор> Учетные записи служб

На вашем маршруте

const multer = require('multer');
const multerGoogleStorage = require("multer-google-storage");

var uploadHandler = multer({
  storage: multerGoogleStorage.storageEngine()
});

router.post('/', uploadHandler.single('image'), function (req, res, next) {
  const body = req.body;
  res.json({fileName: req.file.filename});
  res.end();

}

Это сохранит файл в GCS с именем [random-string-by-gcs] _ [ВАШЕ ИМЯ ФАЙЛАС ПРОШЛОМ].То же самое можно получить по маршруту через req.file.filename.

Документация

...