1

現在、ユーザーからいくつかの写真を取得して新しい写真を返すSinatraアプリを作成しています。

hamlフォームの一部があります:

  %input{type:'file', name:'user_image'}

そしてハンドラーからのコードがあります:(モンタージュは別の写真です)

  source_userpic = params[:user_image][:tempfile]
  blob = File.open(source_userpic).read
  userpic = ImageList.new
  userpic.from_blob(blob)
  resized_img = userpic.scale(montage.columns,
                              montage.rows)
  resized_img.opacity = MaxRGB/3

次に、2つの画像がコンポジットで「レイヤー化」されて保存されます(必要ありません)

  final_picture = ImageList.new
  final_picture << montage.composite(resized_img, 0, 0, OverCompositeOp)


  final_picture.write("./public/uploads/#{DateTime.now}.jpg" # dirty (for example)

次に、ajaxでfinal_pictureを表示する必要があります。2つの明らかな問題があります。1つはfinal_pictureを保存する必要がないことです。2つ目はプレビューだけです。次に、ファイル名の競合を回避するためのコードを作成する必要があります。

表示するfinal_pictureを送信するにはどうすればよいですか?to_blobメソッド?しかし、次は何ですか?

4

2 に答える 2

5

私はデータURIスキームを使用してそれを解決しました。

require 'base64'

final_picture.format = "jpeg" # whatever
# Using a to_blob method to create a direct-to-memory version of the image.
# Then encode it to base64 string
data_uri = Base64.encode64(final_picture.to_blob).gsub(/\n/, "") 
@image_tag = '<img alt="preview" src="data:image/jpeg;base64,%s">' % data_uri

haml:'pages/preview'

次に、によって画像を表示します

= @image_tag

それが最善の解決策かどうかわからない

于 2013-02-18T11:33:51.090 に答える
1

Tempfileを見てください。これにより、ファイル名の競合が処理されます。

次に、 send_fileを使用して一時ファイルを送信し、この質問への回答からこの手法を使用できます。

一時ファイルは永続化されないことを覚えておく必要があります。そのため、ファイルを提供するためにさまざまな要求と応答を使用している場合は、その永続性を注意深く管理する必要があります。

于 2013-02-18T00:40:06.117 に答える