我有上传字段的表单。搜索一段时间后,我只是将上传的文件放到./assets/posts文件夹中,它正常工作。
在我的应用中,提交完成后,应重新加载当前网址并显示新上传的图片。但事实并非如此。我的sails应用程序使用链接器来管理资产。因此,在尝试重新加载页面3到4次后,显示图像。
提交完成后如何立即显示图像? 非常感谢!
答案 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 version或fs.symlink的async来创建多个链接。
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']
});