2011-06-20 39 views
11

Khách hàng của tôi đang cố gắng tải lên hình ảnh từ điện thoại Blackberry và Android. Họ không thích đăng một tham số biểu mẫu) hoặc b) nhiều thông điệp. Những gì họ muốn làm là làm một POST đến một url chỉ với dữ liệu từ tập tin.Tải tệp thô lên Rails bằng Carrierwave

Something như thế này có thể được thực hiện trong curl: curl -d @google.png http://server/postcards/1/photo.json -X POST

Tôi muốn ảnh tải lên để đưa vào các thuộc tính hình ảnh của mô hình bưu thiếp và vào thư mục bên phải.

Tôi đang làm một cái gì đó như thế này trong bộ điều khiển nhưng hình ảnh bị hỏng trong thư mục. Tôi đang làm một đổi tên nhãn hiệu của tập tin vào một "png" cho bây giờ:

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

Mô hình:

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

Trả lời

18

Điều này có thể được thực hiện nhưng bạn vẫn sẽ cần khách hàng của bạn để gửi các filename orignal (và loại nội dung nếu bạn thực hiện bất kỳ xác nhận nào về loại).

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 

Và bây giờ bạn có thể đặt ảnh sử dụng

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

Và để xác định nội dung kiểu sử dụng &type=image/png.

+0

Vì vậy, khá nhiều điều này là chính xác những gì tôi cần. Chi tiết nhỏ: ảnh mới được tạo (của lớp UploadedFile) yêu cầu "original_filename" được đặt thành thứ gì đó. Carrierwave mong đợi một cái gì đó ở đó ngay cả khi đó là dữ liệu giả. Vấn đề chính của tôi dường như đã được lệnh curl của tôi vì tôi đã không gửi dữ liệu đúng cách. – jevy

+0

Có người hỏi tôi. Đối với lệnh curl, tôi đã sử dụng hình ảnh này: "curl --form" [[email protected];] "http: // server/images.json' – jevy

Các vấn đề liên quan