14

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

我的问题是尝试从 URI 中保存回形针附件会丢失文件扩展名并在没有文件扩展名的情况下保存文件,从而导致需要扩展名的花式框等问题。

一些示例代码:

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 的图像的答案,但似乎都没有解决我们正在运行的相同问题

4

6 回答 6

6

不要使用临时文件!当从端口读取文件时,它作为占位符存在,应该被视为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正在阻塞,因此您的代码将停在那里,直到文件返回给您。然后你就可以玩它了。

于 2012-11-12T16:57:50.363 回答
3

扩展名对于临时文件并不重要,但如果您想在代码中使用此文件或保存到另一个地方。你能行的:

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

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

于 2016-01-26T09:35:06.140 回答
0

您是否在路径/url 选项中包含了 :extension?

例如:

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

这可能会解决您的问题。您可以在那里强制扩展,但我认为不建议这样做。

于 2012-10-07T20:12:09.350 回答
0

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

事实证明,这个问题不是由Paperclipnor引起的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)

祝你的问题好运

于 2012-06-16T00:58:41.297 回答
0

更新 - 回形针可以自己做到这一点!

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/

于 2017-07-07T14:13:39.793 回答
-1

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

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

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

通过指定“类型”,Fancybox 将类型覆盖为图像

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

于 2012-09-05T15:48:50.397 回答