【问题标题】:vue express uploading multiple files to amazon s3vue express 将多个文件上传到亚马逊 s3
【发布时间】:2019-02-02 07:32:15
【问题描述】:

我需要有关如何在亚马逊 S3 上上传多个文件图像的帮助。我假设我有三个这样的输入

<template lang="html">
 <form enctype="multipart/form-data" @submit.prevent="sendFile">
  <input type="file" ref="file1" @change="selectFile1">
  <input type="file" ref="file2" @change="selectFile2">
  <input type="file" ref="file3" @change="selectFile3">
  <div class="field">
   <button class="button is-info">Send</button>
  </div>
 </form>
</template>

我的前端 vue 脚本是这样的

<script>
 import _ from 'lodash'

 export default {
  name: 'BulkUpload',



data() {
    return {
      file: "",
      message: "",
      error: false,
      sendFiles: []
    }
  },

  methods: {
    selectFile1() {
      this.file = this.$refs.file1.files[0]
      this.sendFiles.push(this.file)
      console.log(this.sendFiles);
    },

    selectFile2() {
      this.file = this.$refs.file2.files[0]
      this.sendFiles.push(this.file)
      console.log(this.sendFiles);
    },

    selectFile3() {
      this.file = this.$refs.file3.files[0]
      this.sendFiles.push(this.file)
      console.log(this.sendFiles);
    },

    sendFile() {

      let formData = new FormData()
      _.forEach(this.uploadFiles, file => {
        formData.append('file', file)
      })

      var self = this
      axios.post('http://localhost:3000/image/bulkupload', formData)
      .then(function(response) {
        console.log(response);
        self.message = "File has been uploaded"
        self.file = ""
        self.error = false
      })
      .catch(function(err) {
        self.message = "Something went wrong"
        self.error = true
        console.log(err);
      })
    }
  }
}
</script>

使用 formData 将其发送到快递服务器后,我的图像路由将使用此代码处理它

const sendingImage = require('../helper/sendingImage');

    router.post('/bulkupload', sendingImage.upload.array("file"), (req, res) => {
  var promises=[];
  for(var i = 0; i < req.files.length; i++) {
    var file = req.files[i];
    promises.push(sendingImage.uploadLoadToS3(file));
  }
  Promise.all(promises).then(function(data){
    res.send('Uploadedd');
    console.log('success');
  }).catch(function(err) {
    console.log('failed');
    res.send(err.stack);
  })
})

我的助手看起来像这样

const multer = require('multer');
const aws = require('aws-sdk');

aws.config.update({
  accessKeyId: <my access id>,
  secretAccessKey: <my secret key>
})

const upload = multer({
  dest: './uploads/'
})

function uploadLoadToS3(ObjFile){
  var params = {
    ACL :'public-read',
    Body : new Buffer(ObjFile.buffer),
    Bucket:'vue-express-upload',
    ContentType:ObjFile.mimetype,
    Key:ObjFile.originalname
  }
  return s3.upload(params).promise();
}

module.exports = {
  upload,
  uploadLoadToS3
}

说实话,我的代码没有任何问题。它发送响应状态 200 没有任何错误。 但问题是,当我检查我的 S3 存储桶时,它没有任何上传的文件。它仍然是空的。 我的代码有什么问题吗?

【问题讨论】:

  • 尽快删除您的 Aws 机密,它们可能已经泄露。
  • @Helpinghand 谢谢你提醒我。
  • 为了安全起见,您应该在 aws 上更改您的密钥。
  • @Helpinghand 我通常使用 .env,但我现在忘记了
  • 文件在缓冲区中吗?已经检查如果是,我使用s3.putObject(params) 函数进行测试。

标签: node.js express amazon-s3 vue.js upload


【解决方案1】:

我找到的使用 aws-sdk 的解决方案。好在我也会使用这个解决方案和我的项目。

致谢:StackOver - Answer 参考:Multer-s3

在你的帮助文件中,你会这样:

const aws = require('aws-sdk')
const multer = require('multer')
const multerS3 = require('multer-s3')

aws.config = new aws.Config({
    accessKeyId: <my access id>,
    secretAccessKey: <my secret key>,
    region: <my region>
})
const s3 = new aws.S3()
const upload = multer({
    storage: multerS3({
    s3: s3,
    acl: 'public-read',
    bucket: 'vue-express-upload',
    contentType: function(req, file,cb){
        cb(null, file.mimetype)
    },
    key: function (req, file, cb) {
        cb(null, file.originalname)
    }
    })
})

module.exports = upload

您还可以将文件的键更改为更独特的内容,例如日期/分钟/秒。由您自行决定,我使用文件名作为密钥。

在您的路由器中,路由将如下所示:

const upload = require('../helper/sendingImage')

router.post('/bulkupload', upload.array('files'), (req, res) => {
    console.log('success')
    //console.log(req.files)
    res.send('Uploadedd')
    //res.send(req.files)    
})

查看上传数据:

router.post('/bulkupload', upload.array('files'), (req, res) => {
    res.send({
        status: 200,
        data: {
            sucess: true,
            file: req.files
        }
    })   
})

如果没有中间件文件,则根本不会发送。不会返回错误。唯一可以返回的错误是 AWS 访问信息。

注意:我用的是邮递员。

【讨论】:

  • 我在我的助手中找不到“../config/aws-config.json”。它给出“找不到模块'../config/aws-config.json'”的输出。你在哪里找到你的配置文件夹?
  • 顺便说一句,如果我不需要 aws-config.json,它会给出“配置中缺少凭据”的错误
  • 是的,但您必须将您的凭据放入 aws.config。您可以删除 aws-config.json 要求并将您的直接访问设置放在 aws.config 中。
  • 我已经编辑了帖子,可以删除 aws-config 导入并代替 aws.config 放置您的 aws 凭据。
  • 谢谢老兄,它有效。所以在那之后我们可以将图像链接保存到猫鼬数据库吗?
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
相关资源
最近更新 更多