将图片上传到 S3 Bucket 并将对应的 url 发送到 MongoDB

问题描述

我可以将图像上传到我的 s3 存储桶,但无法将相应的文件 url 传递到我的 MongoDB 数据库。我能做的最好的事情是使用预定义的字符串名称更新我的图像字段。具体来说,我想更改 'TestURL.png' 以匹配正在我的路由 'Date.Now().toString() + '-' + file.originalname)' 中保存的文件名称,但一直无法这样做.

注意,当我尝试访问“req.file”时,对象返回空。另外,如果我的代码看起来与其他 multer-s3 教程不同,那是因为除了下面使用的内容之外,我找不到任何可以工作的代码

uploadController.js

import asyncHandler from 'express-async-handler';
import Recipe from '../models/recipeModel.js';

// @description Upload
// @route PUT /api/uploadAWS/:id
// @access Private
const uploadRecipeCoverImage = asyncHandler(async (req,res) => {
  const {
    recipe_cover_image,} = req.body

  const uid = req.params.id
  const recipe = await Recipe.findById(uid)

  const uploadImage = { recipe_cover_image: 'TestURL.png' }

  Recipe.findByIdAndUpdate(uid,uploadImage,{ new: true })
    .then((recipe) => res.status(200).json({success:true,recipe:recipe}))
    .catch((recipe) => res.status(400).json({success:false,error:err}))

export {
  uploadRecipeCoverImage
} 

上传AWSRoutes.js

import express from 'express';
import aws from 'aws-sdk';
import multer from 'multer';
import multerS3 from 'multer-s3';
import path from 'path';
import {
  uploadRecipeCoverImage,} from '../controllers/uploadController.js';
import { protect,admin } from '../middleware/authMiddleware.js';

const router = express.Router();

aws.config.update({
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,accessKeyId: process.env.AWS_ACCESS_KEY_ID,region: 'us-west-2',signatureversion: 'v4'
})

const s3 = new aws.S3()

function checkFileType(file,cb) {
  const filetypes = /jpg|jpeg|png/
  const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
  const mimetype = filetypes.test(file.mimetype)

  if(extname && mimetype) {
    return cb(null,true)
  } else {
    cb('Images only!')
  }
}

const upload = multer({
  limits: { fileSize: 2000000 },fileFilter: function(req,file,cb) {
    checkFileType(file,cb)
  },storage: multerS3({
    s3: s3,bucket: 'recipebook-recipe-cover-images',acl: "public-read",Metadata: function (req,cb) {
      cb(null,{ fieldName: file.fieldname });
    },key: function (req,Date.Now().toString() + '-' + file.originalname);
    },}),})

const singleUpload = upload.any()

router.route('/:id')
  .put(singleUpload,protect,uploadRecipeCoverImage)

recipeModel.js(如果从上面看不清楚)

import mongoose from 'mongoose';

const recipeSchema = mongoose.Schema(
  {
    ...
    recipe_cover_image: {
      type: String,required: true
    },)

const Recipe = mongoose.model('Recipe',recipeSchema);

export default Recipe;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)