繁体   English   中英

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

[英]Upload a file to S3 via express, using Multer?

我有一个通过“/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

产品控制器.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.file.path);
        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}

产品.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;

[...] 但我无法让文件的路径显示在我的参数 object 的正文中,以便可以将其传输到 AWS。

文件路径实际上不会包含在req.body中。 Multer 添加了一个包含该信息的req.file object:

const createProduct = (req, res) => {
  var filePath = req.file.path;
  // [...]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM