Perl 我可以使用HTTP::Request::Common::post发送二进制变量吗?
我想用post发送我之前用gzip压缩的数据 请求而不将其保存到文件。 在HTTP::Request::Common的文档中,我看不到任何地方解释了如何发布我之前制作的压缩数据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
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设置的,只是一直在使用它。