我使用 NodeJS 和 Multer 将文件上传到 S3 。
从表面上看,一切似乎都在运行,文件上传了,当我登录 AWS 控制台时,我可以在bucket
中看到它们。但是,大多数情况下,当我按照文件链接时,文件被破坏,文件大小通常比原始文件小得多。
当文件到达服务器时,如果我log
,文件大小是正确的,但在 S3 上它要小得多。例如,我刚上传了一个151kb的文件。 post
请求正确记录文件大小,但在 S3 上,文件显示为81kb。
客户方:
uploadFile = (file) ->
formData = new FormData()
formData.append 'file', file
xhr = new XMLHttpRequest()
xhr.open "POST", "/upload-image", true
# xhr.setRequestHeader("Content-Type","multipart/form-data");
console.log 'uploadFile'
xhr.onerror = ->
alert 'Error uploading file'
xhr.onreadystatechange = ->
if xhr.readyState is 4
console.log xhr.responseText
xhr.send formData
服务器:
app.use(multer({ // https://github.com/expressjs/multer
inMemory: true,
limits : { fileSize:3000000 },
rename: function (fieldname, filename) {
var time = new Date().getTime();
return filename.replace(/\W+/g, '-').toLowerCase() + '_' + time;
},
onFileUploadData: function (file, data, req, res) {
var params = {
Bucket: creds.awsBucket,
Key: file.name,
Body: data,
ACL: 'public-read'
};
var s3 = new aws.S3();
s3.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data", pres);
}
});
}
}));
app.post('/upload-image', function(req, res){
if (req.files.file === undefined){
res.end("error, no file chosen");
} else if (req.files.file.truncated) {
res.end("file too large");
} else {
console.log(req.files.file.size); //logs the correct file size
var path = creds.awsPath + req.files.file.name;
res.type('text/plain');
res.write(path);
res.end();
};
});
编辑:
将file.buffer
设置为body
perma onFileUploadComplete
似乎有效,但我觉得这不是正确的做事方式,可能会回到以后咬我这种方法是否正常,或者我应该注意这些问题吗?