2016-09-21 106 views
1

我想要做一个简单的Perl CGI脚本..其中用户可以上传一个网页上的Excel文件..将存储在一个文件夹中,稍后我会做一些操作。Perl的CGI输入类型文件

我可以使用“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; 

}

不过,我的问题是我想要的文件的输入类型..所以,我可以要求用户浏览和附加spreadsheet..which我不能做任何帮助将不胜感激。

上有internet..which的HTML ..但我希望有一个CGI方式

回答

0

上有internet..which的HTML ..但我想一个CGI方式几个例子几个例子

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

  • 步骤1
    • HTTP请求 - 用户访问你的网页。
    • HTTP响应 - 您的Web应用程序返回包含文件输入的HTML。
  • 步骤2
    • HTTP请求 - 用户填写并提交表单。
    • HTTP响应 - 您的Web应用程序处理请求,执行需要的所有操作,然后向用户返回HTML,例如“Thank you。Your file has been received”。

所以,第1步如何创建文件输入操作。我怀疑“我想要一种CGI方式”,你的意思是“我如何使用HTML生成函数来做到这一点?”首先阅读官方CGI.pm文档 - HTML Generation functions should no longer be used。我们已经知道,曾经是CGI.pm一部分的HTML生成函数至少在十五年内是一个糟糕的主意。现在没有人应该使用它们。这就是为什么这些功能的文档在两年前被删除的原因。请改用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'}; 

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

p.s.哦,还有CGI? 2016年?!请看something a little more up to date