14

Rails 3.1.4 および Paperclip 2.4.5 と共に ruby​​ 1.9.2 を使用しています。

私の問題は、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 から画像を保存することについて複数の回答を見てきましたが、私たちが実行しているのと同じ問題に対処しているようには見えません

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

これがあなたのケースに役立つかどうかはわかりませんが、私のプロジェクトでも同様の問題に気づいていました。

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)

あなたの問題で頑張ってください

于 2012-06-16T00:58:41.297 に答える
0

path/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 に答える
-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 に答える