【问题标题】:Upload file via AngularJS and NodeJS,通过 AngularJS 和 NodeJS 上传文件,
【发布时间】:2015-11-18 18:27:34
【问题描述】:

我现在正在使用 Express4 并想将文件上传到服务器的文件系统。 (例如,将文件保存在public/files 文件夹中。)

关于如何使用formidablebusboy 解析请求有几个问题,如下例:

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 来获取元数据,比如文件路径、名称、大小等。但是,如果我想将不同的文件发布到不同的端点,我想使用 angularjs 控制器和服务结构来处理上传。

想知道如何获取控制器/服务的文件路径、名称等并将它们发布到后端。然后我可以使用以下代码上传文件。

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,但它只能获取文件大小等信息,而不能获取非常重要的文件路径。

请指教,非常感谢。

【问题讨论】:

    标签: javascript angularjs node.js multipart formidable


    【解决方案1】:

    对于节点/快递方面:

    查看https://github.com/expressjs/multer

    对于角边:

    查看https://github.com/danialfarid/ng-file-upload

    它使上传和保存单个或多个文件变得超级容易。他们有一个选项可以让目录自动保存到。

    https://github.com/expressjs/multer#multeropts

    【讨论】:

    • @LongshengZhou 如果这是答案,请标记一下吗?
    • 我正在使用另一种解决方案,但是,我也会将您的解决方案标记为一个好的答案。
    • 你也是!@technicallyjosh
    【解决方案2】:

    文件路径将是您的文件路径。因此,如果它在路由中,则路径将是该目录。使用节点核心模块path = require ('path') 将公开__dirname,这将让您在需要时使用核心模块更改路径。路径是相对于您的系统的,您不会通过发布请求获得客户端路径。

    编辑: 看完标准https://w3c.github.io/FileAPI/#attributes-blob

    您无法获取文件路径。这是合乎逻辑的,因为这可能会侵犯隐私。另一方面,如果您在节点 WebKit 上开发,您的应用程序将可以通过使用节点核心模块路径访问用户文件系统。

    【讨论】:

    • 谢谢,但我很困惑。我正在寻找要上传的文件的路径,比如C:\\user\John\images\car.jpg,你在回答吗?
    • 所以在挖掘了强大的 index.js 之后,我注意到该函数并没有寻找与客户端关联的潜在文件路径。为了得到它,我建议查看 MDN developer.mozilla.org/en-US/docs/Web/API/FormData/…,它表明可以发送 blob 以形成文件上传的数据。因此,您需要从传递给表单数据的 blob 开始,以确定 javascript 是否甚至从用户 blob 收集它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2020-06-22
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多