Вопрос по ruby-on-rails, render, jpeg, ruby – Rails 3, отображающий изображения jpg из локальной файловой системы выше RAILS_ROOT

5

Я пытаюсь найти способ отображения изображений из смонтированной файловой системы, которая не находится в RAILS_ROOT (в средах RedHat или Ubuntu). Я не хочу использовать символическую ссылку, потому что это приложение фактически развернуто через Tomcat, и Tomcat пытается перейти по символической ссылке и удалить все образы в монтировании, когда я выключаю Tomcat. Помещение изображений в public / images также не вариант из-за количества и размера этих файлов.

Я посмотрел в send_file, но это просто покажет одно изображение. Мне нужно отобразить 6 запрошенных изображений на красиво отформатированной странице. Я бы предпочел не использовать кодировку Base64 из-за раздувания, но я не знаю, как еще передать данные изображения с отображаемой страницей.

Опять же, проблема в том, что изображения не могут быть доступны через URL в сгенерированном HTML, данные изображения должны передаваться вместе с остальной частью страницы. Я знаю, что создание какого-либо типа сервиса для сервера изображений было бы лучшим способом справиться с этим, но сейчас мне просто нужно, чтобы это работало.

Любая помощь с благодарностью!

Ваш Ответ

1   ответ
12

По очевидным причинам Rails не позволит пользователю получить доступ к частям файловой системы внеRAILS_ROOT/public, Вы были на самом деле частью пути, когда упомянули sendfile (или x-sendfile для предпочтения). Решение состоит в том, чтобы Rails нормально обслуживал html-страницу, которая содержит ссылки на действие Rails, которое обслуживает отдельные файлы.

Например, допустим, я хочу показать некоторые изображения где-то глубоко в файловой системе. Сначала я должен создать действие, которое обслуживает одно изображение за раз. Так что вconfig/routes.rb Вы можете добавить следующее:

match '/serve_image/:filename' => 'images#serve'

Затем я должен создать контроллер, соответствующий этому маршруту. Например:

class ImagesController < ApplicationController
  def serve
    path = "/my/servers/image/path/#{params[:filename]}"

    send_file( path,
      :disposition => 'inline',
      :type => 'image/jpeg',
      :x_sendfile => true )
  end
end

Теперь ваши изображения доступны по ссылке: /serve_image/my_image.jpg. Итак, последнее, что нужно сделать, это создать красивую HTML-страницу, которая показывает все необходимые изображения. Это так просто, как:

<img src="/serve_image/image1.jpg">
<img src="/serve_image/image2.jpg">
<img src="/serve_image/image3.jpg">
<img src="/serve_image/image4.jpg">
x_sendfile включен в apache. Переход прямо к Tomcat (порт 8080) приводит к той же проблеме. Слишком много боли и разочарование, я собираюсь изучить написание утилиты / службы в Grails. Почему так сложно обработать изображение вне корня рельсов? clovold
Спасибо, сэр! Это именно то, что мне нужно! clovold
За исключением случаев, когда я депонирую его в Tomcat, он останавливается после пары изображений. Тем не менее, он прекрасно работает под Вебриком. А? Я разместил новый вопрос с этими вопросами. Очень расстраивает, не могу пройти через это. Я думаю о том, чтобы переписать все это в Grails и назвать это выполненным. clovold
Я не очень опытен с Tomcat, но с Apache должен быть включен мод x-sendfile, чтобы он работал должным образом. Если он возвращается к обычному sendfile, загрузка не отсоединяется от основного процесса Ruby, который может его остановить? Извините, это всего лишь предположение;)

Похожие вопросы