在sailsjs中上传后立即显示图像

时间:2014-01-15 02:39:51

标签: upload gruntjs sails.js

我有上传字段的表单。搜索一段时间后,我只是将上传的文件放到./assets/posts文件夹中,它正常工作。

在我的应用中,提交完成后,应重新加载当前网址并显示新上传的图片。但事实并非如此。我的sails应用程序使用链接器来管理资产。因此,在尝试重新加载页面3到4次后,显示图像。

提交完成后如何立即显示图像? 非常感谢!

2 个答案:

答案 0 :(得分:5)

Sails使用assets文件夹主要存储应该预编译和/或发布的资产,例如:脚本,样式和次要图像(图标等)。对于图像,在大多数情况下,它们在sails lift被复制(包括目录结构和符号链接)从./assets文件夹到./.tmp/public时就意味着可以公开访问。

因此,问题的简短回答是:为了立即可以访问,应将图像复制到./.tmp/public/posts(而不是./assets/posts)。

另一方面,./.tmp期间正在重写sails lift文件夹,并且您可能不希望在应用程序重新启动时上传的图像消失,因此上传图像是有意义的一个完全不同的文件夹,比方说./attachments/posts或诸如此类的东西,在Sails被解除之后,它又需要从./.tmp/public/images/posts进行符号链接。例如,在config/bootstrap.js中,您可以添加类似

的内容
var fs = require('fs')
  , path = require('path');

module.exports.bootstrap = function (cb) {
  // Whatever else you want to bootstrap...

  var postsSource = path.join(process.cwd(), 'attachments/posts')
    , postsDest = path.join(process.cwd(), '.tmp/public/images/posts');

  fs.symlink(postsSource, postsDest, function(err) {
    cb(err);
  });
};

您可以使用synchronous versionfs.symlinkasync来创建多个链接。

Windows好友更新

var sys = require('sys');
var exec = require('child_process').exec;
exec('mklink /j '+postsDest+' '+postsSource , function(err, stdout, stderr){
    cb(err);
});

当然,更好的方法是将图像直接上传到CDN /存储服务(Amazon S3等),并只生成相应的URL来访问它们。

答案 1 :(得分:3)

另一种与OS无关的方法是更改​​grunt-clean任务(在/tasks/config/clean.js中)以指定要在.tmp / public中清理哪些文件夹。见下面的例子。在我的例子中,我在.tmp / public中创建了一个“uploads”文件夹,它不会被删除。

grunt.config.set('clean', {
    dev: ['.tmp/public/fonts/**','.tmp/public/images/**','.tmp/public/js/**','.tmp/public/js/**','.tmp/public/styles/**','.tmp/public/*.*'],
    build: ['www']
});