Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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文件上传-在上传实际完成之前执行req.body和.upload()回调_Javascript_Node.js_Sails.js_Image Uploading_Skipper - Fatal编程技术网

Javascript Sails.js文件上传-在上传实际完成之前执行req.body和.upload()回调

Javascript Sails.js文件上传-在上传实际完成之前执行req.body和.upload()回调,javascript,node.js,sails.js,image-uploading,skipper,Javascript,Node.js,Sails.js,Image Uploading,Skipper,我正在使用Sails构建一个网站,其中一个页面包含一个表单。此表单有多个文本输入和一个文件上载输入,供用户上载图像。来自所有文本输入的信息存储在Postgres数据库中,图像使用sails文档中描述的.upload()功能上载,并转换为数据uri,然后存储在同一Postgres数据库中,用于在站点上显示图像 文件输入是页面上倒数第三个输入,我注意到发生了两件事: 1) 文件输入之后的两个输入中的文本未作为req.body的一部分传递给控制器,表单输入通常是这样的 2) 数据库中未存储某些图像的数

我正在使用Sails构建一个网站,其中一个页面包含一个表单。此表单有多个文本输入和一个文件上载输入,供用户上载图像。来自所有文本输入的信息存储在Postgres数据库中,图像使用sails文档中描述的
.upload()
功能上载,并转换为数据uri,然后存储在同一Postgres数据库中,用于在站点上显示图像

文件输入是页面上倒数第三个输入,我注意到发生了两件事:

1) 文件输入之后的两个输入中的文本未作为
req.body
的一部分传递给控制器,表单输入通常是这样的

2) 数据库中未存储某些图像的数据uri

我创建了一个新的basic sails应用程序,它有一个表单,允许你上传一张图片,这里也发生了同样的事情

在测试中,我发现小图像可以正常工作,而大图像则不行。我使用的“小”图像是66kb,而另一个800kb的图像产生了上述相同的效果

新的sails应用程序在
.upload()
函数的回调中,
res.view
是另一个只显示上传图像的页面。对于800kb的图像和更大的图像,在呈现页面时,它显示的不是上传的图像,而是一个损坏的图像。在chrome开发控制台中,图像链接出现了404错误,但是如果我在图像url的末尾添加了一个查询(即,让chrome认为这是一个不同的url,以便重新加载相同的图像),图像显示会很好。由此我猜测,
.upload()
回调函数是在图像实际完成上传之前调用的,当我重新加载图像时,它已经完成上传

我可以在请求头中看到发送文件输入后的输入,但是在控制器中执行
console.log(req.body)
只会注销表单中文件输入之前的输入

我使用的是sails v0.11.0,我使用的代码如下:

HTML表单(index.ejs)

控制器(ImageController.js)

显示上载图像的页面(uploadedImage.ejs)


有人能解释一下为什么会发生这种情况,并帮我解决吗


谢谢

根据sails文件上传文档,所有文本字段必须在文件字段之前上传,否则它们不会传递给操作。 航海文献

<h1>Image Upload Test</h1>

<form method="post" enctype="multipart/form-data" action="/submit">

  <div>
    <input type="text" name="firstInput">
  </div>

  <div>
    <input type="file" name="image">
  </div>

  <div>
    <input type="text" name="imageUploaded" value="false">
  </div>

  <div>
    <input type="hidden" name="test" value="hello!">
  </div>

  <button type="submit">Upload</button>

  <script type="text/javascript">
    $('input:file').change(function() {
      $('input[name=imageUploaded]').val('true')
    });
  </script>

</form>
module.exports.routes = {

  '/': 'ImageController.show',
  '/submit': 'ImageController.create'
module.exports = {
    show: function(req, res) {
        res.view('index.ejs');
    },

    create: function(req, res) {

        var fileName = 'image' + Date.now() + '.jpg';

    req.file('image')
    .upload({saveAs: __dirname + '/../../assets/images/' + fileName}, function(err, uploadedFiles) {
      if (err) return res.serverError(err);

            console.log('file uploaded');
            console.log();
            console.log(req.body);

            res.view('uploadedImage', {fileName: fileName});

    });

    }

};
<%if (typeof(fileName) !== 'undefined') {%>
  <a href="/">
    <img src="/images/<%=fileName%>" style="width:100%; height:100%;">
  </a>
<%}%>