通过 AngularJS 和 NodeJS 上传文件,
Upload file via AngularJS and NodeJS,
我现在用的是Express4,想上传文件到服务器的文件系统。 (例如,将文件保存在 public/files
文件夹中。)
关于如何使用 formidable
或 busboy
解析请求,有几个问题,例如:
var formidable = require('formidable'),
http = require('http'),
util = require('util');
http.createServer(function(req, res) {
if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
}
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
}).listen(8080);
这样的中间件可以解析 req
来获取元数据,比如文件路径、名称、大小等。但是,如果我想 POST 不同的文件到不同的端点,我想使用 angularjs 控制器和服务结构来处理上传。
想知道如何将文件路径、名称等 controller/service 和 post 获取到后端。然后我可以使用下面的代码上传文件。
api.post(url, function(req, res) {
var fs = require('fs');
//req.body.path: path of file, like, C:\user\John\.....
//req.body.filename: name of file, like images.jpg
fs.readFile(req.body.path, function(err, data){
var uploadToPath = './public/files/' + req.body.filename;
fs.writeFile(uploadToPath, data, function(err){
if(err) {
res.send(err);
return;
}
});
});
});
我也指的是this solution,但是它只能获取文件大小之类的信息,而不能获取非常重要的文件路径。
请多多指教,万分感谢
文件路径将是您在 express 中的文件路径。因此,如果它在路由中,则路径将是该目录。使用将公开 __dirname
的节点核心模块 path = require ('path')
,让您可以在需要时使用核心模块更改路径。路径是相对于您的系统的,您不会通过 post 请求获得客户端路径。
编辑:
看完标准https://w3c.github.io/FileAPI/#attributes-blob
您无法获取文件路径。这是合乎逻辑的,因为这可能是一种潜在的隐私侵犯。另一方面,如果您在节点 WebKit 上进行开发,您的应用程序将可以通过使用节点核心模块路径访问用户文件系统。
对于node/express方:
查看 https://github.com/expressjs/multer
对于angular方:
查看 https://github.com/danialfarid/ng-file-upload
它使上传和保存单个或多个文件变得超级容易。他们有一个选项可以让目录自动保存到。
我现在用的是Express4,想上传文件到服务器的文件系统。 (例如,将文件保存在 public/files
文件夹中。)
关于如何使用 formidable
或 busboy
解析请求,有几个问题,例如:
var formidable = require('formidable'),
http = require('http'),
util = require('util');
http.createServer(function(req, res) {
if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
return;
}
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
}).listen(8080);
这样的中间件可以解析 req
来获取元数据,比如文件路径、名称、大小等。但是,如果我想 POST 不同的文件到不同的端点,我想使用 angularjs 控制器和服务结构来处理上传。
想知道如何将文件路径、名称等 controller/service 和 post 获取到后端。然后我可以使用下面的代码上传文件。
api.post(url, function(req, res) {
var fs = require('fs');
//req.body.path: path of file, like, C:\user\John\.....
//req.body.filename: name of file, like images.jpg
fs.readFile(req.body.path, function(err, data){
var uploadToPath = './public/files/' + req.body.filename;
fs.writeFile(uploadToPath, data, function(err){
if(err) {
res.send(err);
return;
}
});
});
});
我也指的是this solution,但是它只能获取文件大小之类的信息,而不能获取非常重要的文件路径。
请多多指教,万分感谢
文件路径将是您在 express 中的文件路径。因此,如果它在路由中,则路径将是该目录。使用将公开 __dirname
的节点核心模块 path = require ('path')
,让您可以在需要时使用核心模块更改路径。路径是相对于您的系统的,您不会通过 post 请求获得客户端路径。
编辑: 看完标准https://w3c.github.io/FileAPI/#attributes-blob
您无法获取文件路径。这是合乎逻辑的,因为这可能是一种潜在的隐私侵犯。另一方面,如果您在节点 WebKit 上进行开发,您的应用程序将可以通过使用节点核心模块路径访问用户文件系统。
对于node/express方:
查看 https://github.com/expressjs/multer
对于angular方:
查看 https://github.com/danialfarid/ng-file-upload
它使上传和保存单个或多个文件变得超级容易。他们有一个选项可以让目录自动保存到。