代码之家  ›  专栏  ›  技术社区  ›  Artem Bardachov

如何从POST请求上传文件。内容类型:应用程序/八位字节流。Perl

  •  -1
  • Artem Bardachov  · 技术社区  · 7 年前

    我收到一个帖子请求

    CONTENT_TYPE: application/octet-stream
    

    我得到了所有这样的数据

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   ikegami Gilles Quénot    7 年前

    如果要发布文件:

    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> };
    
        2
  •  0
  •   Artem Bardachov    7 年前

    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;