【发布时间】:2015-12-10 16:58:26
【问题描述】:
我是 Node.js/Express 的新手,正在尝试将简单的文件上传到 Azure blob 存储。我正在使用 AngularJS 作为前端表单。当我尝试上传文件时,我收到以下错误:
TypeError: 无法读取未定义的属性“myfile”
我见过一些例子,他们利用了一个名为 multiparty 的节点模块,但不确定它是否适用于这种基本的上传需求。来自 jQuery/前端 JavaScript 世界,在某些情况下,我需要对我的文件进行 base64 编码以便上传。在这种情况下是这样吗?还是我只是错过了一个简单的传递,以便 Node/Express 可以读取“myfile”?
由于 Express 有自己的路由器,并且我有 AngularJS 路由,这会导致问题吗?
这是我在 AngularJS 视图中的表单:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="myfile" />
<input type="submit" value="Upload" />
</form>
这是我的 server.js 配置。请注意,我使用的是 Azure blob 存储:
var express = require('express');
var azure = require('azure-storage');
// Initialize Express App
var app = express();
var port = process.env.port || 1337;
app.use(express.static(__dirname + "/public")).listen(port);
var accessKey = 'mykey';
var storageAccount = 'myblobaccount';
var blobSvc = azure.createBlobService(storageAccount,accessKey);
// Upload to Azure Blob Storate
app.post('/upload', function (req, res) {
var path = req.files.myfile.path;
blobSvc.createBlockBlobFromLocalFile('mycontainer', 'myblob.png', path, function (error, result, response) {
if (!error) {
console.log("Uploaded" + result);
// file uploaded
}
else {
console.log(error);
}
});
});
更新 1:
如果我使用以下内容,它会生成 POST 200 OK,但是当我使用 Azure 存储资源管理器之类的东西查看我的 Blob 容器时,该 Blob 不存在。
app.post('/upload2', function (req, res) {
var multiparty = require('multiparty');
var container = 'mycontainer';
var form = new multiparty.Form();
form.on('part', function (part) {
if (part.filename) {
var size = part.byteCount - part.byteOffset;
var name = part.filename;
blobSvc.createBlockBlobFromStream(container, name, part, size, function (error) {
if (error) {
//res.send(' Blob create: error ');
}
});
} else {
form.handlePart(part);
}
});
form.parse(req);
res.send('OK');
});
【问题讨论】: