2014-03-14 53 views
1

我相信我有一个普通的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来自何处,以及为什么没有出现在日志文件中......但是这可能会降低到与已发生的问题有关的问题已发布

+0

没有协议(HTTP'://')在'$ deposit_url'开始时 – Borodin

+1

你在'write_file'的调用中还需要'binmode =>':raw'' – Borodin

+0

最好使用'unzip -t foo.zip'来验证你的zip文件。另外,如果你只是复制一个zip文件到另一个,那么为什么不使用'File :: Copy? – Borodin

回答

1

The solu重点在于实现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是像/home/services/foo/testing/test_files/PMC165035.zip,并通过这个(全)文件名添加到服务器example.com的所有工作。

问题是,服务器正在寻找一个文件名,而不是一个文件名与路径...所以当服务通过将内容转储到其临时上载位置来处理文件时,然后它寻找~~~temp_location/home/services/foo/testing/test_files/PMC165035.zip,它找不到它!

的解决方案是在该文件中读取,但保证在头信息中给出的文件名是不仅是文件名,而不是与-A-路径

相关问题