2014-01-15 4 views
3

У меня есть форма с полем для загрузки. После некоторого поиска я просто поместил загруженные файлы в папку ./assets/posts и работал правильно.Показать изображение сразу после загрузки в sailsjs

В моем приложении, когда он отправлен, необходимо перезагрузить текущий URL и показать новое загруженное изображение. Но это не так. Для управления активами приложение myails использует линкер. Поэтому после 3 или 4 раза я пытаюсь перезагрузить страницу, показывается изображение.

Как показать изображение сразу после отправки? Спасибо большое!

ответ

4

Паруса использует папку 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); 
    }); 
}; 

Вы можете использовать synchronous version из fs.symlink или async создать несколько ссылок.

Обновление для окон парней

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-адреса в доступ к ним.

+0

Привет, если я загружаю в ./attachments/posts, то как получить ссылку из представления? большое спасибо! – anhnt

+0

Если вы загружаете файлы «./Вложения/сообщения», изображения могут быть отправлены через 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 = (cb) {... require ('fs'). symlink ('', '', function (err) {cb (err);}); }; ' – bredikhin

+0

Ницца, спасибо за вашу помощь.Вы сохранили мой день :) – anhnt

3

Альтернатива, которая является агностикой операционной системы, заключается в изменении задачи grunt-clean (в /tasks/config/clean.js), чтобы указать, какие папки должны быть очищены в вашем .tmp/public. См. Пример ниже. В моем случае я создал папку «uploads» в .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'] 
}); 
Смежные вопросы