2017-09-15 119 views
-1

我得到如何從POST請求上傳文件。 CONTENT_TYPE:應用程序/八位字節流。 Perl的

CONTENT_TYPE: application/octet-stream 

POST請求我得到這樣

my $cgiQuery = CGI->new() or die(); 
my $cgiData = $cgiQuery->Vars; 

my $getQuery = CGI->new($ENV{QUERY_STRING}); 
my $getData = $getQuery->Vars; 

foreach my $getKey(keys %{$getData}) 
{ 
    $cgiData->{$getKey} = $getData->{$getKey}; 
} 

my $data = $cgiQuery->param('POSTDATA'); 

但是當我嘗試打印

print Dumper($data) ."\n"; 
print Dumper($cgiData) ."\n"; 

我得到這一切的數據:

$VAR1 = 'type=catalog&mode=file&filename=offers0_14.xml'; 

$VAR1 = { 
     'POSTDATA' => 'type=catalog&mode=file&filename=offers0_14.xml', 
     'session' => 'aa4979ad18f64e4d959dd16444cee5fd' 
    }; 

如何獲取並上傳文件filename = offers0_14.xml到服務器?

+0

如果您希望我們指出它出了什麼問題,請顯示您的上傳代碼! – ikegami

+0

@ikegami我甚至不明白我應該如何得到文件名。像往常一樣,我在QUERY_STRING中獲得了一個文件名,並將其寫入服務器'my $ filehandle = $ self - > {cgiQuery} - > param('filename'); my $ filename = $ xmlrootpath。$ cgiData - > {filename}; my $ buffer; open(OUTFILE,「> $ filename」); (我的$ bytesread = read($ filehandle,$ buffer,1024)) printability } 關閉OUTFILE;' –

+0

沒有文件名。現在請履行我的要求。 – ikegami

回答

0

解決方法是接下來的那個POSTDATA是二進制文件。所以,我通過此代碼獲得該文件

my $file_cgi = CGI->new($ENV{POSTDATA}); 
my $file = $file_cgi->Vars; 

my $filename = path_to_the_file_on_the_server;  
open (OUTFILE,"> $filename"); 
print OUTFILE $file->{POSTDATA}; 
close OUTFILE; 
2

如果要發佈文件:

open(my $fh, '<:raw', $qfn) 
    or die $!; 

my $file = do { local $/; <$fh> }; 

$ua->post($uri, 
    Content_Type => 'application/octet-stream', 
    Content => $file, 
); 

接受它:

my $file = $cgi->param('POSTDATA'); 

如果要發佈包含文件上傳字段的形式:

$ua->post($uri, 
    Content_Type => 'form-data', 
    Content => [ 
     type => 'catalog', 
     mode => 'file', 
     file => [ $qfn ], 
    ], 
); 

接收它:

my $fn = $cgi->param('file'); # Not safe to use!!! 
my $fh = $cgi->upload('file'); 
my $file = do { local $/; <$fh> }; 
+0

是的,我需要從'application/octet-stream'請求接收文件並將其保存到服務器。 '我的$ file = $ cgi-> param('POSTDATA');' –

+0

沒有。將文件(請求的主體)放在'$ file'中。沒有別的事可做。 – ikegami

+0

但是** offers0_14.xml **中有內容。這個文件裏面有一個很大的XML。我應該如何獲得該內容? –

相關問題