2011-06-20 11 views
11

Moi klienci próbują przesłać obraz z telefonów Blackberry i Android. Nie lubią publikować a) parametrów formularza lub b) wiadomości wieloczęściowych. Co chcieliby zrobić, to POST do adresu URL zawierającego tylko dane z pliku.Przesyłanie nieprzetworzonego pliku do Rails przy użyciu Carrierwave

Coś takiego można zrobić w curl: curl -d @google.png http://server/postcards/1/photo.json -X POST

Chciałbym przesłanego na zdjęcie, aby umieścić w atrybucie zdjęć modelu pocztowe i do odpowiedniego katalogu.

Robię coś takiego w kontrolerze, ale obraz jest uszkodzony w katalogu. Robię ręczną zmianę nazwy pliku do „PNG” na teraz:

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

wersji:

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

Odpowiedz

18

Można to zrobić, ale trzeba jeszcze swoich klientów, aby wysłać orignal pliku (i typ zawartości, jeśli wykonasz jakąkolwiek walidację na typie).

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 

I teraz można ustawić zdjęcie używając

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

a także określić użycie Content-Type &type=image/png.

+0

Więc prawie dokładnie to jest to, czego potrzebowałem. Drobne szczegóły: nowo utworzone zdjęcie (klasy UploadedFile) wymaga ustawienia "original_filename" na coś. Carrierwave spodziewa się, że coś tam będzie, nawet jeśli są to fałszywe dane. Moim głównym problemem wydaje się być moje polecenie curl, ponieważ nie wysyłałem poprawnie danych. – jevy

+0

Ktoś mnie zapytał. Dla polecenia curl użyłem tego: 'curl --form" image [[email protected];] "http: // server/images.json' – jevy

Powiązane problemy