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

Ruby open uri open方法在打开图像时丢失文件扩展名,ruby,paperclip,open-uri,Ruby,Paperclip,Open Uri,我正在使用ruby 1.9.2、Rails 3.1.4和曲别针2.4.5 我的问题是,试图从URI保存回形针附件时,会丢失文件扩展名,并在没有扩展名的情况下保存文件,从而导致fancybox等需要扩展名的问题 一些示例代码: uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png" open(uri) #=> #<File:/var/folders/

我正在使用ruby 1.9.2、Rails 3.1.4和曲别针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>
uri=”http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png"
打开(uri)
#=> #
因为临时文件没有扩展名,所以曲别针在保存文件时没有扩展名,从而导致问题


有人碰到过这个问题吗?关于使用回形针存储URI中的图像,我已经看到了多个答案,但似乎没有一个能解决我们正在运行的相同问题,我不确定这对您的情况是否有帮助,但我在我的项目中注意到了类似的问题

问题不是由
回形针
打开uri
引起的,而是回形针文件的接收者(在我的例子中是
疯狂商业
)。检查是否将回形针对象指定给正确的对象,以及是否正确解释了回形针对象

对我有效的解决方案是改变:

@product.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true)
@product.images打开(image\u url)
},:无_保护=>true)

@product.master.images打开(image\u url)
},:无_保护=>true)

祝您的问题好运

是的,这是个问题,但我们可以通过fancybox解决这个问题

在链接标签(图像)中添加
:type=>“image”

- @images.each do |image|
 = link_to image_tag(image.attachment.url),   image.attachment.url, class: "fancybox", type: 'image'
通过指定“type”,Fancybox将类型重写为图像


在路径/url选项中是否包含:扩展名

例如:

has_attached_file :image,
  ...
  :url  => '/images/highlights/:id_partition/:style_:id.:extension',
  :path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension'
这可能会解决你的问题。
您可以在那里强制使用扩展名,但我认为不建议这样做。

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

做一些类似于:

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

在操作期间,特别是网络操作期间,临时假脱机到磁盘是常见的。一旦文件的内容被累积,就可以将其传递给应用程序<代码>读取
被阻塞,因此您的代码将在那里停止,直到文件返回给您。然后您可以使用它。

扩展名对于临时文件并不重要,但如果您希望在代码中使用此文件或将其保存到其他位置。你可以这样做:

temp_file = open(params[:url])
def temp_file.original_filename; File.basename(base_uri.path); end
现在,您可以将这个临时文件保存到永久空间或在代码中使用它;原始文件名将自动使用

更新–回形针可以自己完成

Aditya Sanghi发布(非常感谢!)

尽管要记住,您仍然需要处理500、404等 错误(回形针会引起错误)


多亏了:

我也面临着这个问题。这并没有得到太多的解决,并且增加了对fancybox显示图像的要求。这不起作用。为了使“base_uri”可供此处定义的原始_filename方法访问(仅供参考),似乎还需要一些额外的技巧。
temp_file = open(params[:url])
def temp_file.original_filename; File.basename(base_uri.path); end
current_comments.pictures.create!(file: URI.parse(image_url))