我相信我有一个普通的Perl问题,而不是LWP :: UserAgent问题......但它有点复杂。添加一个.zip文件到LWP :: UserAgent POST请求的主体
任务是编写一个测试脚本,该测试脚本确实存储了一个SWORD。 我通过首先编写代码来创建测试来证明这件事情有效,然后在Test::More
中添加包装以使其成为测试。
背景
剑存款是简单的HTTP POST请求与一群定义首部,和主体是所述事的内容被摄入。这一切工作正常,我可以通过卷曲执行的操作,和我写的脚本来做到这一点....但AA更大的应用程序环境中(那将是EPrints)
CODE
我相信,当我尝试将文件的内容附加到磁盘上时,出现了我的问题。
#!/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" }
什么可行,什么不可行
这段代码是从工作中我有解除非常直接 - 唯一不同的是,工作代码通过一种对象 - 将获取$file
内容在EPrints中调用。
我知道该文件在盘上是否存在,如果我在印刷的文件名做一个ls -l
,看得出该文件,其可读
在上面的代码,有一个线write_file('foo.zip', $file);
- 写入一个其中unzip -l foo.zip
高兴告诉我的文件中有3个文件。
线print "Content: $ret\n";
打印一份原子回应 - 对我来说,不打印输出.... 访问日志报告错误500,但有diddly,蹲在错误日志。
帮助
我需要知道的是我怎么弄的.zip文件的实际内容到LWP :: UserAgent的POST请求的content
部分...
(我要花很多时间不去尝试挖掘EPrints,跟踪错误500来自何处,以及为什么没有出现在日志文件中......但是这可能会降低到与已发生的问题有关的问题已发布)
没有协议(HTTP'://')在'$ deposit_url'开始时 – Borodin
你在'write_file'的调用中还需要'binmode =>':raw'' – Borodin
最好使用'unzip -t foo.zip'来验证你的zip文件。另外,如果你只是复制一个zip文件到另一个,那么为什么不使用'File :: Copy? – Borodin