私のRailsアプリでは、画像をアップロードでき、メタデータはデータベーステーブルに保存され、ファイルはディスクに正常に書き込まれます(アップロードはattachment_fuによって処理されます)。
これは正常に機能し、ユーザーのアバターを表示できますが、アップロード フォームで jQuery プラグインを使用して、アップロードする前にユーザーが画像をトリミングできるようにしているため、フォームPOST
データには画像とx
、、、およびパラメーターy
があります。w
h
次に、これらを使用してアップロードされた画像をトリミングしようとしましたが、RMagick によって作成された新しい画像は 1x1 の空の画像です。以下の画像パスをハードコーディングして、問題の可能性を排除しました。読み取られた画像は、そうでなければアプリが存在するため、確実に存在します。エラーをスローします。
# top of controller
require 'RMagick'
include Magick
def change_avatar
image = Magick::Image.read(RAILS_ROOT + '/public/files/avatars/0000/0027/940.jpg').first
cropped_image = image.crop(params[:x].to_i, params[:y].to_i, params[:w].to_i, params[:h].to_i, true).write(RAILS_ROOT + '/public/files/avatars/0000/0027/940_1.jpg')
redirect_to '/portal/profile/' + a.id.to_s
end
参考までに、Ruby 1.8.7 と Rails 2.3.14
アップデート
いろいろいじった後、トリミングと上書きは、アップロードされた特定の画像を読み取った場合にのみ機能することに気付きました。
image = Magick::Image.read(RAILS_ROOT + '/public/files/avatars/0000/0001/940.jpg').first
しかし
に変更しても
image = Magick::Image.read(RAILS_ROOT + '/public/files/avatars/0000/0007/940.jpg').first
これは 2 回アップロードされた同じ画像です (それ以上ですが、テスト目的で同じ画像を使用していることを指摘するだけです)、再書き込みされたファイルは 1 x 1 の空白/空の画像として保存されます。
両方とも同じ権限を持っていますが、画像が実際に保存されているため、それが要因だとは思いません。この特定の 1 つの画像に対してのみどのように機能するかわかりません。
更新 2
モデルでattachment_fu
は、アップロードされた画像のサイズを 200 x 200 に変更していたので、アップロードされた画像にトリミングが適用されたのではなく、トリミングされたバージョンに適用されていたと思うので、どこかで何かを台無しにしていたと思います1 x 1 の画像が得られました。
tldr::resize_to => '200x200',
モデルから削除されました。