2015-09-14 2 views
1

у меня есть приложение Rails, где я пытаюсь отобразить файл PNG, но я получаю эту ошибку:Рендер файл PNG в Rails

ActionView::Template::Error (Your template was not saved as valid UTF-8. Please either specify UTF-8 as the encoding for your template in your text editor, or mark the template with its encoding by inserting the following as the first line of the template: 

# encoding: <name of correct encoding>. 

The source of your template was: 

�PNG 

IHDR#ͱ�) pHYs�]s� IDATx���[email protected]�E��7�ZuV묣�Z�:j�mպm�Z��U[W�:�պZ�*�j���@�3� I���p��} 
��?� 
���b�X�/���Z�I�N111,ӧO��x�T�?x۶mU����vtt 

я добавил:

Mime::Type.register "image/png", :png 

к конфиг/инициализаторы/mime_types.rb

Я ссылки и делает файл PNG в контроллер с:

render :inline => @object.body.string, :content_type => @object.content_type || "img/png", :layout => false 

EDIT:

Это метод в контроллере

def read_data 
    resource = Aws::S3::Resource.new(client: @new_client) 
    if @files.size == 0 && @links.size == 0 && resource.bucket(@bucket.name).objects.first != nil && !request.original_url.end_with?('/') 
    if request.original_url.split('/')[-1] != @bucket.name && resource.bucket(@bucket.name).object(@prefix).exists? 
    @object = @new_client.get_object(bucket: @bucket.name, key: @prefix) 
    if @prefix.present? && @object.last_modified && (@object.content_type.match(/text/) || @object.content_type.match("application/json") || @prefix.end_with?('.json') || @prefix.end_with?('.html') || @prefix.end_with?('.txt') || @prefix.end_with?('.xml') || (@object.content_length > 0 && @object.content_type == "")) 
     render :inline => @object.body.string, :content_type => @object.content_type || "text/plain", :layout => false 
    elsif @prefix.end_with?('.png') 
     send_data(@object.body, 
        :type   => @object.content_type || "image/png", 
        :disposition => 'inline') 
    else 
     redirect_to resource.bucket(@bucket.name).object(@prefix).presigned_url(:get, expires_in: 8) #presigned url expires after 8 ms 
    end 
    end 
end 

конец

+2

Вам нужно узнать, как работает HTML. Двоичные объекты, такие как изображения, не встроены в HTML, на них ссылаются с помощью «единого локатора ресурсов» ([URL] (https://en.wikipedia.org/wiki/Uniform_resource_locator)), который браузер затем перепродает из сервер, указанный в разделе хоста URL-адреса. HTML никогда не содержит двоичных данных, он содержит только текст. Если вы хотите, чтобы браузер загружал что-то, вы можете отправить данные в виде отдельного потока, но это другой процесс. –

ответ

5

Используйте send_data метод для отправки двоичных файлов:

send_data(@object.body.string, 
      type: @object.content_type || 'image/png', 
      disposition: 'inline') 
+0

Я попытался добавить его, но он дал мне ту же ошибку при открытии –

+0

Вы удалили строку 'render' и добавили' send_data' вместо этого? Вы уверены, что вам нужно '@ object.body.string', а не просто' @ object.body'? – spickermann

+0

Да, я заменил линию визуализации на метод send_data, и я попробовал как '@ object.body.string', так и' @ object.body' –

0

Используйте этот код на вашем действие контроллера:

respond_with @resource do |format| 
    # format.html { send_data @resource.body } # => Download the image file. 
    format.html { send_data @resource.body, 
        type: @resource.content_type || 'image/png', 
        disposition: 'inline' } # => Show in browser page. 
end 
Смежные вопросы