@uib

Почему при попытке отобразить изображение появляется ошибка «404 Not Found»?

Я использую Rails Api 5.1.6 как серверную часть и качестве клиента Angular 4. Все данные хранятся в базе данных Oracle. Изображения в Oracle хранятся в формате «Blob». Для работы с изображениями на Rails Api использую gem "paperclip".

Так вот когда я пытаюсь отобразить изображение на клиенте, появляется ошибка «404 not found ». Вот ошибка в консоли:

GET localhost:4200/photos/original/missing.png 404 (Not Found)


5bc02dc633e57308312648.png

Пробовал перейти по данной ссылке:
localhost:3000/photos/original/missing.png

, но появлялась вот такая ошибка (Если нужно могу полную ошибку скинуть):

"#ActionController::RoutingError: No route matches [GET] "/photos/original/missing.png""


JSON:

[
{
l_users_id: 65,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1357,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1358,
photo: "/photos/original/missing.png"
},
{
l_users_id: 51,
photo: "/photos/original/missing.png"
},
{
l_users_id: 2,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1360,
photo: "/photos/original/missing.png"
},
{
l_users_id: 0,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1372,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1371,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1370,
photo: "/photos/original/missing.png"
},
{
l_users_id: 1373,
photo: "/photos/original/missing.png"
}
]


photos_controller.rb:

class PhotosController < ApplicationController

    def index
        @photos = Photo.all

    array = @photos.map do |photo|
        photo_push = {
            l_users_id:      photo.l_users_id,
            photo:           photo.photo.url
        }

        photo_push
    end

    render json: array
  end

    def show
        @photo = Photo.find(params[:id])
        photo_hash = {
            l_users_id:      photo.l_users_id,
            photo:           photo.photo.url
        }

        render json: photo_hash
    end

end


photo.rb:

class Photo < ActiveRecord::Base
  self.primary_key = "l_users_id"

  has_attached_file :photo

  validates_attachment_presence :photo
  validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/png']

end
  • Вопрос задан
  • 1253 просмотра
Пригласить эксперта
Ответы на вопрос 2
AlexVor
@AlexVor
Системный администратор (Junior)
Ошибка 404 говорит о том что файла не существует, то есть ищите ошибку в пути к файлу.
Photo и PhotoS нет?
Ответ написан
По умолчанию, paperclip использует файловую систему для хранения файлов и вряд ли имеет встроенную поддержку отображения файлов из базы, поэтому везде missing вместо URL.

1. Вам надо будет самостоятельно сделать отображение в каком-нибудь контроллере и отдавать изображение в таком духе:

class PhotosController
  def render_image
    photo = Photo.find(params[:photo_id)
    send_data photo.photo, type: 'image/png', disposition: 'inline'
  end
end


Это позволит отдавать изображение из базы.

2. Нужно прописать роут к этому контроллеру. Что-то типа:

# config/routes.rb

get '/photos/:photo_id' => 'photos#render_image'


На этом этапе можно попробовать зайти по URL в браузере /photos/1, в браузере должна выдаться картинка.

3. Указать paperclip, чтобы он использовал ваш route для формирования url к картинкам.

Либо поискать готовое решение в виде гема в гугле: paperclip render database gem
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы