2011-06-20 19 views
11

私のクライアントは、BlackberryとAndroidの携帯電話から画像をアップロードしようとしています。彼らはポストするのが好きではない)a)フォームパラメータまたはb)マルチパートメッセージ。彼らがやりたがっていることは、ファイルのデータだけでURLへのPOSTを行うことです。このようなCarrierwaveを使ってRAWファイルをRAWファイルにアップロードする

何かがカールで行うことができます 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 

モデル:これは行うことができますが、あなたはまだのorignalファイル名を送信するためにクライアントが必要になります

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

答えて

18

(また、型の検証を行う場合はcontent-type)。

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を指定するには、写真を設定することができます。

+0

これはかなり正確に私が必要としていたものです。マイナーディテール:新しく作成された写真(UploadedFileクラスの)は、 "original_filename"を何かに設定する必要があります。 Carrierwaveはダミーのデータでも何かが存在することを期待しています。私の主な問題は、データを適切に送信していないため、私のカールコマンドであるように見えます。 – jevy

+0

誰かが私に尋ねました。 curlコマンドの場合、私はこれを使用しました: 'curl --form" image [[email protected];] "http:// server/images.json' – jevy

関連する問題