Загрузка файла NodeJs в AWS S3 - поврежденный файл - PullRequest
0 голосов
/ 30 сентября 2019

Я загружаю файл в S3 Bucket с помощью nodejs express. Это мой код:

HTML. Здесь я загружаю файл, используя Jquery formData

<form id="form" action="" method="post" enctype="multipart/form-data">
    <input type="file" name="image" id="image" />
    <input class='submit-input' type="submit" value="Submit" />
</form>


<script src="/js/jquery.js"></script>
<script>
    $(document).ready(function(e){

    $("#form").on('submit', function(e){

        e.preventDefault();
        $.ajax({
            type: 'POST',
            url: '/api/upload-image',
            data: new FormData(this),
            contentType: false,
            cache: false,
            processData:false,
            beforeSend: function(){
                $('.submit-input').attr("disabled","disabled");
            },
            success: function(response){ //console.log(response);
                $(".submit-input").removeAttr("disabled");
            }
        });
    });
});
</script>

BACKEND NODEJS

В бэкэнде я использую multer для управления файлом и загружаюна s3, следуя документу aws-sdk.

var express = require('express');

const router = express.Router();

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

const fs = require('fs');

//multer
const multer = require('multer')
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, '/tmp/')
    },
    filename: function (req, file, cb) {
      cb(null, file.fieldname + '-' + Date.now())
    }
  })
const upload = multer({ storage: storage })

router.post('/api/upload-image', upload.single('image'), async (req, res) => {

  var file = req.file;

  AWS.config.update({
    accessKeyId: process.env.AWS_PUBLIC,
    secretAccessKey: process.env.AWS_SECRET,
    region: process.env.AWS_REGION
});

var re = /(?:\.([^.]+))?$/;
var ext = re.exec(file.originalname)[1]

const uniqueKey = 'testDir/'+uuidv4()+'.'+ext;

var buffer = fs.readFileSync(file.path, null)

let params = {
    Bucket: process.env.AWS_S3_BUCKET,
    Key: uniqueKey,
    Body: buffer,
    ContentType: file.mimetype
};

let uploadPromise = await new AWS.S3().putObject(params).promise();

  return res.status(201).json({});

  });

Все это работает хорошо, серверная часть получает файл, я могу напечатать его в консоли (и посмотреть имя, тип mime, размер и т. д.) и файлэто загрузка в ведро s3. Но файл не читается (возможно, поврежден), и я не вижу этого. Размер нечитаемого файла такой же, как и у исходного файла. (с файлом без изображения все выглядит правильно).

Я попытался загрузить в s3 файл из моего публичного каталога, и все работает хорошо. Поэтому я предполагаю, что моя ошибка связана с загрузкой jquery и извлечением бэкэнда.

1 Ответ

0 голосов
/ 10 октября 2019

Передача через AWS API Gateway. Мне нужно включить multipart / form-data. Решено в соответствии с этим руководством https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html

...