Perl 我可以使用HTTP::Request::Common::post发送二进制变量吗?

Perl 我可以使用HTTP::Request::Common::post发送二进制变量吗?,perl,http,gzip,Perl,Http,Gzip,我想用post发送我之前用gzip压缩的数据 请求而不将其保存到文件。 在HTTP::Request::Common的文档中,我看不到任何地方解释了如何发布我之前制作的压缩数据 I want to emulate this call, curl -F "file0=@+Wowhead_Looter.lua.gz" -F "file1=@creaturecache.wdb.gz" -F "file2=@gameobjectcache.wdb.gz" \ -F "file3=@itemca

我想用post发送我之前用gzip压缩的数据 请求而不将其保存到文件。 在HTTP::Request::Common的文档中,我看不到任何地方解释了如何发布我之前制作的压缩数据

I want to emulate this call,
curl -F "file0=@+Wowhead_Looter.lua.gz" -F "file1=@creaturecache.wdb.gz" -F "file2=@gameobjectcache.wdb.gz" \
     -F "file3=@itemcache.wdb.gz" -F "file4=@pagetextcache.wdb.gz" \
     -F "file5=@questcache.wdb.gz" "URL"
我不知道这是一个电话还是多个电话

有人能帮我吗

我有一个函数,它读取所有文件并返回包含所有压缩文件的对象:

sub compress_wdb
{
   my ($wdb_dir,
       $wdb_dir_dh,
       @wdb_dir_files,
       $file,
       $vol,
       $dir,
       $ffile,
       %gzipped_wdb);

   $wdb_dir = shift;
   opendir $wdb_dir_dh, $wdb_dir,;
   @wdb_dir_files = grep(/^.+\..+$/, readdir $wdb_dir_dh);
   closedir $wdb_dir_dh;


   for $file (@wdb_dir_files)
   {
      gzip $wdb_dir."/".$file => \$gzipped_wdb{$file}
          or die "gzip failed: $GzipError\n";
   }

   return %gzipped_wdb;
}
该函数稍后将按如下方式调用:

my %wdb = compress_wdb($wdb_dir);
post(\%wdb);
然后是post功能,我有一个问题:

sub post
{
   my ($auth_user, $auth_password, $data, $ua, $req);

   $ua = LWP::UserAgent->new;

   $req = $ua->post("URL",
  Content_Type => 'form-data',
  Content => [
   #  $addon => [ $obj ],
  ],
);
}
这就是所谓的:

my %wdb = compress_wdb($wdb_dir);
post(\%wdb);

旁注:预先删除变量,如

   my ($wdb_dir,
       $wdb_dir_dh,
       @wdb_dir_files,
       $file,
       $vol,
       $dir,
       $ffile,
       %gzipped_wdb);
这被认为是不好的风格。变量应该在尽可能小的范围内声明,这通常意味着它应该在首次使用时声明

(另外,3个空格缩进也很奇怪。)


根据,
-F
指定web表单提交的字段(特别是
多部分/表单数据
格式)。前缀为
@
的值使curl上传文件(附加到POST请求)

下面是
post
方法调用
HTTP::Request::Common::post

说明您可以通过将内容类型指定为
'form-data'
来创建
多部分/表单数据
请求。它还说,您可以通过指定数组引用作为表单字段值来进行文件上载,还可以通过设置
内容
伪头(绕过从磁盘读取实际文件)来创建“虚拟文件”

总而言之:

sub post
{
    my ($files) = @_;

    my $ua = LWP::UserAgent->new;

    my $response = $ua->post(
        "YOUR URL HERE",
        Content_Type => 'form-data',
        Content => [
            do {
                my $i = 0;
                map +(
                    'file' . $i++ => [ undef, $_, Content => $files->{$_} ] 
                ),
                sort keys %$files
            }
        ],
    );

    ...
}
我们迭代
%$files
的键,我假设它们是压缩文件的短名称。(我们也按字母顺序进行,以使其具有确定性,这通常有利于调试。)

我们还维护一个计数器(
$i
),用于生成表单字段名

对于每个文件名(由
map
存储在
$\uuu
中),我们生成一个键值对。键是表单字段名(由
字段
和当前计数器值组成),值是数组引用(这是我们的文件上载规范)

数组引用包含一个文件
undf
(因为我们不想从磁盘读取一个真实的文件),一个上传文件名
$
(这就是我们希望web服务器看到的文件名;也许你想在这里传递
“$.gz”
),以及最重要的部分,
$files->{$}下存储的实际内容

所有这些都发生在对
post
的调用中,这要归功于
do
块,这当然是无礼的。您也可以提前创建数据结构:

my @fields;
for my $name (sort keys %$files) {
    push @fields, 'file' . @fields => [ undef, $name, Content => $files->{$name} ];
    # we don't need a counter here because we can just ask @fields how big it is
}

然后在
post
调用中传递
Content=>\@字段

   my ($wdb_dir,
       $wdb_dir_dh,
       @wdb_dir_files,
       $file,
       $vol,
       $dir,
       $ffile,
       %gzipped_wdb);
这被认为是不好的风格。变量应该在尽可能小的范围内声明,这通常意味着它应该在首次使用时声明

(另外,3个空格缩进也很奇怪。)


根据,
-F
指定web表单提交的字段(特别是
多部分/表单数据
格式)。前缀为
@
的值使curl上传文件(附加到POST请求)

下面是
post
方法调用
HTTP::Request::Common::post

说明您可以通过将内容类型指定为
'form-data'
来创建
多部分/表单数据
请求。它还说,您可以通过指定数组引用作为表单字段值来进行文件上载,还可以通过设置
内容
伪头(绕过从磁盘读取实际文件)来创建“虚拟文件”

总而言之:

sub post
{
    my ($files) = @_;

    my $ua = LWP::UserAgent->new;

    my $response = $ua->post(
        "YOUR URL HERE",
        Content_Type => 'form-data',
        Content => [
            do {
                my $i = 0;
                map +(
                    'file' . $i++ => [ undef, $_, Content => $files->{$_} ] 
                ),
                sort keys %$files
            }
        ],
    );

    ...
}
我们迭代
%$files
的键,我假设它们是压缩文件的短名称。(我们也按字母顺序进行,以使其具有确定性,这通常有利于调试。)

我们还维护一个计数器(
$i
),用于生成表单字段名

对于每个文件名(由
map
存储在
$\uuu
中),我们生成一个键值对。键是表单字段名(由
字段
和当前计数器值组成),值是数组引用(这是我们的文件上载规范)

数组引用包含一个文件
undf
(因为我们不想从磁盘读取一个真实的文件),一个上传文件名
$
(这就是我们希望web服务器看到的文件名;也许你想在这里传递
“$.gz”
),以及最重要的部分,
$files->{$}下存储的实际内容

所有这些都发生在对
post
的调用中,这要归功于
do
块,这当然是无礼的。您也可以提前创建数据结构:

my @fields;
for my $name (sort keys %$files) {
    push @fields, 'file' . @fields => [ undef, $name, Content => $files->{$name} ];
    # we don't need a counter here because we can just ask @fields how big it is
}

然后在
post
调用中传递
Content=>\@fields

我认识的人不知道如何发送包含变量内容的文档。我认识的人不知道如何发送包含变量内容的文档。Re“还有,3空格缩进很奇怪”,:p感谢您的详细解释。最后一个是我使用的解决方案。3个空格的缩进是从emacs设置的,只是一直在使用它。Re“另外,3个空格的缩进很奇怪”,p详细解释如下。最后一个是我使用的解决方案。3个空格的缩进是从emacs设置的,只是一直在使用它。