2009-09-17 4 views
0

has_many : photos (paperclip으로 처리되는 파일 첨부)라는 Book이라는 모델이 있습니다.JSON API를 통해 HTTP를 통한 첨부 파일 첨부

현재 libcurl을 사용하는 Paul Dix의 Typhoeus gem을 사용하여 JSON을 통해 내 Rails 앱과 통신 할 클라이언트를 구축 중입니다.

새 Book 개체를 게시하기는 쉽습니다. 나는이 쿼리에 사진을 추가 할 때

require 'rubygems' 
require 'json' 
require 'typhoeus' 

class Remote 
    include Typhoeus 
end 

p Remote.post("http://localhost:3000/books.json", 
    { :params => 
    { :book => { :title => "Hello There" }}}) 

내 문제는 시작 : 제목을 가진 새 책 기록을 만들려면 "안녕하세요"나는이 ​​같은 간단한 작업을 수행 할 수있다.

Parameters: {"commit"=>"Submit", "action"=>"create", "controller"=>"books", "book"=>{"title"=>"Hello There", "photo_attributes"=>[{"image"=>#<File:/var/folders/1V/1V8Kw+LEHUCKonqJ-dp3oE+++TI/-Tmp-/RackMultipart20090917-3026-i6d6b9-0>}]}} 

을 그리고 내 가정은 내가 Remote.post 호출에서 동일한 쿼리를 다시 찾고 있어요입니다 : 단순히 HTML 양식을 통해 첨부 파일을 게시하는 것은 쿼리를 다음과 같이 만듭니다.

해시 배열 내의 구문을 사용하면 가장 좋은 결과를 얻을 수 있다고 생각합니다. 나는 같은 될 것이라고, 일하는 것이 기대되었다 어떤 변화 할 시도했습니다 :

p Remote.post("http://localhost:3000/books.json", 
    { :params => 
    { :book => { :title => "Hello There", 
       :photo_attributes => [{ :image => "/path/to/image/here" }] }}}) 

을하지만 내가 해시로 만들기 위해 노력하고있어 문자열로 연결하는 것, 그리고 반환 (=> ""해시 이미지에 상관없이 난에 무엇을) :

NoMethodError (undefined method `stringify_keys!' for "image/path/to/image/here":String): 

하지만이 아닌 경우 여기 내 구문에 어떤 문제가 있는지 파악 너무 많은 시간을 낭비하고 싶지 않아 어쨌든 일하게 될텐데, 그래서 나는 내가 여기 올 것이라고 생각했다.

내 질문 : 올바른 방향에 있습니까? 이상한 연결 문자열 대신 해시 배열을 게시하려면이 구문을 지우면 이미지를 Book 개체로 전달하기에 충분합니까?

아니면 내가 잘못 접근하고 있습니까?

답변

1

사실, xhr을 통해 파일을 게시 할 수 없습니다. 자바 스크립트에서 파일을 전혀 처리하지 못하도록하는 보안상의주의가 필요합니다. 이 문제를 해결하기위한 트릭은 숨겨진 iframe에 파일을 게시하는 것이며, iframe은 전체 페이지 새로 고침을 피하면서 서버에 정기적으로 게시합니다. 이 기술은 가능성이 하나의 시도, 여러 장소에 자세히 설명되어 있습니다 (그들은 PHP를 사용하고,하지만 원칙은 동일하게 유지하고, 도움이되는 긴 토론이) :

Posting files to a hidden iframe

+0

이것은 매우 흥미로운 점은이 그러나이 클라이언트는 브라우저 기반 응용 프로그램이 아니므로 안타깝게도 iframe은 문제가되지 않습니다. – btw