簡體   English   中英

將.zip文件添加到LWP :: UserAgent POST請求的正文中

[英]Adding a .zip file to the body of an LWP::UserAgent POST request

我相信我有一個通用的Perl問題,而不是LWP :: UserAgent問題...但是它有些復雜。

任務是編寫一個進行SWORD存放的測試腳本。 我通過首先編寫代碼來證明它可以工作來創建測試,然后添加Test::More包裝器以使其成為測試。

背景

SWORD存放只是帶有多個已定義頭的http post請求,並且正文內容就是要攝取的東西。 一切都很好,我可以通過CURL執行操作,並且我已經編寫了腳本來執行此操作。...但是在一個更大的應用程序環境中(即EPrints)

我認為,當我嘗試將文件內容附加到磁盤上時,就會出現我的問題。

#!/home/cpan/bin/perl
use strict;
use warnings;

use LWP::UserAgent;
##use WWW::Mechanize;
use File::Slurp;
use MIME::Base64;

my $auth     = 'username:password';
my $domain   = 'devel.example.com';

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

my $basedir = "./test_files";

my $package  = 'http://opendepot.org/europePMC/2.0';
my $filename = "$basedir/PMC165035.zip";
my $mime     = 'application/zip';
print "filename: $filename\n";
my $deposit_url = $domain . '/sword-app/deposit/archive';

my $file = read_file( $filename, { binmode => ':raw' } );

# Set up the SWORD deposit
my $autho = "Basic " . MIME::Base64::encode( $auth, '' );

my %headers = (
  'X-Packaging'         => $package,
  'X-No-Op'             => 'false',
  'X-Verbose'           => 'true',
  'Content-Disposition' => "filename=$filename",
  'Content-Type'        => $mime,
  'User-Agent'          => 'Broker Test Harness',
  'Authorization'       => $autho,
); 
my $r = $ua->post( $deposit_url, %headers, Content => $file );

# DEBUG TEST
write_file('foo.zip', $file);

my $ret = $r->decoded_content;
print "Content: $ret\n";
if ( $r->is_success ) { print "Deposited $package successfully" }

什么起作用,什么沒起作用

這段代碼幾乎直接從我擁有的工作代碼中提升了-唯一的區別是,工作代碼通過EPrints中的對象調用獲取$file的內容。

我知道文件存在於磁盤上,如果我對打印的文件名執行ls -l ,則可以看到該文件及其可讀性

在上面的代碼中,有一行write_file('foo.zip', $file); -寫入一個文件,該文件unzip -l foo.zip高興地告訴我其中有3個文件。

print "Content: $ret\\n"; 應該打印一個原子響應-對我來說,它什么都不打印...。訪問日志報告錯誤500,但是錯誤日志中有小矮手。

幫助

我需要知道的是如何將.zip文件的實際內容放入LWP :: UserAgent發布請求的content部分...

(我將花大量時間不嘗試深入研究EPrints,以跟蹤錯誤500來自何處,以及為什么日志文件中什么也沒有出現。...但這可能是由於問題發表了什么)

解決方案在於實現LWP POST正在做什么。

my $filename = "$basedir/PMC165035.zip";
my $file = read_file( $filename, { binmode => ':raw' } );
my %headers = (
  'X-Packaging'         => $package,
  'X-No-Op'             => 'false',
  'X-Verbose'           => 'true',
  'Content-Disposition' => "filename=$filename",
  'Content-Type'        => $mime,
  'User-Agent'          => 'Broker Test Harness',
  'Authorization'       => $autho,
); 

通過將$filename設置$filename /home/services/foo/testing/test_files/PMC165035.zip類的所有東西,並將此(完整)文件名傳遞到服務器example.com ,可以完成所有工作。

問題在於服務器正在尋找文件名,而不是路徑文件名...因此,當服務通過將內容轉儲到其臨時上載位置來處理文件時,它會尋找~~~temp_location/home/services/foo/testing/test_files/PMC165035.zip ,找不到它!

解決方案是讀入文件,但要確保標題中給出的文件名只是文件名,而不是 -a -path的文件名

暫無
暫無

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

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