繁体   English   中英

Ruby open-uri open方法丢失文件扩展名打开图像

[英]Ruby open-uri open method loses file extension opening images

我正在使用ruby 1.9.2以及Rails 3.1.4和Paperclip 2.4.5。

我的问题是尝试从URI中保存回形针附件会丢失文件扩展名并保存文件,而不会导致出现像fancybox这样需要扩展名的问题。

一些示例代码:

uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png"
open(uri)
#=> #<File:/var/folders/zc/d69gxhzx10x_bvjrkqgyjgxr0000gn/T/open-uri20120613-27204-i6cldv>

因为临时文件没有扩展名,回形针正在保存文件而不会导致文件出现问题。

有没有人遇到过这个问题? 我已经看到了关于使用paperclip存储来自URI的图像的多个答案,但似乎没有解决我们正在运行的相同问题

不要使用临时文件! 它作为占位符存在,因为文件是从端口读取的,应该被视为OpenURI的私有资源。 相反,使用open(url).read并通过保存来处理生成的内容。

做类似的事情:

require 'uri'
require 'open-uri'

url = 'http://www.iana.org/domains/example/index.html'
filename = File.basename(URI.parse(url).path)
File.open(filename, 'wb') do |fo|
  fo.write(open(url).read)
end

在操作期间(尤其是网络操作)暂时假脱机到磁盘是常见的。 一旦累积了文件的内容,就可以将其传递给应用程序。 read是阻塞的,因此您的代码将停在那里,直到文件返回给您。 然后你可以玩它。

扩展对于临时文件并不重要,但如果要在代码中使用此文件或保存到其他位置。 你能行的:

temp_file = open(params[:url])
def temp_file.original_filename; File.basename(base_uri.path); end

现在,您可以将此临时文件保存到永久空间或在代码中使用它; 原始文件名将自动使用。

我不确定这对你的情况是否有帮助,但我在项目中注意到类似的问题。

事实证明,问题不是由Paperclip引起的,也不是open-uri引起的,而是回形针文件的接收者(在我的案例中是Spree Commerce )。 检查是否将回形针对象分配给正确的对象,并且正在正确解释它。

对我有用的修复是改变:

@product.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true)

@product.master.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true)

祝你好运

你在路径/网址选项中包含了:扩展名吗?

例如:

has_attached_file :image,
  ...
  :url  => '/images/highlights/:id_partition/:style_:id.:extension',
  :path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension'

这可能会解决您的问题。 你可以在那里强制扩展,但我不认为这是推荐的。

更新 - Paperclip可以自行完成!

Aditya Sanghi发表(非常感谢!):

 current_comments.pictures.create!(file: URI.parse(image_url)) 

虽然记住,你仍然需要处理500,404等错误(Paperclip可以提高它们)。

感谢: https//mensfeld.pl/2013/12/rails-paperclip-open-uri-downloading-files-from-the-internet-and-saving-them-with-paperclip/

是的,这是一个问题,但我们可以用fancybox解决这个问题。

在链接标记(对于图像)中添加:type => 'image'

- @images.each do |image|
 = link_to image_tag(image.attachment.url),   image.attachment.url, class: "fancybox", type: 'image'

通过指定'type',Fancybox会将类型覆盖为图像

https://groups.google.com/forum/?fromgroups=#!topic/fancybox/QgjquBCLynU

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM