【发布时间】:2014-02-03 08:59:02
【问题描述】:
我有带有上传字段的表单。搜索了一段时间后,我只是将上传的文件放到文件夹 ./assets/posts 中,它工作正常。
在我的应用程序中,提交完成后,它应该重新加载当前网址并显示新上传的图片。但它没有。我的 Sails 应用程序使用链接器来管理资产。所以在我尝试重新加载页面 3 或 4 次后,图像就会显示出来。
提交完成后如何立即显示图片? 非常感谢!
【问题讨论】:
我有带有上传字段的表单。搜索了一段时间后,我只是将上传的文件放到文件夹 ./assets/posts 中,它工作正常。
在我的应用程序中,提交完成后,它应该重新加载当前网址并显示新上传的图片。但它没有。我的 Sails 应用程序使用链接器来管理资产。所以在我尝试重新加载页面 3 或 4 次后,图像就会显示出来。
提交完成后如何立即显示图片? 非常感谢!
【问题讨论】:
Sails 使用assets 文件夹主要存储应该预编译和/或发布的资产,例如脚本、样式和次要图像(图标等)。对于图像,这意味着在大多数情况下,在sails lift 上,它们会被从./assets 文件夹复制(包括目录结构和符号链接)到./.tmp/public,这样就可以公开访问了。
因此,对这个问题的简短回答是:为了立即可访问,应将图像复制到 ./.tmp/public/posts(而不是 ./assets/posts)。
另一方面,./.tmp 文件夹在 sails lift 期间被重写,您可能不希望您上传的图像在应用程序重新启动时消失,因此将图像上传到完全不同的文件夹中是有意义的,比方说./attachments/posts 或诸如此类的东西,在帆升起后,它又需要与./.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);
});
};
您可以使用fs.symlink 或async 中的synchronous version 创建多个链接。
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 来访问它们。
【讨论】:
./attachments/posts,则可以通过http://your.site.com/images/posts/image001.jpg 等URL 提供图像,但前提是您必须创建符号链接,例如mkdir -p ./.tmp/public/images && ln -s ./attachments/posts ./.tmp/public/images/posts。同样,由于每次升起帆时都必须应用此命令,因此从您的代码中执行它是有意义的,例如,从您的 config/bootstrap.js:module.exports.bootstrap = function (cb) { ... require('fs').symlink('<source_path>', '<dest_path>', function(err) { cb(err); }); };
{ [Error: ENOENT, symlink 'd:\Learn\nodeapp\attachments\posts'] errno: 34, code: 'ENOENT', path: 'd:\\Learn\\nodeapp\\attachments\\posts' }
./.tmp/public/images/posts。 Sails 重新启动后它们将消失,但我想您可以在开发阶段处理它。
另一种与操作系统无关的方法是更改 grunt-clean 任务(在 /tasks/config/clean.js 中)以指定要在 .tmp/public 中清理的文件夹。请参见下面的示例。就我而言,我在 .tmp/public 中创建了一个“上传”文件夹,但它并没有被删除。
grunt.config.set('clean', {
dev: ['.tmp/public/fonts/**','.tmp/public/images/**','.tmp/public/js/**','.tmp/public/js/**','.tmp/public/styles/**','.tmp/public/*.*'],
build: ['www']
});
【讨论】: