我看不到刚刚上传的图片[sails.js]

时间:2015-09-01 14:02:51

标签: image sails.js

我有这个上传照片:

module.exports = function (req, image, url, callback) {
var filename = (Math.floor((Math.random() * 100000000000) + 1)) + ".png";
req.file(image).upload({
  dirname: '../../assets/images' + url
,
  saveAs: function(file, cb) {
    cb(null, filename);
  }
}, function(error, uploadedFiles) {
  return callback(null, "http://" + req.headers.host + "/images" + url + filename)
});

}

它返回一个这样的网址:http://localhost:1349/images/dependent/photos/30363010266.png

我可以看到我的照片已上传到项目文件夹中,因为我是在物理上看到的。但是URL不起作用,并且看起来没有找到错误。

如果我重新启动服务器,则URL工作正常。

谢谢!

4 个答案:

答案 0 :(得分:5)

正如@Eugene Obrezkov指出的那样,您的问题与您上传图片的位置和咕噜咕噜的任务选手有关。所有资产都从该文件夹(/assets)复制到.tmp,并且grunt任务运行程序会监视更改,但这不会包含新的图像文件(如果您要访问资产文件夹中的空文件夹,在您的情况下为图像文件夹)。因此解决方案非常简单,您必须直接上传到.tmp文件夹,最好是.tmp/public/uploads/year/month/,您可以根据需要选择路径。现在使用这种方法有一个警告,并且有一个 grunt任务清除在风帆升降机上.tmp文件夹的内容,所以你将产生相反的效果,现在为了避免这种情况也很容易,您必须编辑clean.js任务以删除特定文件夹,以避免删除您的上传文件夹。

转到项目文件夹tasks/config/clean.js,并替换此代码中的内容,或根据需要进行修改。

module.exports = function(grunt) {
    grunt.config.set('clean', {
      dev: [
        getFolderPath('fonts/**'),
        getFolderPath('images/**'),
        getFolderPath('images/**'),
        getFolderPath('js/**'),
        getFolderPath('styles/**'),
        getFolderPath('*.*')
      ],
      build: ['www']
    });

    grunt.loadNpmTasks('grunt-contrib-clean');
};

function getFolderPath(folderName){
  return '.tmp/public/' + folderName;
}

现在,您的上传内容会立即显示给最终用户,而不会重新启动,重新启动也不会删除这些上传内容。在尝试上传之前,请确保.tmp/public/uploads/路径存在,或者如果找不到则使用mkdir通过代码创建路径。

还有其他解决方案,比如确保在服务器启动时或者使用符号链接时,您要上传到的文件夹中至少有一个文件,但我认为这是一种更简洁的方法。您可以在此处查看这些选项:

Image not showing immediately after uploading in sails.js

答案 1 :(得分:4)

如果您查看tasks文件夹,可以找到将所有assets文件夹复制到.tmp文件夹并将.tmp文件夹作为静态公用文件夹复制的Grunt任务

当您运行Sails应用程序时,它会运行这些Grunt任务,因此,如果您将文件直接上传到assets文件夹,则在重新运行服务器和Grunt任务之前将无法访问它。

解决方案?没有解决方案。基本上,你做错了。最佳做法是将图像\文件\存储在S3存储桶,谷歌存储,至少是另一个硬盘驱动器上,而不是assets本身。因为它是您项目的源文件,并且应该只找到项目本身所需的文件,而不是用户的文件等......

答案 2 :(得分:0)

你可以在不修改任何grunt任务的情况下实现。我有同样的问题,我刚解决了。

我看到你已经对其他评论中发生的事情有了解释,所以我会直接找到我的解决方案。我将文件上传到.tmp文件夹,在上传的回调中,我使用文件系统将它们转移到assets文件夹(fs-extra是一个很棒的包)。

所以现在我可以在添加后立即看到我的UI中的图像(因为我将它们上传到.tmp),当我的服务器停止时,.tmp将会丢失,但会在下一次升降时再次生成并复制文件资产。

希望它有所帮助!

答案 3 :(得分:0)

这就是我解决这个问题的方法。答案需要几个步骤。我假设您要将最近上传的图像放在名为users的文件夹中。

<强>步骤: 1. npm install express --save(如果你没有安装它)

  1. 在您的应用根目录中创建用户文件夹。

  2. 打开文本编辑器并查看以下文件config\express.js

  3. 添加或替换代码 ` var express = require(&#39; express&#39;); module.exports.http = { customMiddleware:function(app){     app.use(&#39; / users&#39;,express.static(process.cwd()+&#39; / users&#39;));    } };

  4. ` 5.确保新上传的图像放在用户文件夹

    1. 完成