11

クライアントがBlackberryおよびAndroidフォンから画像をアップロードしようとしています。彼らは、a)フォームパラメータやb)マルチパートメッセージを投稿するのが好きではありません。彼らがやりたいのは、ファイルのデータのみを使用してURLにPOSTを実行することです。

このようなことはcurlで行うことができます: curl -d @google.png http://server/postcards/1/photo.json -X POST

アップロードした写真をハガキモデルの写真属性と適切なディレクトリに配置したいと思います。

コントローラでこのようなことをしていますが、ディレクトリでイメージが破損しています。今のところ、ファイルの名前を「png」に手動で変更しています。

def PostcardsController < ApplicationController
...
# Other RESTful methods
...
def photo
  @postcard = Postcard.find(params[:id])
  @postcard.photo = request.body
  @postcard.save
end

モデル:

class Postcard < ActiveRecord::Base
  mount_uploader :photo, PhotoUploader
end
4

1 に答える 1

18

これは可能ですが、クライアントが元のファイル名(およびタイプに対して検証を行う場合はコンテンツタイプ)を送信する必要があります。

def photo
  tempfile = Tempfile.new("photoupload")
  tempfile.binmode
  tempfile << request.body.read
  tempfile.rewind

  photo_params = params.slice(:filename, :type, :head).merge(:tempfile => tempfile)
  photo = ActionDispatch::Http::UploadedFile.new(photo_params)

  @postcard = Postcard.find(params[:id])
  @postcard.photo = photo

  respond_to do |format|
    if @postcard.save
      format.json { head :ok }
    else
      format.json { render :json => @postcard.errors, :status => :unprocessable_entity }
    end
  end
end

そして今、あなたはを使用して写真を設定することができます

curl http://server/postcards/1/photo.json?filename=foo.png --data-binary @foo.png

また、コンテンツタイプを指定するには、を使用します&type=image/png

于 2011-06-20T21:09:55.560 に答える