怎么使用CGI模块?(2)
四,实现文件上传功能 在PHP中要实现基于WEB的文件上传是非常容易的,但是PERL却没有那么简单,需要获取表单中要上传的文件,然后采用read函数读取,然后写入服务器上的文件。对一些初学者来说,这样的代码具有一定的难度。但是使用CGI模块的话,一切将迎刃而解。下面我们还是通过演示的方式介绍给大家:
#==========[HTML]==========#
<form method="post" action="file.pl" enctype="multipart/form-data">
<input type="file" name="FILE_NAME">
</form>
我们在上面的HTML页面中设置了一个叫FILE_NAME的文件域,通过这个域可以选择本地机器上的任何文件,下面是一段完整的实现文件上传的PERL代码:
#==========[PERL]==========#
#!/usr/bin/perl
############################
# 代码:文件上传
# 作者:王骜骋
############################
use CGI qw/:standard/; # 使用CGI模块
my $cgi = new CGI; # 建立一个新的对象
my $filename = $cgi->param('FILE_NAME'); # 获取表单中的FILE_NAME域
print $cgi->header("text/html; charset=gb2312"); # 输出HTML头,编码为简体中文
&error("请选择一个文件!") if ($filename eq ""); # 如果没有选择文件就提交返回错误信息
my $type = $cgi->uploadInfo($filename)->{'Content-Type'}; # 获取上传文件的类型
my $want = "image/pjpeg"; # 你需要用户上传的文件类型,我们这里只能让用户上传JPEG图片
&error("系统只允许你上传JPEG图片") if ($type ne $want); # 如果文件类型不符合返回错误
open (OUTFILE,">>./YOUR_FILE_NAME.jpg"); # 写入到服务器的本地文件
binmode(OUTFILE); # 文件句柄设置为二进制模式
while (my $bytesread=read($filename,$buffer,1024)) {
print OUTFILE $buffer;
}
close(OUTFILE); # 关闭文件
print "文件上传成功!";
sub error {
print $_[0];
exit;
}