Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用sails.js在nodejs服务器中上载文件_Javascript_Node.js_File Upload_Sails.js - Fatal编程技术网

Javascript 使用sails.js在nodejs服务器中上载文件

Javascript 使用sails.js在nodejs服务器中上载文件,javascript,node.js,file-upload,sails.js,Javascript,Node.js,File Upload,Sails.js,我使用节点上的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 n

我使用节点上的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访问该文件,并且如果我在客户端代码上添加了setTimeout,则该url在90%的时间内有效(这意味着这是一个计时问题)

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

提前感谢。

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

要克服这一点,您可以在上传完成后立即将文件复制到
.tmp
目录,然后再将响应发送到客户端

线程可以帮助您进行复制


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

首先感谢您的回答。我检查了节点的文件系统,文件已经存在于目标文件夹中,在另一个测试中,我还检查了文件大小,看起来文件在发送响应到客户端之前已经完成。这是否意味着该文件已在目标文件夹中?在发送响应之前,该文件是否存在于
.tmp
目录中?我建议您在一个私人窗口中再试一次,以确定是否正确。可能我不清楚,文件在目标文件夹中,而不是(仅)在.tmp文件夹中。变量
uploadedFiles[0].fd
是服务器公开的文件夹中文件的路径,因此它应该准备好响应http get请求。