带文件得form上传perl cgi脚本

#! /usr/bin/perl -w


use strict;
use Fcntl;    # C fcntl.h得对应模块,这里会使用其中定义得O_xx等常量。
use CGI;

#定义一些系统控制常量
use constant RECEIVE_FILE_PATH => '/Library/WebServer/Received';
use constant BUFFER_SIZE => 10_240;
use constant MAX_SIZE_FILE_PATH => 1024*1024*512;


my $q = new CGI();
$q->cgi_error and &error($q, 'Having error creating cgi handle: '.$q->cgi_error);
my $username = $q -> param('uname') or &error($q, 'username cannot be fetched');
my $password = $q -> param('pw') or &error($q, 'password cannot be fetched');

#获取上传文件得文件名
my $file = $q -> param('upload_file') or &error($q, 'upload file name cannot be fetched');

#获取上传文件得本地文件句柄
my $fh = $q -> upload('upload_file') or &error($q, 'cannot get the handler of uploaded file with name - '.$file);

# 检查上传文件存储目录,确认未超出限定size值
&file_path_volume_check($q);

#用控制力强得sysopen打开用于写入得句柄,并且保持句柄对应的文件不重名。
until(sysopen(OUTPUT, RECEIVE_FILE_PATH."/$file", O_CREAT|O_EXCL|O_WRONLY)){
$file =~ s/(\w+)(\.\w+)$/$1_$2/;
}

#这是简便的方式,但控制力较弱,不能表达一些sysopen有的逻辑。
#open OUTPUT, "> ".RECEIVE_FILE_PATH."/$file";
# or &error($q, 'open OUTPUT fails');  

#把读写句柄都设置成2进制模式,以免处理的是上传的2进制文件(jpg, zip.....)
binmode $fh;
binmode OUTPUT;


my $buffer ="";

#循环从硬盘读出BUFFER_SIZE大小的字节到内存,然后再通过OUTPUT写入磁盘。这是对无边界的二进制数据的操作方式。
while(read($fh, $buffer, BUFFER_SIZE)){
print OUTPUT $buffer;

}

#如果就是上传的文本(.txt)的话,可用下面简便方式

#while(<$fh>){
# print OUTPUT $_;
#}


close $fh;
close OUTPUT;


&error($q, 'Thank you for uploading!'); 


sub file_path_volume_check{
my ($q) = @_;
opendir DIR, RECEIVE_FILE_PATH or error($q, '/Library/WebServer/Received cannot be opened');
my $path_size;
while(readdir DIR){
$path_size += -s RECEIVE_FILE_PATH."/$_";

erorr($q, 'Library/WebServer/Received  is full, cannot receive more files.') if($path_size > MAX_SIZE_FILE_PATH);
}
sub error{
my ($q, $aug) = @_;
print $q -> header('text/html'),
 $q -> start_html('ERROR'),
 $q -> p('Error is: '.$aug),
 $q -> end_html();
exit 1;

}


*************************************************************

对应的html:

<html>
<head>
Sample Form
</head>
<body>
<p>
<form action='/cgi-bin/form_processor.cgi' method='post' enctype='multipart/form-data'>   #enctype='multipart/form-data' 这种media type格式支持文件上传
username: <input type='text' name='uname' value='username' size='20'><br>
dummy password: <input type='password' name='pw' value='dummy password' size='20'>
<br><br>
<input type='file' name='upload_file'>
<input type='submit' name='submit_button' value='Upload File'>
</form>
   </p>
</body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Python的CGI模块编写脚本分析CSV文件的基本步骤: 1. 创建一个HTML表单,用于上传CSV文件。 ```html <!DOCTYPE html> <html> <head> <title>CSV文件上传</title> </head> <body> <h2>上传CSV文件</h2> <form enctype="multipart/form-data" action="csv_analysis.py" method="POST"> <input type="file" name="csv_file"> <input type="submit" value="上传"> </form> </body> </html> ``` 2. 创建一个Python脚本(csv_analysis.py),用于处理上传的CSV文件。 ```python #!/usr/bin/env python # -*- coding:utf-8 -*- import cgi import csv # 获取上传的CSV文件 form = cgi.FieldStorage() csv_file = form['csv_file'] # 解析CSV文件 csv_reader = csv.reader(csv_file.file) for row in csv_reader: # 处理每一行数据 ``` 3. 在脚本中解析CSV文件,并对数据进行处理。 在上面的示例中,我们使用了Python内置的csv模块来解析CSV文件。通过csv.reader函数可以将CSV文件转换为一个可迭代的对象,然后我们可以使用for循环逐行读取CSV文件的数据,并对数据进行处理。 在处理数据时,可以根据需要进行各种操作,例如计算每一列的平均值、最大值、最小值等等。 4. 将处理后的数据输出到浏览器。 ```python #!/usr/bin/env python # -*- coding:utf-8 -*- import cgi import csv # 获取上传的CSV文件 form = cgi.FieldStorage() csv_file = form['csv_file'] # 解析CSV文件 csv_reader = csv.reader(csv_file.file) # 处理数据 result = [] for row in csv_reader: # 计算每一行的平均值 row_avg = sum(map(float, row)) / len(row) result.append(row_avg) # 输出结果到浏览器 print("Content-Type: text/html;charset=utf-8") print() print("<html>") print("<head>") print("<title>CSV文件分析结果</title>") print("</head>") print("<body>") print("<h2>CSV文件分析结果</h2>") for i, avg in enumerate(result): print("<p>第{}行的平均值为:{:.2f}</p>".format(i+1, avg)) print("</body>") print("</html>") ``` 在上面的示例中,我们将处理后的结果输出到了浏览器中,使用了HTML标签来美化输出的结果。 以上就是使用Python的CGI模块编写脚本分析CSV文件的基本步骤。当然,如果需要更复杂的操作,可以根据具体需求进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值