4

有名人の名前を指定してウィキペディアから画像をダウンロードする rake タスクを作成しましたが、何らかの理由で S3 に保存するときにファイル拡張子がドロップされるか、.txt に変更されます。

それ以外の場合、ファイルは正しいです。

何か案は?

私のセレブモデル より:

has_attached_file :pic, 
  :styles => { :medium => "300x300>", :thumb => "100x100>" },
  :default_style => :medium,
  :storage => :s3,
  :s3_credentials => "#{Rails.root}/config/s3.yml",
  :path => "/:style/:img_name.:extension"

私のレーキタスクから:

desc "Update celeb pics from wiki"
task :update_celeb_pics => [:environment] do
  include ApplicationHelper
  Celeb.all.each do |celeb|
    if !celeb.name.start_with?("(")
      puts celeb.name
      celeb.pic = open(getImage(celeb.name))
      celeb.save
    end
  end
end

getImage メソッドは文字列を返すヘルパーです

    require 'open-uri'
    require 'uri'

    module ApplicationHelper
      def getInfo(name)
        Nokogiri::XML(open(URI.escape("http://en.wikipedia.org/w/api.php?action=opensearch&search=#{name}&limit=1&namespace=0&format=xml")))
      end

      def nokoPage(name)
        Nokogiri::XML(open(getURL(name)))
      end

      def getImage(name)
        "http:" + nokoPage(name).css("table img")[0].attribute("src").value if !nokoPage(name).css("table img").empty?
      end

      def getDescription(name)
        getInfo(name).css("Description").text
      end

      def getURL(name)
        getInfo(name).css("Url").text
      end

      def getBday(name)
        bday = nokoPage(name).css("span.bday")
        return Date.parse(bday[0].text) if !bday.empty?
        return Date.today
      end

      def getDday(name)
        dday = nokoPage(name).css("span.dday")
        return Date.parse(dday[0].text) if !dday.empty?
      end

    end
4

1 に答える 1

8

それの訳は

self.pic = open("http://something.com/bla/image.png")

ここでは最善の解決策ではありません。ちょうど昨日、これを可能にするペーパークリップにマージされたプルリクエストを受け取りました

self.pic = URI.parse(getImage(name))

これにより、pic のコンテンツ タイプがダウンロードされたファイルと一致し、pic のファイル名がダウンロードされたファイルの名前に設定されます。

txt 拡張子を取得する理由は、open が実際にファイル名を「stringio.txt」と名付けた StringIO オブジェクトを返すためです。ファイル名はおそらく s3 コードによって変更されますが、拡張子は「.txt」のままです

Gemfile を paperclip の github リポジトリにリンクし、bundle を実行して再試行することをお勧めします。

乾杯、 アディティア

于 2012-07-21T08:38:49.390 に答える