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

4

我有一个表单带有上传字段。经过一番搜索,我把上传的文件放到了./assets/posts文件夹中,它也能正常运行。

在我的应用程序中,当提交完成后,它应该重新加载当前网址并显示新上传的图像。但实际上却没有。我的Sails应用程序使用链接器来管理资产。所以在尝试3或4次重新加载页面后,图像才会显示。

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


尝试这个 https://dev59.com/qn3aa4cB1Zd3GeqPgq4v#55745438 - Wajih
2个回答

6
Sails使用assets文件夹主要存储预编译和/或发布的资产,例如脚本、样式和小型图像(如图标等)。对于图像,这意味着在大多数情况下,在sails lift时,它们将被复制(包括目录结构和符号链接)从./assets文件夹到./.tmp/public,从而变为公开可访问。
因此,简短回答问题的方法是:为了立即访问图像,应将其复制到./.tmp/public/posts(而不是./assets/posts)。
另一方面,在sails lift期间,./.tmp文件夹将被重写,您可能不希望上传的图像在应用程序重新启动时消失,因此有意义在完全不同的文件夹中上传图像,比如说./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);
  });
};

你可以使用同步版本fs.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来访问它们。

嗨,如果我上传到./attachments/posts,那么如何从视图中获取链接?非常感谢! - anhnt
如果您上传到./attachments/posts,则可以通过URL(例如http://your.site.com/images/posts/image001.jpg)提供图像,但是只有在创建符号链接之后才能这样做,例如mkdir -p ./.tmp/public/images && ln -s ./attachments/posts ./.tmp/public/images/posts。同样,由于每次启动Sails都必须应用此命令,因此最好从代码内部执行它,例如从您的config/bootstrap.js中:module.exports.bootstrap = function (cb) { ... require('fs').symlink('<source_path>', '<dest_path>', function(err) { cb(err); }); }; - bredikhin
在Windows上运行Node确实不是最好的选择。但如果你别无选择,那就忘掉符号链接的事情,直接把文件放在./.tmp/public/images/posts中。它们将在Sails重新启动后消失,但我想你可以在开发阶段处理它们。 - bredikhin
谢谢@bredikhin,我会切换到Linux来解决这个问题。 - anhnt
@anhnt 毫无疑问,这是一个明智的决定。 ;) - bredikhin
显示剩余4条评论

3

一种与操作系统无关的替代方法是在 /tasks/config/clean.js 中更改 grunt-clean 任务以指定要清除哪些文件夹在你的 .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']
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接