Загрузка необработанного файла в Rails с использованием Carrierwave

Мои клиенты пытаются загрузить изображение с телефонов Blackberry и Android. Им не нравится публикация a) параметров формы или b) многостраничные сообщения. То, что они хотели бы сделать, это сделать POST для URL-адреса только с данными из файла.

Что-то вроде этого можно сделать в 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

Ответ 1

Это можно сделать, но вам все равно понадобятся ваши клиенты для отправки имени файла orignal (и типа содержимого, если вы выполняете какую-либо проверку по типу).

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.