Luby에서 멀티 파트 파일 업로드
문제
게시물이있는 서버에 이미지를 업로드하고 싶습니다. 이 작업이 들리는 것처럼 간단하게 루비에는 간단한 솔루션이없는 것 같습니다.
내 응용 프로그램에서 나는 사용 중입니다 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
이로 인해 서버에서 완전히 쓰레기가 준비된 파일이 생겨납니다.
다음 단계는 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