如何上传文件 - sails.js

时间:2014-12-22 18:21:48

标签: javascript node.js npm sails.js

我可以下载图片和pdf,但我无法下载文件文件(.doc .pptx .odt ...)

当下载Documents(.doc .pptx .odt ...)作为.ZIP仅下载XML文件时。 我能做什么?

我正在使用:fill out upload file docs

upload: function (req, res) {
  req
    .file('avatar')
    .upload({
      maxBytes: 10000000
    }, function whenDone(err, uploadedFiles) {
      if (err) {
        return res.negotiate(err);
      }

      // Generate a unique URL where the avatar can be downloaded.
      avatarUrl = require('util').format('%s/user/avatar/%s', sails.getBaseUrl(), req.session.User.id_user),
      // Grab the first file and use it's `fd` (file descriptor)
      avatarFd = uploadedFiles[0].fd

      var SkipperDisk = require('skipper-disk');
      var fileAdapter = SkipperDisk(/* optional opts */);

      // Stream the file down
      fileAdapter.read(avatarFd).on('error', function (err){
        return res.serverError(err);
      }).pipe(res);

  });
},

3 个答案:

答案 0 :(得分:3)

我在Windows上使用它,它没有问题。

upload  : function (req, res) {
  req.file('avatar').upload({
    maxBytes: 10000000
  }, function whenDone(err, uploadedFiles) {
    if (err) {
      return res.negotiate(err);
    }

    var avatarFd = uploadedFiles[0].fd;

    res.ok(avatarFd);

  });
},
download: function (req, res) {
  var location = req.param('fd');
  var SkipperDisk = require('skipper-disk');
  var fileAdapter = SkipperDisk(/* optional opts */);
  fileAdapter.read(location).on('error', function (err) {
    return res.serverError(err);
  }).pipe(res);
}

首先使用/somecontroller/upload使用multipart/form-data上传它,它将返回fd位置。并使用此URL下载

http://localhost:1337/somecontroller/download?fd=[fd-from-upload-return]

控制器名称和主机名取决于您的应用程序配置。

使用fd完整路径仅作为示例,在生产之后您应该使用自己的控制器从上传的文件夹中寻址以返回已上传的文件,它通常在{{1}上}。

答案 1 :(得分:2)

因此,您正在使用属于Sails.js生态系统的库Skipper。它有一些可能对您有帮助的文档。

在您选择对其执行某些操作之前,它会将您的文件保存为上传时的随机GUID。我的猜测是它没有携带" .docx"当它这样做时标记它.docx文件实际上只是拉链。 (也许这是你可以提交的错误?)

我的建议是使用saveAs选项。您可以指定要用作保存位置的字符串。即:

req.file('file_upload').upload({saveAs: Guid.raw()+'.docx'}, handleUploadCompletion);

还可以传递函数,以便根据流处理多文件上传。

答案 2 :(得分:2)

我认为你在回复中遗忘了一些HTTP headers

  • 内容处理:设置您要发送的文件的名称
    • e.g。 "附件;文件名=" ecd1c7c2-6e32-4110-8905-c003a4713bb0.odt""
  • 内容类型:您要发送的内容的MIME类型
    • e.g。 "应用/ vnd.oasis.opendocument.text"

您可以手动设置它们或使用res.attachment方法:

res.attachment(avatarFd);