使用Multer通过express将文件上传到S3?

问题描述 投票:1回答:1

我有一个快递服务器,它通过“ / products”路径接受表单。该表单具有多个文本元素和一个图像元素。最终目标是从传入请求中提取图像,将其上载到AWS S3,然后将该图像的位置+其他文本传输到MySql数据库。我目前一直在使用Postman发送请求

目前,Multer将一个很长的纯文本文件存储在我的“ temp /”文件中,然后将其删除。当我在AWS上查看时,该图像不存在,并且有一个“八位位组流”正在重新记录。有什么想法吗?

我一直在使用本教程(以及无数其他资源)来尝试实现我期望的目标,如果有帮助的话:https://medium.com/@otoloye/uploading-files-to-aws-s3-using-nodejs-multer-mongodb-and-postman-part-1-de790b8131d4

productcontroller.js

const createProduct = (req, res) => {

    const fs = require('fs');
    const aws = require('aws-sdk');
    const pool = require('../../lib/db');
    const moment = require('moment');

    aws.config.setPromisesDependency();
    aws.config.update({
        accessKeyId: process.env.ACCESS_KEY_ID,
        secretAccessKey: process.env.SECRET_ACCESS_KEY,
        region: process.env.REGION
    });

    const s3 = new aws.S3();

    console.log(req)

    const params = {
        ACL: 'public-read',
        Bucket: process.env.BUCKET_NAME, 
        Body: fs.createReadStream(req.file.path),
        Key: `products/${Date.now()}`
    };

    s3.upload(params, (err, data) => {
    if (err) {
        console.log('An error occured whilst uploading the picture',err)
    };

    if (data){             
        fs.unlinkSync(req.body.mainImage);
        const locationUrl = data.Location;
        pool.query(`INSERT INTO products (productName,tagLine,productDescript,category,subCategory,pricePerUnit,minOrder,maxOrder,leadTime,sellerId,sellerName,mainImage,createdOn)
            VALUES(
                ${req.body.productName},
                ${req.body.tagLine},
                ${req.body.productDescript},
                ${req.body.category},
                ${req.body.subCategory},
                ${req.body.pricePerUnit},
                ${req.body.minOrder},
                ${req.body.maxOrder},
                ${req.body.leadTime},
                ${req.body.sellerId},
                ${req.body.sellerName},
                ${locationUrl},
                ${moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')}
                )`, (req, res, next) => {
                    if (err){
                        console.log('error when trying to connect to database', err)
                    } else {
                        console.log(res);
                    }

                }
        )
    }
    });
};

module.exports = {createProduct}

products.js

const express = require('express');
const productsRouter = express.Router();
const multer = require('multer');
const upload = multer({ dest: 'temp/'})
const { createProduct } = require('../controllers/productController');



productsRouter.post('/', upload.single('mainImage'), createProduct);



module.exports = productsRouter;
javascript mysql amazon-web-services express multer
1个回答
0
投票

[...],但我无法获取文件路径显示在我的params对象的主体中,以便可以将其传输到AWS。

文件路径实际上不会包含在req.body中。 Multer添加带有该信息的req.file对象:

const createProduct = (req, res) => {
  var filePath = req.file.path;
  // [...]
}
© www.soinside.com 2019 - 2024. All rights reserved.