2013-12-03 3 views
-2

Я уверен, что это было задано, но я не мог найти хороший вопрос к моему ответу. У меня есть два сценария: один делает запись с помощью LWP :: UserAgent, а другой в основном получает данные, в этом случае я просто хочу написать файл. Файл записывается, но он не может быть открыт, а размер 1262, что заставляет меня поверить, что только некоторые из них читаются.Perl LWP :: UserAgent только чтение первой строки опубликованного файла jpg

Вот что я делаю (стоит отметить, что я был uri/base64, кодирующий файл и передающий все через json, который работал, но моя новая задача - разделить файлы и передать все как параметры формы) :

после сценария:

open (IMAGE, "./flower.jpg") or die "$!"; 
$raw_string1 = do{ local $/ = undef; <IMAGE>; }; 

my $req = HTTP::Request->new(POST => $url); 
$req->content_type("application/x-www-form-urlencoded"); 
$req->content("json_string=$json&file_1=$raw_string1"); 

my $ua = LWP::UserAgent->new; 
$res = $ua->request($req); 
print $res->content; 

приемник сценария:

$cgi = CGI->new; 
my $json_post = $cgi->param('json_string'); 
my $file_1 = $cgi->param('file_1'); 

open my $fh, '>', "$path/flower.jpg" or die $!; 
binmode $fh; 
print $fh $file_1; 
close $fh; 

Спасибо за помощь заранее!

+1

ура для случайного голосования! Я могу предоставить больше кода, меньше кода, более подробную информацию о том, что я хочу делать, но случайный рейтинг голосов воняет. – kyle

+1

Как вы получаете переменную '$ file_1'? – TLP

+0

Спасибо за ответ. Я отредактировал мой выше код, чтобы показать его в сценарии приемника. – kyle

ответ

4

Как уже упоминалось, у вас есть проблема с кодировкой. Решение простое:

my $req = HTTP::Request->new(POST => $url, [ 
    json_string => $json, 
    file_1  => $raw_string1, 
]); 

который короток для

my $req = HTTP::Request->new(POST => $url, 
    Content_Type => 'application/x-www-form-urlencoded', 
    Content => [ 
     json_string => $json, 
     file_1  => $raw_string1, 
    ] 
); 

Это гораздо более характерно использование multipart/form-data для загрузки файлов, хотя. И если вы это сделаете, вы можете даже позволить HTTP :: Request загрузить файл для вас!

my $req = HTTP::Request->new(POST => $url, 
    Content_Type => 'multipart/form-data', 
    Content => [ 
     json_string => $json, 
     file_1  => [ 'flower.jpg' ], 
    ] 
); 

CGI.pm обработает это без проблем. См. Раздел docs под названием «ОБРАБОТКА ФАЙЛА ЗАГРУЗКИ ФАЙЛА».

+0

Спасибо за совет! Я получил его, используя ваш совет. Большое спасибо! – kyle

+0

Я действительно закончил с этим: my $ url = ""; my $ data = [json_string => $ json, 'flower.jpg' => $ raw_string1, 'fw4.pdf' => $ raw_string2]; my $ ua = LWP :: UserAgent-> new; $ res = $ ua-> request (POST ($ url, $ data)); print $ res-> content; – kyle

+0

Какой странный формат. Имена файлов как идентификаторы ?! С помощью данных формы ваши поля могут иметь как имена файлов, так и содержимое файла. Опять же, если вы разрабатываете протокол, я рекомендую данные формы. – ikegami

1

Вы не кодируете данные $raw_string1, прежде чем вставлять их в тело HTTP POST. Это означает, что если данные в flower.jpg включает шестигранный 0x26 байт (& обугленного) - в положении 1263, скажем, - то данные POST будет выглядеть следующим образом:

json_string={ ... JSON data ... }&file_1=...1262 bytes of raw JPEG data...&...more JPEG data... 

... Это означает, что любое разбор тела формы для переменных формы обрезает file_1 после 1262 байт.

Я бы рекомендовал продолжать кодирование данных $raw_string1 с помощью base64 или чего-то подобного, даже если вы передадите его как свою собственную переменную POST, а не добавьте ее в данные JSON.

Смежные вопросы