【问题标题】:Show image immediately after upload in sailsjs在sailsjs中上传后立即显示图像
【发布时间】:2014-02-03 08:59:02
【问题描述】:

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

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

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

【问题讨论】:

标签: upload gruntjs sails.js


【解决方案1】:

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.symlinkasync 中的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,那么如何从视图中获取链接?非常感谢!
  • 如果您上传到./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); }); };
  • 我在 Windows 7 x64 上的错误:{ [Error: ENOENT, symlink 'd:\Learn\nodeapp\attachments\posts'] errno: 34, code: 'ENOENT', path: 'd:\\Learn\\nodeapp\\attachments\\posts' }
  • 好吧,在 Windows 上运行 Node 确实不是最好的主意。但是如果你别无选择,那就忘记符号链接的事情,直接把你的文件放在./.tmp/public/images/posts。 Sails 重新启动后它们将消失,但我想您可以在开发阶段处理它。
  • 谢谢@bredikhin,我会改用Linux来解决这个问题。
【解决方案2】:

另一种与操作系统无关的方法是更改​​ 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']
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2015-09-08
    • 2021-11-09
    • 2017-03-15
    相关资源
    最近更新 更多