Ruby on rails 3 Carrierwave pdf至jpg缩略图,适用于Safari和x2B;iOS或IE、Firefox、Chrome,但不是两者都有
我正在竭尽全力,几天来一直在寻找解决办法。我试图采取上传的pdf文档,并创建一个缩略图,是所有浏览器上查看。我可以让它在Safari/iOS或Firefox/IE7+/Chrome上运行,但没有一个版本可以在任何地方运行。我尝试将颜色空间设置为rgb(无效果),将其转换为png而不是jpg(无效果),并设置为:set_content_type(无效果)。我在本地机器和生产(Heroku)上得到了相同的结果 pdfdoc_uploader.rbRuby on rails 3 Carrierwave pdf至jpg缩略图,适用于Safari和x2B;iOS或IE、Firefox、Chrome,但不是两者都有,ruby-on-rails-3,image-processing,imagemagick,carrierwave,rmagick,Ruby On Rails 3,Image Processing,Imagemagick,Carrierwave,Rmagick,我正在竭尽全力,几天来一直在寻找解决办法。我试图采取上传的pdf文档,并创建一个缩略图,是所有浏览器上查看。我可以让它在Safari/iOS或Firefox/IE7+/Chrome上运行,但没有一个版本可以在任何地方运行。我尝试将颜色空间设置为rgb(无效果),将其转换为png而不是jpg(无效果),并设置为:set_content_type(无效果)。我在本地机器和生产(Heroku)上得到了相同的结果 pdfdoc_uploader.rb include ImageManipulators
include ImageManipulators
include CarrierWave::RMagick
include CarrierWave::MimeTypes
version :thumb do
process :convert => 'jpg' #<---This works in Safari and iOS
process :resize_to_fit => [200, 200]
process :paper_shape
process :strip
process :convert => 'jpg' #<---Move it here and it works everywhere else
def full_filename (for_file = model.logo.file)
super.chomp(File.extname(super)) + '.jpg'
end
end
我最终放弃了,只创建了两个版本,并使用useragent确定显示哪个版本。虽然不是一个有吸引力的选择,但它正在发挥作用。我希望有人能想出更好的解决办法
version :thumb_safari do #special version for safari and ios
process :resize_to_fit => [200,200]
process :convert => 'jpg'
process :paper_shape
def full_filename (for_file = model.logo.file)
super.chomp(File.extname(super)) + '.jpg'
end
end
version :thumb do #all browsers except safari
process :resize_to_fit => [200,200]
process :convert => 'jpg' #must convert to jpg before running paper shape
process :paper_shape
process :convert => 'jpg' #after running paper_shape it will default to original file type
def full_filename (for_file = model.logo.file)
super.chomp(File.extname(super)) + '.jpg'
end
end
def paper_shape
manipulate! do |img|
if img.rows*4 != img.columns*3
width=img.columns
height=img.columns/3*4
img.crop!(0,0,width,height,true)
else
img
end
end
end
在控制器/视图中,我使用了useragent gem并执行了以下操作:
文件\u controller.rb
def index
@user_agent=UserAgent.parse(request.user_agent)
@search = Document.search(params[:q])
end
index.html.rb
<% if @user_agent.browser.downcase == 'safari' %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb_safari).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% else %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% end %>
“dropshadow”,:size=>“150x225”),doc.pdfdoc_url)%>
“dropshadow”,:size=>“150x225”),doc.pdfdoc_url)%>
毫无疑问,有更好的方法可以做到这一点,但目前这种方法正在发挥作用。2.5年后,我也遇到了同样的问题,我的头发也比以前少了 当Carrierwave使用RMagick转换文件时,它调用
Operate
并传递一个:option=>:format
。操作代码>方法,然后,如果它看到一个选项格式,则执行此操作(如中所示):
我认为,问题在于,它没有显式地设置文件内容,只是更改了扩展名
事实证明,一些浏览器(除了Safari)乐于根据文件扩展名解释图像,而Safari显然使用或检查文件头
因此,我的解决方案不是仅仅依靠Carrierwave/RMagick magic进行转换,而是在自定义过程中显式设置内容头,如下所示,我从另一个过程中直接提取:
您会注意到,调试器将在运行时打印application/pdf,确认:convert
方法尚未工作(尚未!)
<% if @user_agent.browser.downcase == 'safari' %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb_safari).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% else %>
<%= link_to(image_tag(doc.pdfdoc_url(:thumb).to_s, :class=>"dropshadow", :size => "150x225"), doc.pdfdoc_url)%>
<% end %>
if options[:format] || @format
frames.write("#{options[:format] || @format}:#{current_path}", &write_block)
move_to = current_path.chomp(File.extname(current_path)) + ".#{options[:format] || @format}"
file.move_to(move_to, permissions, directory_permissions)
else
frames.write(current_path, &write_block)
end
version :png_thumb, :if => :pdf_document? do
process :cover
process :convert => :png
process :resize_to_fit => [200, 300]
process :set_content_type_png
def full_filename (for_file = model.document.file)
super.chomp(File.extname(super)) + '.png'
end
end
def set_content_type_png(*args)
Rails.logger.debug "#{file.content_type}"
self.file.instance_variable_set(:@content_type, "image/png")
end