2012-07-09 36 views
5

Tôi có một ứng dụng được xây dựng bằng ruby ​​trên đường ray. Tôi cần phải gửi yêu cầu curl cho ứng dụng đó để tải lên hình ảnh từ máy cục bộ. Trong ruby ​​của tôi trên ứng dụng đường ray tôi đang sử dụng kẹp giấy cho trình tải lên hình ảnh.Yêu cầu Curl để tải ảnh từ máy cục bộ lên ứng dụng đường ray

Bây giờ yêu cầu curl này đang làm việc hoàn toàn tốt đẹp như không có hình ảnh tải lên cho yêu cầu curl này:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"user":{"first_name":"John","last_name":"Smith"},"token":"api"}' http://localhost:3000/users/8 

Bây giờ tôi muốn tải lên một hình ảnh từ localmachine của tôi.

Thêm "display_photo": @ test.jpg không hoạt động: Đây là những gì tôi đã cố gắng: (. Nhưng nó không làm việc)

curl -v -H -F "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"user":{"first_name":"firstname","last_name":"lastname","display_photo":@test.jpg},"token":"api"}' http://localhost:3000/users/8 

Vì vậy, câu hỏi là làm thế nào để tải lên hình ảnh/dữ liệu file/video từ yêu cầu curl

EDIT

Đây là bộ điều khiển của tôi:

def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to(@user, :notice => 'User was successfully updated.') } 
     format.json { render :file => "users/json/show.json.erb", :content_type => 'application/json' } 
     else 
     format.html { render :action => "edit" } 
     format.json { 
      @errors_object = @user 
      render :file => "shared/json/errors.json.erb", :content_type => 'application/json' } 
     end 
    end 
    end 

Trong mô hình của tôi:

class User < ActiveRecord::Base 
    has_attached_file :display_photo, :styles => { :medium => "200x200#", :thumb => "100x100#", :very_small=>"24x24#" } 
end 
+0

bạn có muốn tải lên ảnh nội tuyến của mình không ?! – phoet

+0

@phoet nội tuyến gì? yêu cầu cập nhật tiểu sử của bạn. Tôi muốn cập nhật hình ảnh hồ sơ của người dùng. –

+0

vâng, nhưng bạn đang cố gắng để đặt một tập tin từ máy địa phương của bạn thành một chuỗi json. hoặc làm tôi hiểu lầm lệnh curl của bạn? – phoet

Trả lời

13

bạn thường sẽ tải lên một tập tin như thế này:

curl -i -F [email protected] http://localhost:5000/ 

làm như vậy bắt chước các hành vi mà bạn sẽ phải thông qua một tập tin tải lên webbrowsers.

nếu bạn nhìn vào phản hồi đường ray cho điều này, nó được gửi qua application/octet-stream có thể được xử lý đúng cách dưới dạng tệp được tải lên. như xa như tôi biết nó không thể làm điều này với một yêu cầu json:

Started POST "/" for 127.0.0.1 at 2012-07-10 09:40:59 +0200 
Processing by HomeController#index as */* 
    Parameters: {"filedata"=>#<ActionDispatch::Http::UploadedFile:0x007f82d59a3580 @original_filename="upload.txt", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"filedata\"; filename=\"upload.txt\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/f_/wjnrg7cd3d9f1tpy3k5fhrwm0000gn/T/RackMultipart20120710-30471-1t9abns>>} 
+0

hãy xem phần chỉnh sửa của tôi. Đây là cách tôi chấp nhận yêu cầu của tôi. Tôi đã xóa kiểm tra api_token khỏi mã. Làm thế nào bạn có thể giúp tôi trong việc chuyển các thuộc tính như first_name, last_name và một hình ảnh hiển thị chỉ sử dụng một cuộc gọi. –

+0

hãy xem ví dụ này http://leejava.wordpress.com/2009/07/30/upload-file-from-rest-in-ruy-on-rail-with-json-format/ – phoet

+0

Lưu ý " submitata "một phần là tên của tập tin tải lên thực tế đó là những gì bạn sẽ sử dụng để tham khảo ở phía máy chủ. – cevaris

6

tôi đã cùng một vấn đề và tôi giải quyết nó với những điều sau đây, mà bỏ qua các yêu cầu JSON:

curl -v -H 'Content-Type: multipart/form-data' -H 'Accept: application/json' -H 'x-api-key:myapikey' -F "user[first_name]=firstname" -F "user[last_name]=lastname" -F "user[display_photo][email protected]" http://localhost:3000/users/8 
0
curl -v -include --form "<param>[email protected]/<root>/image_name.png" http://<your url> 
**<param>**: The image parameter of the url; 
**<root>**: You can use pwd get image root; 
**<your url>**: Post url; 
+0

Vui lòng xem xét chỉnh sửa bài đăng của bạn để thêm giải thích thêm về mã của bạn và tại sao nó sẽ giải quyết vấn đề. Một câu trả lời mà hầu hết chỉ chứa mã (ngay cả khi nó hoạt động) thường không giúp OP hiểu được vấn đề của họ. – Drenmi

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