2011-08-05 8 views
6

Base64エンコード形式で受け取っている画像のコンテンツタイプとファイル名を取得しようとしています。ここ base64でエンコードされた画像からファイル名とコンテンツタイプを取得するruby on ruby​​

は、コントローラ内にBase64エンコードされた画像

require 'net/http' 
require "rubygems" 
require 'active_support' 

url = URI.parse('http://localhost:3000/') 
image = ActiveSupport::Base64.encode64(open("public/images/rails.png").to_a.join) 
post_params = {'image' => image } 
Net::HTTP.post_form(url, post_params) 

とPOSTリクエストを行っているコードですが、私はこの画像のコンテンツタイプとファイル名を取得する必要があります。だから最初に私はそれをデコードしています

image = ActiveSupport::Base64.decode64(params[:image]) 
image_data = StringIO.new(image) 

そして、私は立ち往生しています!

私は基本的にこの画像をpaperclipで保存します。いくつかの深刻な助けが必要です!

更新: コンテンツタイプとファイル名のパラメータを送信できません。私はこれを送信しているクライアントを模倣していただけです(余分なパラメータを追加することはできません)。

+0

別のpost_paramを追加できませんか? {'filename' => 'rails.png'}のようなもの – Serabe

+0

いいえ!私が開発しているAPIは、他のパラメータを送信しません。エンコードされた画像データのみ。だから、私はこれが他のパラメータを送信せずに可能かどうかを知りたい。 – Madhusudhan

+0

あなたは何かを保存するためにユーザー提供のファイル名を使用することを考えていませんか?それは悪い考えです。 –

答えて

4

さまざまなImageMagickのライブラリのいずれかを使用して生のバイトをデコードして、フォーマット用のImageMagickを求めることができます。 RMagickと、例えば:fmt

など あなたに 'PNG'を与える
require 'rmagick' 
bytes = ActiveSupport::Base64.decode64(params[:image]) 
img = Magick::Image.from_blob(bytes).first 
fmt = img.format 

'JPEG'、。 ImageMagickは、マジックナンバーやその他の識別情報のバイト数をチェックするので、ファイルの種類がわかるようにファイル名は必要ありません。

誰かが明示的にあなたにそれを伝えない限り、ファイル名が行く限り、あなたは運がありません。ファイル名はまったく重要ではありません。は、何も保存するために生成しなかったファイル名を使用してください。ユーザーが入力したファイル名は、人に名前を表示するためにのみ使用する必要があります。

+0

これで、paperclipが適切なインスタンスに関連付けることができるようになりました。必要なのはコンテンツタイプだけです。これを試してみましょう。ありがとう! – Madhusudhan

+0

これに感謝して、私は 'PNG'というフォーマットを得ることができました。コンテンツタイプを' image/png'として少なくとも設定することができます – Madhusudhan

0

ファイル名については、投稿するだけで簡単です(post_params = {'image' => image, 'file_name' => same_file_you_passed_to_encode64 })。コンテンツタイプを見つけるには、ruby-filemagicのようなライブラリを使うことができます。

http://rubygems.org/gems/ruby-filemagic

+0

私は開発中のAPIで、他のパラメータは送信しません。エンコードされた画像データのみ。エンコードされたデータだけからファイル名を取得することは可能ですか?私はその可能性を聞いたことがある、私はルビー/レールの道があると確信していた – Madhusudhan

+0

ファイル名が実際の画像データの一部でない限り - IMHOはむしろ奇妙である - 私はそれがどのように終わるかわからないBase64でエンコードされた文字列PHPがEXIFに関連していなかったことについて聞いたことがありますか?ファイル名は埋め込みデータのどこにあるのでしょうか? –

関連する問題