簡體   English   中英

我可以使用HTTP :: Request :: Common :: post發送二進制變量嗎?

[英]Can I send a binary variable using HTTP::Request::Common::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函數,這里有個問題:

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 ],
  ],
);
}

然后這樣稱呼它:

post(\%wdb);

旁注:預定義變量,如

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

被認為是不好的風格。 應該在盡可能小的范圍內聲明變量,這通常意味着應在首次使用變量時聲明它。

(此外,3個空格的縮進是很奇怪的。)


根據curl手冊-F指定用於Web表單提交的字段(特別是multipart/form-data格式)。 前綴為@的值可使curl上傳文件(附加到POST請求)。

LWP::UserAgent文檔post方法在下面調用HTTP::Request::Common::POST

POSTHTTP::Request::Common文檔說,您可以通過將內容類型指定為'form-data'來創建multipart/form-data請求。 它還說您可以通過將數組引用指定為表單字段值來進行文件上傳,並且可以通過設置Content偽頭(繞過從磁盤讀取實際文件)來創建“虛擬文件”。

放在一起:

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存儲在$_ ),我們生成一個鍵值對。 關鍵是表單字段名稱(由field和當前計數器值組成),該值是數組引用(這是我們的文件上傳規范)。

數組引用包含一個undef文件(因為我們不想從磁盤讀取實際文件),一個上載文件名$_ (這是我們希望Web服務器將文件名視為的文件名;也許您想傳遞"$_.gz" ?),最重要的部分是存儲在$files->{$_}下的實際內容。

由於do塊,這一切都在post就發生了,這確實很厚臉皮。 您同樣可以預先創建數據結構:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM