【问题标题】:Perl CGI Input type FILEPerl CGI 输入类型 FILE
【发布时间】:2017-01-30 08:49:02
【问题描述】:

我正在尝试做一个简单的 Perl CGI 脚本..用户可以在网页上上传一个 excel 文件..该文件将存储在一个文件夹中,稍后我将进行一些操作。

我可以使用“textarea”语法创建带有文本框的网页。下面是我的工作代码。

sub output_form {
my ($q) = @_;
print $q->start_form( -name   => 'main', -action => 'cgi.cgi', -method => 'POST', -enctype => 'multipart/form-data');
print $q->start_table;
print $q->Tr(
    $q->td(' Upload the spreadsheet here  :'),
       $q->textarea(-name => "text", -size => 200, -cols => 30, -rows => 5 )
    )
);

print $q->Tr( $q->td( $q->submit( -value => 'Submit' ) ),
$q->td(' ') );
print $q->end_table;
print $q->end_form;

}

但是,我的问题是我想要输入类型的文件..以便我可以要求用户浏览并附加电子表格..我无法提供任何帮助。

互联网上的例子很少..这是 HTML ..但我想要 CGI 方式

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    互联网上的例子很少..这是 HTML ..但我想要一种 CGI 方式

    这听起来你有点困惑。这里有两个步骤。首先,您需要创建正确的 HTML 输入,然后,您需要处理该输入以上传文件。这两个阶段发生在两个完全不同的时间,以响应两个单独的 HTTP 请求。它看起来像这样:

    • 步骤 1
      • HTTP 请求 - 用户访问您的网页。
      • HTTP 响应 - 您的 Web 应用返回包含文件输入的 HTML。
    • 步骤 2
      • HTTP 请求 - 用户填写并提交表单。
      • HTTP 响应 - 您的 Web 应用程序处理请求,对文件执行任何需要的操作,然后将 HTML 返回给用户,说“谢谢。您的文件已收到”。

    那么,第 1 步。如何创建文件输入运算符。我怀疑“我想要一种 CGI 方式”是指“我如何使用 HTML 生成功能来做到这一点?”首先阅读官方 CGI.pm 文档 - HTML Generation functions should no longer be used。我们已经知道,曾经作为 CGI.pm 一部分的 HTML 生成功能至少在 15 年内都是一个糟糕的想法。现在应该没有人使用它们。这就是两年前删除这些功能的文档的原因。请改用templating system

    但最终,这并不重要。如果您坚持,您仍然可以使用 HTML 生成功能 (the documentation is here),或者您可以理智并使用包含文件输入的模板。您的表单甚至可以在静态 HTML 文件中。无论您选择哪种方法,最终都会将 HTML 返回到浏览器,其中包含以下内容:

    <input type="file" name="file_upload"  />
    

    (看,这并不难。HTML 生成功能确实让生活变得比需要的更难!)

    然后,一旦用户填写了表格并点击“提交”,您就需要处理该输入。 The documentation for doing that is here. 但是,总而言之,您可以使用以下方法获取文件名:

    my $filename = $q->param('file_upload');
    

    或者,可能更有用的是,您可以从以下位置获取文件内容的打开文件句柄:

    my $io_handle = $q->upload('file_upload');
    

    这意味着您可以使用如下代码将文件写入服务器上的某个位置:

    if ( my $io_handle = $q->upload('file_upload') ) {
      open ( my $out_file, '>>', $some_file_path ) or die $!;
      while ( my $bytesread = $io_handle->read($buffer,1024) ) {
        print $out_file $buffer;
      }
    }
    

    您还可以通过以下方式获取上传文件的 MIME 类型:

    my $type = $q->uploadInfo( $io_handle )->{'Content-Type'};
    

    但我建议您阅读所有文档以了解所有详细信息。

    附言哦,还有CGI? 2016年?!请看something a little more up to date

    【讨论】:

    • 我现在使用“mod_perl”,只是因为它是解决我的问题最可行的解决方案。
    • @peterh-ReinstateMonica:您的程序是否部署为 CGI、mod_perl 或任何其他环境并不重要。但是,如果您将代码编写到 PSGI 规范中,您可以在这些环境之间移动而无需更改任何内容。
    【解决方案2】:

    我的问题是我想要文件的输入类型..以便我可以要求用户浏览并附加电子表格.. ==>(只是查看)您可以使用文件字段。

    例如

    $q->filefield(
        -name      => 'filename',
        -size      => 40,
        -maxlength => 80,
        -accept => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel');
    

    当用户点击文件字段时,它将仅显示目录中存在的 Excel 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 2022-06-18
      • 2023-03-27
      • 2015-06-23
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多