问题描述
我不知道我做错了什么,这是我所拥有的:
HTML
Port
5000 是我的 Node.js 服务器的端口.
在这个例子中,我使用 POST
到 /upload
,它工作正常.
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+xxxxxx";AWS.config.update({accessKeyId: accessKeyId,秘密访问密钥:秘密访问密钥});var s3 = 新的 AWS.S3();app.post('/上传', 函数(req, res){变量参数 = {桶:'makerquest',密钥:'myKey1234.png',身体:你好"};s3.putObject(params, function (perr, pres) {如果(perr){console.log("上传数据出错:", perr);} 别的 {console.log("成功上传数据到 myBucket/myKey");}});});}
现在我要发布我正在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+xxxxxx";AWS.config.update({accessKeyId: accessKeyId,秘密访问密钥:秘密访问密钥});var s3 = 新的 AWS.S3();app.post('/上传', 函数(req, res){var path = req.files.image.path;fs.readFile(路径,函数(错误,file_buffer){变量参数 = {桶:'makerquest',密钥:'myKey1234.png',正文:file_buffer};s3.putObject(params, function (perr, pres) {如果(perr){console.log("上传数据出错:", perr);} 别的 {console.log("成功上传数据到 myBucket/myKey");}});});});}
我得到的错误是:
类型错误:无法读取未定义的属性路径"
事实上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+xxxxxx";AWS.config.update({accessKeyId: accessKeyId,秘密访问密钥:秘密访问密钥});var s3 = 新的 AWS.S3();app.use(multer({//https://github.com/expressjs/multerdest: './public/uploads/',限制:{文件大小:100000},重命名:函数(字段名,文件名){返回文件名.replace(/W+/g, '-').toLowerCase();},onFileUploadData:函数(文件、数据、请求、资源){//文件 : { fieldname, originalname, name, encoding, mimetype, path, extension, size, truncated, buffer }变量参数 = {桶:'makerquest',键:文件名,正文:数据};s3.putObject(params, function (perr, pres) {如果(perr){console.log("上传数据出错:", perr);} 别的 {console.log("成功上传数据到 myBucket/myKey");}});}}));app.post('/上传', 函数(req, res){if(req.files.image !== undefined){//`image` 是表单中的字段名称res.redirect("/上传");//成功}别的{res.send("错误,没有选择文件");}});
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:
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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!