如何使用CGI.pm模块和Perl上传文件

注意 :如果只需要perl代码,则可以跳到文章结尾。 介绍

将文件从本地计算机上传到远程Web服务器具有许多有用的目的,其中最明显的是文件共享。 例如,您将图像上载到服务器以通过Internet与其他人共享图像。 Perl已准备就绪,可以通过CGI.pm模块上传文件,而CGI.pm模块一直是核心模块,它允许用户执行许多操作而无需了解很多底层技术。

本文本身不是perl教程。 我不会在幕后做很多细节工作,而这些细节都会使一切正常。 有些部分必须包括简短的解释,当然也包括perl代码,但目的不是要教读者perl编程或一般的Internet概念。 我假设您具有HTML的使用经验,并且过去可能已经上载并安装了一两个perl脚本,并且知道该怎么做。 考虑本文更多是“如何做”课程。

我将向您介绍的perl脚本仅使用perl随附的核心模块,因此您无需安装任何模块。 您所需要的只是任何最新版本的perl。 当然,必须在要运行脚本的服务器上安装perl。 您还可以访问在线资源列表,以获取有关本文将要讨论的许多详细信息的更一般的信息。

入门

首先,您需要一个表格。 您可以随时在Internet上看到它们。 您填写一些信息,然后单击一个按钮以将数据发送到服务器。 那是一种形式。 准确的名称是CGI(通用网关接口)形式。 CGI是一种协议,它仅表示一组规则,允许您的计算机与远程服务器进行通信。 只要将服务器设置为可以接受CGI表单数据,并且大多数情况下,一切都很好。 您确实不需要了解任何信息,因此不必担心听起来令人困惑。

CGI表格

以下是一个非常简单的CGI表单:一个文件字段,用户在其中选择要上传的文件;一个文本字段,在此用户输入其电子邮件地址。 我仅以文本字段为例,如果您只需要文件上载字段,则不需要。 您可以选择添加许多其他表单字段,甚至添加更多“文件”字段,这些字段将同时将所有数据发送到服务器。


<FORM ACTION="/cgi-bin/upload.pl" METHOD="post" ENCTYPE="multipart/form-data">
<INPUT TYPE="file" NAME="photo">
<INPUT TYPE="text" NAME="email">
<INPUT TYPE="submit" NAME="Submit" VALUE="Submit Form">
</FORM> 
上面的表单将嵌入HTML文档中,并带有HTML文档应具有的所有适当标签。 如果不确定这些内容,则应该阅读基本的HTML(或网页)教程。 对于文件上传脚本,ENCTYPE =“ multipart / form-data”和TYPE =“ file”是最重要的。 ACTION =“ / cgi-bin / upload.pl”告诉表单将​​数据发送到哪里。 在这种情况下,您的cgi-bin文件夹中的perl脚本名为upload.pl,其中大多数cgi / perl脚本应存储在Web服务器上。 将表单另存为名为upload.html或您喜欢的任何名称的网页,然后将其上传到您的虚拟主机帐户。 如果您没有网络托管帐户,则从这一点开始并不需要太多。 CGI脚本

几乎所有作为CGI进程运行的perl脚本都需要以shebang行开头。 最常见的shebang行是:

#!/usr/bin/perl
它只是告诉服务器在哪里可以找到perl。 您的服务器所需的shebang行可能有所不同。 大多数网络主机会将这些信息发布在其网站的某个位置。 为了良好的perl编码实践和安全性,我们将在shebang行上添加一个开关:-T。 注意 :它必须是大写的T。
#!/usr/bin/perl -T
T代表“异味”模式。 作为脚本的程序员,这实际上是为了防止您犯一个可怕的错误,并允许CGI表单的用户将数据发送到服务器,而该数据可能以不安全的方式使用。 这个文件上传程序实际上非常简单,不会允许用户执行任何此类操作,但是作为CGI进程运行的所有perl脚本都应使用-T开关,因此出于这个原因我将其包括在内。 模组

模块有点像可以在perl程序中使用的单独的perl程序。 许多人编写的模块已成为其他perl程序员一直使用的标准。 我们将使用以下模块:


use strict;
use warnings;
use CGI;
use CGI::Carp qw/fatalsToBrowser/;
use File::Basename; 
前两个不是模块,而是实用程序。 它们会影响perl本身的功能。 我不会为了本文的目的对它们进行解释。 您将不得不相信我,它们在几乎所有perl程序中都非常重要。 “ CGI”模块是将为我们完成所有繁重工作的模块。 它将处理表单数据并将其存储在服务器上。 “ CGI :: Carp”模块确实用于调试,如果有问题,可以帮助您使脚本运行。 如果有任何致命错误导致脚本失败,它将在屏幕上显示一条错误消息。 这些错误也将在服务器错误日志中打印出来。 “ File :: Basename”是一个模块,可用于将文件名/文件路径拆分为单独的部分,以方便脚本处理。 我们将使用它来获取脚本中的文件名和文件扩展名。 设定一些限制

我认为,所有CGI脚本都应限制可传输到服务器的数据量。 否则,一些带有T1线路的傻瓜将开始向您的服务器传输千兆字节的数据,或者使其他用户无法使用该数据,或者用完您分配的所有磁盘空间。 这是我们可以使用CGI模块设置限制的方法:


$CGI::POST_MAX = 1024 * 5000; # adjust as needed (1024 * 5000 = 5MB)
$CGI::DISABLE_UPLOADS = 0; # 1 disables uploads, 0 enables uploads 
第一行确定脚本将允许在服务器上存储的最大数据量(以字节为单位)。 这不是完美的,因为它必须先接收所有数据࿰
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值