【问题标题】:How to upload pdf file to s3 in javascript?如何在javascript中将pdf文件上传到s3?
【发布时间】:2019-04-23 05:39:30
【问题描述】:

我需要将 pdf 文件从 UI(用 Javascript 编写)上传到 Amazon S3,但我正在尝试将文件上传到 S3,我得到一些 unicode 格式的文本,当我将该文本复制到记事本时,或者说, 任何其他文本编辑器我都可以阅读人类可读的文本

我正在使用 pdfmake 获取文件内容并使用 getBuffer 方法上传。

var content = generatePDF(base64Img);
pdfMake.createPdf(content).getBuffer(function (data) {//Code}

我用来将文件上传到 S3 的代码。

 var params = {
        Bucket: bucketName,
        Key: file_name,
        Body: data.toString(),
        ContentType: 'application/pdf'
      }

      s3.upload(params, function (err, data) {
        if (err) {
        // code 
        }else{
         //code
}

文件已成功上传,但我收到的文本类似于

!
 " #$%&!' ()*')+,
!
!
!
!

但我正在将它粘贴到其他文本编辑器,我得到了

Date: 04/20/19

【问题讨论】:

  • 只需删除 ToString() 表单数据,然后尝试。
  • 当我删除 toString() 时,出现以下错误:TypeError: a._set is not a function

标签: node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

要将文件从客户端直接上传到 s3 存储桶,您可以使用 multer-s3

来自客户端:

axios.post(url, data, {
        onUploadProgress: ProgressEvent => {
          this.setState({
            loaded: (ProgressEvent.loaded / ProgressEvent.total * 100),
          })
        },
      })
        .then(res => { // then print response status
          toast.success('Upload Success!')
        })
        .catch(err => { // then print response status
          toast.error('Upload Failed!')
        })

服务器端:

    const upload = multer({
    storage: multerS3({
    s3: s3,
    acl: 'public-read',
    bucket: BUCKET_NAME,
    key: function (req, file, cb) {
      UPLOADED_FILE_NAME = Date.now() + '-' + file.originalname;
      cb(null, UPLOADED_FILE_NAME);
      }
     })
    }).array('file');

    app.post('/upload', function (req, res) {
      upload(req, res, function (err) {

        if (err instanceof multer.MulterError) {
          return res.status(500).json(err)
          // A Multer error occurred when uploading.
         } else if (err) {
           return res.status(500).json(err)
          // An unknown error occurred when uploading.
       }
      console.log('REQUEST FILE IS', UPLOADED_FILE_NAME)
      return res.status(200).send(UPLOADED_FILE_NAME)

      // Everything went fine.
      })
});

【讨论】:

    【解决方案2】:

    我通过将数据从 getBuffer 传递到 S3 解决了上述问题。 在 S3 中,我传递给一个像

    这样的缓冲区

    var data = new Buffer(event.data, 'binary');

    已将数据上传到 S3。

    var params = {
            Bucket: bucketName,
            Key: file_name,
            Body: data,
            ContentType: 'application/pdf'
          }
    
          s3.upload(params, function (err, data) {
            if (err) {
            // code 
            }else{
             //code
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2020-10-17
      • 1970-01-01
      • 2017-12-20
      • 2021-05-18
      • 2017-07-23
      • 2011-05-27
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多