[완료]perl WWW::Mechanize로 파일 업로드 질문입니다.
글쓴이: ipes4579 / 작성시간: 수, 2011/08/03 - 10:42오전
mechanize 의 post 방식을 사용해 파일을 업로드 하려고 합니다.
코드는 대략 다음과 같습니다.
$browser->post("$url", [ "form_key" => $form_key, "summary" => "안녕하세요", "details" => "hhh", "input_file[]" => ["1.pdf", 'Content-Type' => 'application/pdf'], "upload1" => upload1, ], 'Content_Type' => 'form-data', );
이렇게 보내면
HTTP::Message content must be bytes at /usr/local/share/perl/5.10.1/HTTP/Request/Common.pm line 97
다음과 같은 에러 메시지를 내뿜고 죽어버립니다. 아, 참고로 한글을 모두 영어로 바꿔서 보내면 잘 보내집니다.
구글링을 해 보니 분명 utf8 문제 같은데, 거기서 말하는대로
LWP, WWW::Mechanize, HTTP~~~ 등등을 다 업그레이드 하고
/usr/local/share/perl/5.10.1/HTTP/Request/Common.pm 파일에
if( utf8::is_utf8($content)){ $content = Encode::decode('utf8',$content);}
를 추가해도 똑같습니다. 무슨 해결방법 없을까요?
Forums:
펄 모듈 소스를 직접 수정하실 것까지는
펄 모듈 소스를 직접 수정하실 것까지는 없어보이고...
일단 제가 먼저 질문을 하고 싶은데, 본문에 쓰신 소스코드는 현재 use utf8 프라그마가 사용되어 있는 상태 같은데 맞나요?
만일 맞다면
이렇게 한 번 해보시지요.
좋은 하루 되세요!
use utf8; 프라그마 사용하고 있습니다.
use utf8; 프라그마 사용하고 있습니다.
같은 에러가 나오네요. -_ㅠ 혹시몰라
와 같이 영어로 바꾸니 영어는 잘 포스팅 됩니다. 근데 한글이 계속 문제네요..
으음... 영어면 잘 되고 한글이면 안 된다면
으음... 영어면 잘 되고 한글이면 안 된다면 저것밖에 안 떠오르는데 말이죠;;
근데 제가 집에 와서 비슷하게 만들어서 해봤는데... 에러가 안 나요;
스트로베리 펄 5.10
WWW::Mechanize 1.68
HTTP::Request::Common 5.824 - 최신은 6.00 이던데 업그레이드하려니 도중에 에러가 나서 실패
이걸 가지고 해봤는데 전혀 저런 에러가 안 나서... 전 두 손 들었습니다 ^^;
해결되시면 꼭 여기에 달아주세요, 나중에라도 와서 저도 배우게요. 해결되길 기원합니다~
좋은 하루 되세요!
raymundo님! 드디어 됐습니다. 이틀째 헤매고
raymundo님! 드디어 됐습니다. 이틀째 헤매고 있었는데 드디어 되었습니다! ㅠ
분명 raymundo님의 모듈들과 제 모듈들의 버전이 같거나 오히려 더 높은데 왜 제꺼에서만 안되나 고민하다가 발견했습니다.
사실 raymundo 님께 거짓말 한 것이 있는데, 저는 use utf8; 프라그마를 사용한 것이 아니라 utf encoding 'utf8'; 프라그마를 사용하고 있었습니다.
거짓말하려던 건 아니었고, 저는 똑같은 건 줄 알았었습니다. -_-; 근데 댓글보고 혹시나 해서 바꿔보니 잘 작동 되는 것을 보고는 정말 놀랐네요.
작동되는 풀 코드 첨부합니다. 네이버 scm인 nforge에 개인적인 프로젝트를 하면서 매일 pdf 파일 업로드 하는 귀찮은 부분을 자동화 하려고 했을 뿐인데
생각보다 오래 걸렸네요. 정말 감사합니다 ! ^^
use encoding 은 쓰지마세요
use encoding은 설계가 잘못된 모듈로 잘못쓰면
ASCII영역을 넘어가는 바이너리 데이터를 다룰때 마구 꼬이게 됩니다.
Perl 유니코드/한글 처리는
http://gypark.pe.kr/wiki/Perl/%ED%95%9C%EA%B8%80
http://bit.ly/4SQUCL
를 읽어보시길 추천드립니다.
좋은 글인 것 같습니다. 정독하면서 유니코드에 대해
좋은 글인 것 같습니다. 정독하면서 유니코드에 대해 혼란한 부분을 많이 정리했습니다. 감사합니다 ^^
외국서적만으로 공부하다보니 항상 한글 처리에서 필연적으로 삽질을 하네요. -_ㅠ
ㅎㅎㅎㅎㅎㅎㅎㅎ 그러셨군요. 다행입니다. 근데 그럼
ㅎㅎㅎㅎㅎㅎㅎㅎ 그러셨군요. 다행입니다.
근데 그럼 아예 encode도 할 필요 없이 그냥
이 상태로는 안 되던가요? 제가 테스트할 때는 이렇게 그냥하니까 되고 encode 하니까 오히려 서버 쪽에서 글이 깨져 있더군요. post()가 알아서 인코드는 해 주는 듯 했는데요.
이 부분만 다시 답해주시면 저도 나중에 참고할 일이 있을지 모르니 부탁드립니다 ^^;
좋은 하루 되세요!
저는 encode('UTF-8', "안녕하세요")를
저는 encode('UTF-8', "안녕하세요")를 "안녕하세요" 로 바꿔 보내니 안됩니다.
동일한 에러메시지가 나오네요. 미묘한 모듈 버전의 차이 때문일까요?
혹은 위 링크를 참고해보니 파일 인코딩 문제일 수도 있을 것 같기도 하고.. 아아 한글 어렵네요.
정말 묘하군요ㅋ나중에라도 혹시 필요할지 몰라서,
정말 묘하군요ㅋ
나중에라도 혹시 필요할지 몰라서, 제가 썼던 테스트 코드를 올려 둡니다.
서버쪽 form.cgi
윈도우PC 쪽의 post.pl
결과:
1) 인코드 안 하고, content_type 지정하는 라인 주석처리
2) 인코드 안 하고, content_type 라인 추가
3) 인코드 하고, content_type 지정하는 라인 주석처리
보다시피 한글이 인코드를 하면 오히려 받는 쪽에서 보면 깨져 있네요
4) 인코드 하고, content_type 라인 추가
인코드를 하면 "가각간"이 "%C3%AA%C2%B0%C2%80%C3%AA%C2%B0%C2%81%C3%AA%C2%B0%C2%84"가 되어 있는데, 이건 "가각간"을 UTF-8로 인코드한 "%EA%B0%80%EA%B0%81%EA%B0%84"를 한번 더 UTF_8로 인코드한 결과입니다. 즉 이중으로 인코딩해버린거죠.
그래서 저는 그냥 디코드된 상태의 "안녕하세요"를 post()에 인자로 넣으면 post에서 알아서 바꿔준다고 생각했는데 ipes4579님의 경우는 그 반대로, 인코드를 해서 post()에 넣어야 하고, 하지 않을 경우 에러가 나는 상황이군요.
저는 POST 나 CGI 이런 거 잘 몰라서... 제 post.pl 또는 form.cgi 코드 쪽에 뭔가 ipes4579님과 다르게 동작할 원인이 있는 건지는 잘 모르겠네요. 암튼 일단 상황 정리는 되었고 나머지는 지나가던 고수님이 봐주시길 바랄 수 밖에~
좋은 하루 되세요!
댓글 달기