使用WWW :: Mechanize模块的submit_form例程发布/提交文件

时间:2016-10-05 12:57:31

标签: perl mechanize

我遵循指南

  

如果要提交文件并从文件系统中的标量而不是文件中获取其内容,可以使用:

$mech->submit_form(with_fields => { logfile => [ [ undef, 'whatever', Content => $content ], 1 ] } );
来自WWW :: Mechanize documentation

我提交文件的代码

$mech->submit_form(with_fields => 
            { logfile => [ [ undef, "import_codes.xlsx", Content => $file_dir ], 1 ] });

失败的例外;

Can't call method "value" on an undefined value at /usr/local/share/perl/5.18.2/WWW/Mechanize.pm line 1568.
 at /usr/local/share/perl/5.18.2/WWW/Mechanize.pm line 1568.
    WWW::Mechanize::set_fields('WWW::Mechanize=HASH(0xf51b040)', 'logfile', 'ARRAY(0xf71e6dc)') called at /usr/local/share/perl/5.18.2/WWW/Mechanize.pm line 1948
    WWW::Mechanize::submit_form('WWW::Mechanize=HASH(0xf51b040)', 'form_name', 'inputform', 'fields', 'HASH(0xf71e920)') 

第1560行至第1575行的Mechanize.pm的代码片段。

sub set_fields {
    my $self = shift;
    my %fields = @_;

    my $form = $self->current_form or $self->die( 'No form defined' );

    while ( my ( $field, $value ) = each %fields ) {
        if ( ref $value eq 'ARRAY' ) {
            $form->find_input( $field, undef,
                         $value->[1])->value($value->[0] );
        }
        else {
            $form->value($field => $value);
        }
    } # while
}

1 个答案:

答案 0 :(得分:3)

看起来您在表单中使用了错误的字段名称作为文件输入字段。 (强调我的)。

  

如果要提交文件并从文件系统中的标量而不是文件中获取其内容,可以使用:

                                    vvvvvvv
$mech->submit_form(with_fields => { logfile => [ [ undef, 'whatever', Content => $content ], 1 ] } );

logfile是您希望放置文件内容的输入字段的name属性。在他们的示例中,它是 logfile ,但是在您的网站上的真实形式中“试图提交它可能是别的东西。

$mech->submit_form来电$mech->form_with_fields。该方法的文档说:

  

如果未找到任何表单,则返回undef。

当它set_fields时,它将失败,因为返回了undef

使用正确的字段名称,它应该可以使用。