【问题标题】:Upload file to aws S3 bucket using absolute path使用绝对路径将文件上传到 aws S3 存储桶
【发布时间】:2020-11-02 15:10:25
【问题描述】:

我正在尝试将文件从 Express ejs 上传到 AWS s3 存储桶,我这样做是成功的,但是当我尝试从我的 index.js 所在位置以外的其他目录或文件夹中选择文件时,它不接受该文件并抛出错误文件未找到。

index.js



'use strict';

const express = require('express');
const app = express();
const multer  = require('multer');
const multerS3 = require('multer-s3');
const AWS = require('aws-sdk');
const bodyParser = require('body-parser');

const s3 = new AWS.S3({
    accessKeyId: '',
    secretAccessKey: ''
});

app.use(bodyParser.urlencoded({extended : true})); 
app.set('view engine', 'ejs'); 



const uploadS3 = multer({
  storage: multerS3({
    s3: s3,
    bucket: '',
    metadata: (req, file, cb) => {
      cb(null, {fieldName: file.fieldname})
    },
    key: (req, file, cb) => {
      cb(null, Date.now().toString() + '-' + file.originalname)
    }
  })
});

test.ejs

<html>
  <form method="post" action="/upload">
    <input type="file" name="file" />
    <input type="submit" />
  </form>
</html>

route.js


var fileupload = require('../../common/service/file-upload');
//some code in between 

app.post('/upload', fileupload.uploadS3.single('file'),(req, res) => {
  console.log(req.file);
});


【问题讨论】:

  • 你能添加代码如何选择文件吗?
  • 我添加了 test.ejs 是我的 express js 文件, 我从中选择文件
  • 每当您上传文件时,您需要将属性添加到表单 enctype="multipart/form-data"。 .然后它会工作。我建议你使用multer-s3包在aws上上传文件。npmjs.com/package/multer-s3
  • 题外话:不要!!!硬编码您的凭据,使用环境变量

标签: javascript node.js express amazon-s3 file-upload


【解决方案1】:

每当您上传文件时,您需要将属性添加到表单 enctype="multipart/form-data"。 .然后它会工作。 将文件上传到 s3 使用配置简单的 multer-s3 包 参考:https://www.npmjs.com/package/multer-s3

所以你的 test.ejs 文件会是这样的

   <html>
     <form method="post" action="/upload" enctype="multipart/form-data">
       <input type="file" name="file" />
      <input type="submit" />
      <const/form>
   </html>
   

和 index.js

    const express = require('express');
    const bodyParser = require('body-parser');
    const AWS = require('aws-sdk');
    const multer = require('multer')
    const multerS3 = require('multer-s3')



    const app = express();
    const s3 = new AWS.S3({
        accessKeyId: //aws access key ,
        secretAccessKey: //aws secret key
    });

        const upload = multer({
          storage: multerS3({
            s3: s3,
            bucket: 'some-bucket',
            metadata: function (req, file, cb) {
              cb(null, {fieldName: file.fieldname});
            },
            key: function (req, file, cb) {
              cb(null, Date.now().toString())
            }
          })
        })



    app.post('/', upload.single('file'), (req, res) => {
      res.json({
        message: "File uploaded to S3"
      });
    });

【讨论】:

  • 嗨,当我在我的 route.js 文件中添加 app.post('', upload.single('file') 时,它显示 typerror 无法读取未定义的属性单。
  • 您是否按照指定的方式定义了上传、S3 参数?您能展示一下您的代码是如何添加的吗?
  • 你好,我已经添加了 route.js 文件并更新了 index.js 文件。
【解决方案2】:

伙计,Express 如何通过路径读取客户端的文件?文件在 POST 请求中上传/发送。

使用一些支持multipart/form-data文件上传的正文解析器,如mutler,从请求中解析文件并将其上传到S3。

例如...

html

<html>
  <!-- don't forget enctype parameter -->
  <form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" />
  </form>
</html>

节点服务器手动使用AWSmulter

const multer = require('multer'),
      AWS = require('aws-sdk'),
      S3 = new AWS.S3({
        ...
      });

router.post('/', multer().single('file'), (req, res) => {
  // debug req.file
  console.log(req.file);
  
  S3.upload({
    Bucket: '...',
    Key: req.file.originalname, 
    Body: req.file.buffer
  }, (err, res) => {
    if (err) throw err;
    res.json({
      message: "File uploaded to S3"
    });
  });
});

节点服务器使用multer-s3

const multer = require('multer'),
      multerS3 = require('multer-s3'),
      AWS = require('aws-sdk'),
      S3 = new AWS.S3({
        ...
      });

let upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: '...',
    key: (req, file, cb) 
      => cb(null, file.originalname), // or whatever Key you like
  })
});

router.post('/', upload.single('file'), (req, res) => {
  res.json({
    message: "File uploaded to S3"
  });
});

【讨论】:

  • 为什么不使用专门用于将文件上传到 aws s3 存储桶的 multer-s3 包。 npmjs.com/package/multer-s3 配置简单
  • 我不是专家,但只要我尝试通过 console.log 了解所选文件名,这些将在没有 body-parser 的情况下通过未定义的错误工作
  • 他以错误的方式添加元数据参数且未添加关键参数。在配置multer。 @rohan 也参考了这个npmjs.com/package/multer-s3
猜你喜欢
  • 2018-04-25
  • 2021-02-07
  • 2015-09-10
  • 2020-03-17
  • 2012-09-08
  • 2017-10-17
  • 2017-11-10
  • 2021-09-09
  • 2012-05-28
相关资源
最近更新 更多