2017-12-16 20 views
0

Railsのデコードされたbase64イメージでminiMagickでimage.writeを呼び出す際に問題があります。 image.writeを除いて、すべての行が正しく動作しているようです。以下のコードは私のRails APIのImageControllerにあります。私のReactフロントエンドは、エンコードされた画像でPOSTリクエストを打ちました。MiniMagickはデコードされたBase64イメージを書き込めません

def create 
    uploaded_io = params["image_io"]["base64"] # base64 string + metadata 
    metadata = uploaded_io.split(',/')[0] + "," # "data:image/jpeg;base64," 
    filetype = metadata.split("/")[1].split("base64")[0][0...-1] # "jpeg" 
    base64_string = uploaded_io[metadata.size..-1] # base64 string w/o metadata 
    blob = Base64.decode64(base64_string) 
    image = MiniMagick::Image.read(blob) 
    image.write `#{Time.new.to_i}.#{filetype}` 

    storage = Google::Cloud::Storage.new(
     project_id: ENV['GOOGLE_CLOUD_PROJECT'], 
     credentials: JSON.parse(File.read('config/google_cloud_credentials.json')) 
    ) 

    bucket = storage.bucket "auto-stock-189103.appspot.com" 
    bucket.create_file image,`test/#{Time.new.to_i}.jpg` 
end 

コードの最初の数行に値を説明するコメントを追加しました。 base64_stringコメントするにはあまりにも長かったので、ここでその値です:

"/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABkAAD/4QMtaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTNDQjQyRjlEQTAxMTFFN0E4N0VBNzdGODEwREFGMTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTNDQjQyRkFEQTAxMTFFN0E4N0VBNzdGODEwREFGMTYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxM0NCNDJGN0RBMDExMUU3QTg3RUE3N0Y4MTBEQUYxNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxM0NCNDJGOERBMDExMUU3QTg3RUE3N0Y4MTBEQUYxNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9iZQBkwAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgMDAwMDAwMDAwMBAQEBAQEBAgEBAgICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIAAoACgMBEQACEQEDEQH/xABNAAEBAAAAAAAAAAAAAAAAAAAACQEBAQEAAAAAAAAAAAAAAAAAAAkKEAEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCMKU7f4AAA/9k=" 

テストはhereが正しい画像(赤い四角)をレンダリングすることが、私はimage.writeラインを実行すると、次のエラーが返されます。

bin/rails: No such file or directory - 1513397345.jpeg 
*** NoMethodError Exception: undefined method `write' for nil:NilClass 
nil 

ここimage = MiniMagick::Image.read(blob)の戻り値は、参照のためです:

#<MiniMagick::Image:0x00007f9ba76ba1f8 @path="/var/folders/pf/xhvv11092_j08hw47q6rt9z80000gn/T/mini_magick20171215-26353-l2lcyu", @tempfile=#<Tempfile:/var/folders/pf/xhvv11092_j08hw47q6rt9z80000gn/T/mini_magick20171215-26353-l2lcyu (closed)>, @info=#<MiniMagick::Image::Info:0x00007f9ba76ba1d0 @path="/var/folders/pf/xhvv11092_j08hw47q6rt9z80000gn/T/mini_magick20171215-26353-l2lcyu", @info={}>> 

は最終的に、私の目標は、目をアップロードすることですGoogleクラウドに画像を送信してください。これについては、より良い方法があれば教えてください。私は同様の質問からthis answerに従っているので、私はそれがこのように構造化されているのです。

+0

これはおそらく助けになるでしょうか? https://stackoverflow.com/questions/47637931/base64-jpg-to-base64-png-in-ruby/47640063#47640063 – fmw42

答えて

0

私はあなたの問題は、あなたが二重引用符を使用することを意味バッククォートを使っているということだと思う:

image.write `#{Time.new.to_i}.#{filetype}` 
# ----------^----------------------------^ 

バッククォートは、シェルでその内容を実行しようとします。 1513397345.jpeg(これは#{Time.new.to_i}.#{filetype}と評価される)という実行可能ファイルがないため、エラーが発生します。あなたはおそらくしたい、さらに

bucket.create_file image, "test/#{Time.new.to_i}.jpg" 

:数行その下に再び

image.write "#{Time.new.to_i}.#{filetype}" 

と:

あなたはちょうどあなたが期待している文字列補間を取得するには、昔ながらの二重引用符を使用したいですTime.new.to_iが両方の呼び出しで同じであることが保証されていないため、そのファイル名を変数に格納することができます。

name = "#{Time.new.to_i}.#{filetype} 
image.write name 
#... 
bucket.create_file image, name 
+0

ありがとう、それはトリックでした! – dkershaw

関連する問題