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
onFileUploadComplete