문제

게시물이있는 서버에 이미지를 업로드하고 싶습니다. 이 작업이 들리는 것처럼 간단하게 루비에는 간단한 솔루션이없는 것 같습니다.

내 응용 프로그램에서 나는 사용 중입니다 www :: 기계화 대부분의 것에 대해 나는 이것에 대해서도 그것을 사용하고 싶었고 다음과 같은 소스를 가지고있었습니다.

f = File.new(filename, File::RDWR)
reply = agent.post(
    'http://rest-test.heroku.com',
    {
         :pict       =>  f,
         :function   =>  'picture2',
         :username   =>  @username,
         :password   =>  @password,
         :pict_to    =>  0,
         :pict_type  =>  0
    }
)
f.close

이로 인해 서버에서 완전히 쓰레기가 준비된 파일이 생겨납니다.

Alt Text http://imagehub.org/f/1tk8/garbage.png

다음 단계는 www :: mechanize 버전 0.8.5로 다운 그레이드하는 것이 었습니다. 이것은 내가 실행하려고 할 때까지 효과가 있었는데, "hpricot_scan.so에서 찾을 수없는 모듈"과 같은 오류로 실패했습니다. 종속성 워커 도구를 사용하여 HPRICOT_SCAN.이 필요로하는 MSVCRT-Ruby18.dll이 필요합니다. 그러나 그 .dll을 내 루비/빈 폴더에 넣은 후에는 더 이상 디버그 할 수없는 곳에서 빈 오류 상자를 주었다. 따라서 여기서 문제는 Mechanize 0.8.5가 Nokogiri 대신 HPRICOT에 의존한다는 것입니다 (완벽하게 작동).


다음 아이디어는 다른 보석을 사용하는 것이 었으므로 net :: http를 사용해 보았습니다. 짧은 연구 후에 나는 net :: http에 멀티 파트 형식에 대한 기본 지원이 없으며 대신 당신을 위해 등장하는 클래스를 구축해야한다는 것을 알 수 있습니다. 내가 찾을 수있는 가장 도움이되는 것은 Stanislav Vitvitskiy의 멀티 파트 클래스. 이 수업은 지금까지 좋아 보였지만 게시하고 싶지 않기 때문에 필요한 일을하지 않습니다. 파일, 나는 또한 일반적인 데이터를 게시하고 싶고 그의 수업에는 불가능합니다.


나의 마지막 시도는 사용하는 것이었다 휴식. 파일을 업로드하는 방법에 대한 예가 있었기 때문에 이것은 유망한 것처럼 보였습니다. 그러나 나는 양식을 멀티 파트로 게시 할 수 없습니다.

f = File.new(filename, File::RDWR)
reply = RestClient.post(
    'http://rest-test.heroku.com',
    :pict       =>  f,
    :function   =>  'picture2',
    :username   =>  @username,
    :password   =>  @password,
    :pict_to    =>  0,
    :pict_type  =>  0
)
f.close

나는 사용 중입니다 http://rest-test.heroku.com 제대로 전송되는 경우 디버그 요청을 다시 보내고 항상 다시 돌아옵니다.

POST http://rest-test.heroku.com/ with a 101 byte payload,
content type application/x-www-form-urlencoded
{
    "pict" => "#<File:0x30d30c4>",
    "username" => "s1kx",
    "pict_to" => "0",
    "function" => "picture2",
    "pict_type" => "0",
    "password" => "password"
}

이것은 사용하지 않는다는 것을 분명히 보여줍니다 multipart/form-data 콘텐츠 유형이지만 표준 application/x-www-form-urlencoded, 그것은 확실히 그것을 본다 pict 파일입니다.


전체 인코딩 및 데이터를 직접 정렬하지 않고 Luby의 파일을 Multipart Form에 업로드하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

긴 문제, 짧은 대답 : Windows에서 이미지를 읽기위한 이진 모드가 누락되었습니다.

f = File.new(filename, File::RDWR)

그랬어야했다

f = File.new(filename, "rb")

다른 팁

또 다른 방법은 배쉬와 컬을 사용하는 것입니다. 여러 파일 업로드를 테스트하고 싶을 때이 방법을 사용했습니다.

bash_command = 'curl -v -F "file=@texas.png,texas_reversed.png"                         
http://localhost:9292/fog_upload/upload'
command_result = `#{bash_command}` # the backticks are important <br/>
puts command_result
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top