2017-09-15 14 views
-1

je reçois une requête POST avecComment télécharger un fichier à partir d'une requête POST. CONTENT_TYPE: application/octet-stream. Perl

CONTENT_TYPE: application/octet-stream 

Je reçois toutes les données comme celui-ci

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'); 

Mais lorsque je tente d'imprimer

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

Je reçois ceci:

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

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

Comment puis-je télécharger le fichier filename = offers0_14.xml sur le serveur?

+0

Montrez votre code de téléchargement si vous voulez que nous indiquions ce qui ne va pas avec! – ikegami

+0

@ikegami Je ne comprends même pas comment devrais-je obtenir le nom du fichier. Comme d'habitude, j'ai un nom de fichier dans QUERY_STRING et je l'écris sur le serveur 'my $ filehandle = $ self -> {cgiQuery} -> param ('filename'); my $ filename = $ xmlrootpath. $ CgiData -> {nomfichier}; mon $ buffer; ouvert (OUTFILE, "> $ filename"); while (mon $ bytesread = read ($ filehandle, $ buffer, 1024)) { imprimer OUTFILE $ buffer; } fermer OUTFILE; ' –

+0

Il n'y a pas de nom de fichier à avoir. Maintenant s'il vous plaît remplir ma demande. – ikegami

Répondre

0

La solution est la suivante, que POSTDATA est un fichier binaire. Donc, j'ai obtenu ce fichier par ce code

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

Si vous souhaitez publier un fichier:

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

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

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

Pour le recevoir:

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

Si vous souhaitez publier un formulaire qui comprend un champ de téléchargement de fichier:

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

Pour le recevoir:

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

Oui, j'ai besoin de recevoir le fichier de la requête 'application/octet-stream' et de l'enregistrer sur le serveur. Ce que je devrais faire après 'my $ file = $ cgi-> param ('POSTDATA');' –

+0

Rien. Cela place le fichier (le corps de la requête) dans '$ file'. Il n'y a rien d'autre à faire. – ikegami

+0

Mais il y a du contenu dans le fichier ** offers0_14.xml **. Il y a un gros XML dans ce fichier. Comment devrais-je obtenir ce contenu? –