Загрузка необработанного файла в Rails с использованием Carrierwave - PullRequest
11 голосов
/ 20 июня 2011

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

Что-то подобное можно сделать в curl: curl -d @google.png http://server/postcards/1/photo.json -X POST

Я бы хотелзагруженную фотографию, чтобы поместить в атрибут photo модели открытки и в нужный каталог.

Я делаю что-то подобное в контроллере, но изображение повреждено в каталоге.Я сейчас делаю ручное переименование файла в 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 Ответ

18 голосов
/ 21 июня 2011

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

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.

...