【问题标题】:upload a file in nodejs server with sails.js使用sails.js在nodejs服务器中上传文件
【发布时间】:2016-01-28 04:44:44
【问题描述】:

按照page 中的示例,我在节点上使用sails.js 创建了一个服务器,并带有一个端点以在服务器上上传文件。

完整代码如下:

req.file('file').upload({
  maxBytes: 10000000,
  dirname: './my-dir'
}, function whenDone (err, uploadedFiles) {
  var fs = require('fs');

  if (err) {
    return res.negotiate(err);
  }

  // If no files were uploaded, respond with an error.
  if (uploadedFiles.length === 0){
    return res.badRequest('No file was uploaded');
  }

  console.log('file exists:', fs.existsSync(uploadedFiles[0].fd));

  var path = uploadedFiles[0].fd;
  var tmpFileName = /[^/]*$/.exec(path)[0];
  var url = '/my-dir/'+tmpFileName;

  return res.send(url);
});

添加console.log 行只是为了确保在调用函数whenDone 时文件存在(并且每次调用时文件都已存在)。

问题是在客户端:当页面向这个端点发送一个文件并接收到来自服务器的响应时,它会尝试向同一个上传的文件(通常是图像)发送另一个请求并接收404。

使用console.log,我检查了该文件是否存在,并且我确定该 url 是正确的-side 代码在 90% 的情况下都有效(这意味着这是一个时间问题)。

当文件不仅被加载而且准备好发送到客户端时,是否会触发一些sails.js 事件?

提前致谢。

【问题讨论】:

    标签: javascript node.js file-upload sails.js


    【解决方案1】:

    从项目根目录中的.tmp 目录获取静态资产(在您的案例中是上传的文件)。当风帆升起时,.tmp 将被清理并填充所有资产(来自您的 assets 目录)。但是,当添加新文件时,它不会立即复制到.tmp,导致您提到的404s。

    要解决这个问题,您可以在上传完成后立即将文件复制到.tmp 目录,然后再将响应发送给客户端。

    This线程可以帮你复制。

    更好的方法是直接上传到 CDN 或 S3。

    【讨论】:

    • 首先感谢您的回答。我检查了节点的文件系统,并且该文件已经存在于目标文件夹中,在另一个测试中,我还检查了文件大小,看起来文件在向客户端发送响应之前已经完成。不是说文件已经在目标文件夹了吗?
    • 在发送响应之前文件是否存在于.tmp 目录中?我建议您在私人窗口中再试一次以确保安全。
    • 也许我不清楚,该文件存在于目标文件夹中,而不是(仅)存在于 .tmp 文件夹中。变量uploadedFiles[0].fd 是服务器公开的文件夹中文件的路径,因此它应该准备好响应http get 请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多