使用aws-sdk和Node / Express将简单的文件上传到S3 [英] Simple file upload to S3 using aws-sdk and Node/Express
问题描述
$ b
HTML
< html>
< body>
< form method =POSTaction =/ uploadenctype =multipart / form-data>
< div class =field>
< label for =image>图片上传< / label>
< input type =filename =imageid =image>
< / div>
< input type =submitclass =btnvalue =Save>
< / form>
< / body>
< / html>
端口
5000是我的节点.js 服务器的端口。
在这个例子中,我使用 POST
到 /上传
,它工作正常。
module.exports = function(app,models) {
var fs = require('fs');
var AWS = require('aws-sdk');
var accessKeyId = process.env.AWS_ACCESS_KEY || XXXXXX;
var secretAccessKey = process.env.AWS_SECRET_KEY || + XXXXXX + B + XXXXXXX;
AWS.config.update({
accessKeyId:accessKeyId,
secretAccessKey:secretAccessKey
});
var s3 = new AWS.S3();
$ b $ app.post('/ upload',function(req,res){
var params = {
存储桶:'makersquest',
Key:'myKey1234.png',
Body:Hello
};
s3.putObject(params,function(perr,pres){
if perr){
console.log(Error uploadloading data:,perr);
} else {
console.log(成功上传数据到myBucket / myKey);
}
});
});
现在我要发布我是 POST
ing,这就是出现问题的地方。
module.exports = function (应用程序,模型){
var fs = require('fs');
var AWS = require('aws-sdk');
var accessKeyId = process.env.AWS_ACCESS_KEY || XXXXXX;
var secretAccessKey = process.env.AWS_SECRET_KEY || + XXXXXX + B + XXXXXXX;
AWS.config.update({
accessKeyId:accessKeyId,
secretAccessKey:secretAccessKey
});
var s3 = new AWS.S3();
$ b app.post('/ upload',function(req,res){
var path = req.files.image.path;
fs.readFile(path,function (err,file_buffer){
var params = {
桶:'makersquest',
键:'myKey1234.png',
正文:file_buffer
};
$ b $ s .putObject(params,function(perr,pres){
if(perr){
console.log(Error uploadloading:,perr);
} else {
console.log(成功上传数据到myBucket / myKey);
}
});
});
});
$ / code>
我得到的错误是:
TypeError:无法读取未定义的属性'path'
事实上 files
完全是空的。
我假设我错过了一些非常明显的东西,但我似乎无法找到
解决方案 您需要像 multer
来处理多部分上传。
这是一个使用 aws-sdk
将文件上传到s3的例子。
var multer = require('multer');
var AWS = require('aws-sdk');
var accessKeyId = process.env.AWS_ACCESS_KEY || XXXXXX;
var secretAccessKey = process.env.AWS_SECRET_KEY || + XXXXXX + B + XXXXXXX;
AWS.config.update({
accessKeyId:accessKeyId,
secretAccessKey:secretAccessKey
});
var s3 = new AWS.S3();
app.use(multer({// https://github.com/expressjs/multer
dest:'./public/uploads/',
limits:{ fileSize:100000},
rename:function(fieldname,filename){
return filename.replace(/ \W + / g,' - ')。toLowerCase();
},
onFileUploadData:
// file:{fieldname,originalname,name,encoding,mimetype,path,extension,size,truncated,buffer}
var(file,data,req,res) datams
$ b $ s $ {
$ {
$:函数(perr,pres){
if(perr){
console.log(Error uploadloading:,perr);
} else {
console.log(成功将数据上传到myBucket / myKey);
}
});
}
}));
$ b app.post('/ upload',function(req,res){
if(req.files.image!== undefined){//`image`是字段名从你的表单
res.redirect(/ uploads); // success
} else {
res.send(error,no file selected);
}
});
I am at a loss of what I am doing wrong, here is what I have:
HTML
<html>
<body>
<form method="POST" action="/upload" enctype="multipart/form-data">
<div class="field">
<label for="image">Image Upload</label>
<input type="file" name="image" id="image">
</div>
<input type="submit" class="btn" value="Save">
</form>
</body>
</html>
Port
5000 is my Node.js server's port.
In this example I am using POST
to /upload
, and it works fine.
module.exports = function(app, models) {
var fs = require('fs');
var AWS = require('aws-sdk');
var accessKeyId = process.env.AWS_ACCESS_KEY || "xxxxxx";
var secretAccessKey = process.env.AWS_SECRET_KEY || "+xxxxxx+B+xxxxxxx";
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});
var s3 = new AWS.S3();
app.post('/upload', function(req, res){
var params = {
Bucket: 'makersquest',
Key: 'myKey1234.png',
Body: "Hello"
};
s3.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});
});
}
Now I want to post the file that I am POST
ing, which is where the problem arises.
module.exports = function(app, models) {
var fs = require('fs');
var AWS = require('aws-sdk');
var accessKeyId = process.env.AWS_ACCESS_KEY || "xxxxxx";
var secretAccessKey = process.env.AWS_SECRET_KEY || "+xxxxxx+B+xxxxxxx";
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});
var s3 = new AWS.S3();
app.post('/upload', function(req, res){
var path = req.files.image.path;
fs.readFile(path, function(err, file_buffer){
var params = {
Bucket: 'makersquest',
Key: 'myKey1234.png',
Body: file_buffer
};
s3.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});
});
});
}
The error I get is:
TypeError: Cannot read property 'path' of undefined
As a matter of fact files
is completely empty.
I am assuming I am missing something pretty obvious but I can't seem to find it.
解决方案 You will need something like multer
to handle multipart uploading.
Here is an example streaming your file upload to s3 using aws-sdk
.
var multer = require('multer');
var AWS = require('aws-sdk');
var accessKeyId = process.env.AWS_ACCESS_KEY || "xxxxxx";
var secretAccessKey = process.env.AWS_SECRET_KEY || "+xxxxxx+B+xxxxxxx";
AWS.config.update({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});
var s3 = new AWS.S3();
app.use(multer({ // https://github.com/expressjs/multer
dest: './public/uploads/',
limits : { fileSize:100000 },
rename: function (fieldname, filename) {
return filename.replace(/\W+/g, '-').toLowerCase();
},
onFileUploadData: function (file, data, req, res) {
// file : { fieldname, originalname, name, encoding, mimetype, path, extension, size, truncated, buffer }
var params = {
Bucket: 'makersquest',
Key: file.name,
Body: data
};
s3.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});
}
}));
app.post('/upload', function(req, res){
if(req.files.image !== undefined){ // `image` is the field name from your form
res.redirect("/uploads"); // success
}else{
res.send("error, no file chosen");
}
});
这篇关于使用aws-sdk和Node / Express将简单的文件上传到S3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文