NodeJs 将文件上传到 AWS S3 - 损坏的文件
NodeJs upload file to AWS S3 - corrupted file
我正在使用 nodejs express 将文件上传到 S3 Bucket。
这是我的代码:
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>
后端节点
后台我用multer管理文件,按照aws-sdk文档上传到s3
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 存储桶。
但是该文件不可读(可能已损坏),我看不到它。不可读文件的大小与原始文件相同。 (没有图像文件看起来都是正确的)。
我尝试从我的 public 目录上传到 s3 文件,一切正常。所以我认为我的错误是在 jquery 上传和后端检索之间。
通过 AWS API 网关我需要启用 multipart/form-data。按照本指南解决 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html
我正在使用 nodejs express 将文件上传到 S3 Bucket。 这是我的代码:
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>
后端节点
后台我用multer管理文件,按照aws-sdk文档上传到s3
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 存储桶。 但是该文件不可读(可能已损坏),我看不到它。不可读文件的大小与原始文件相同。 (没有图像文件看起来都是正确的)。
我尝试从我的 public 目录上传到 s3 文件,一切正常。所以我认为我的错误是在 jquery 上传和后端检索之间。
通过 AWS API 网关我需要启用 multipart/form-data。按照本指南解决 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html