【问题标题】:Uploading a file with perl LWP PUT method silency fails使用 perl LWP PUT 方法静默上传文件失败
【发布时间】:2016-02-19 20:57:25
【问题描述】:

我正在尝试将文件上传到public API,其代码类似于:

my $ua = LWP::UserAgent->new;
sub uploadbox {
    my $url = "http://host/token";
    my  $response = $ua->put($url, 
        'Content_Type' => 'form-data',
        'Content' => [
            Filedata => [ "$codename.box", "$codename.box", Content_type => 'application/octet-stream' ]

        ]
    );
}
uploadbox();

这段代码运行,没有上传任何东西就退出(上传的文件有300MB大,所以需要时间)。

我是否将正确的参数传递给 put 子例程? 如何进一步调试呢?

【问题讨论】:

  • 该代码不会做任何事情,因为从未调用过uploadbox。它所做的就是编译LWP::UserAgent 及其依赖模块,创建一个对象,然后退出
  • 我正在调用uploadbox();下一行,刚刚更新了代码
  • 也许看看$response 看看错误是什么?
  • 首先让它不静音...打印客户端错误! die $response->status_line if !$response->is_success;
  • 谢谢,这导致 HTTP 状态码为 400,但我找不到原因

标签: perl lwp lwp-useragent


【解决方案1】:

我喜欢使用LWP::ConsoleLogger::Easy 调试LWP::UserAgent 脚本。 (免责声明:这是我自己的模块之一)。

use LWP::ConsoleLogger::Easy qw( debug_ua );
my $ua = LWP::UserAgent->new;
debug_ua( $ua );

# insert the rest of your code here

您现在将从打印到终端的请求和响应中获得大量调试信息。希望这能给您一个很好的起点,让您了解发生了什么。

【讨论】:

    【解决方案2】:

    最后还是决定用curl,免费得到动态状态行

    sub uploadbox {
        my ($url) = @_;
        my $curl = "curl -X PUT $url --upload-file $codename.box";
        $OUTPUT_AUTOFLUSH = 1;
        open(CURL,  '-|', $curl,) or die "error: $ERRNO";
        while (<CURL>) { say; }
     }
    

    不是我最引以为豪的代码,而是...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 2016-11-29
      • 2011-12-17
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 2012-06-05
      • 2018-02-27
      相关资源
      最近更新 更多