如何处理HTTP文件上传?
时间:2020-03-06 15:01:48 来源:igfitidea点击:
我该如何编写一个Perl CGI脚本来通过HTTP发布接收文件并将其保存到文件系统中?
解决方案
请注意:不过我们会编写它,但不要将其保存在可从Web服务器访问的位置。
现在到了要点:下面是我一段时间用于照片上传的脚本。它可能需要进行一些调整,但是应该向我们展示方法。
由于图像未上传到可访问网络的目录,因此我们需要进行单独的过程来检查图像,调整大小,添加水印并将其放置在可以访问的位置。
#!/usr/bin/perl -wT use strict; use CGI; use CGI::Carp qw ( fatalsToBrowser ); use File::Basename; $CGI::POST_MAX = 1024 * 5000; my $safe_filename_characters = "a-zA-Z0-9_.-"; my $upload_dir = "/home/www/upload"; my $query = new CGI; my $filename = $query->param("photo"); my $email_address = $query->param("email_address"); if ( !$filename ) { print $query->header ( ); print "There was a problem uploading your photo (try a smaller file)."; exit; } my ( $name, $path, $extension ) = fileparse ( $filename, '\..*' ); $filename = $name . $extension; $filename =~ tr/ /_/; $filename =~ s/[^$safe_filename_characters]//g; if ( $filename =~ /^([$safe_filename_characters]+)$/ ) { $filename = ; } else { die "Filename contains invalid characters"; } my $upload_filehandle = $query->upload("photo"); open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!"; binmode UPLOADFILE; while ( <$upload_filehandle> ) { print UPLOADFILE; } close UPLOADFILE; print $query->header ( ); print <<END_HTML; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Thanks!</title> </head> <body> <p>Thanks for uploading your photo!</p> </body> </html> END_HTML
有关文件上传,请参见CGI.pm文档。
使用CGI模块。
my $fh = $query->upload('upload_field'); while(<$fh>) { print SAVE_FILE $_; }
首先,我将使用CGI并阅读"创建文件上传字段",并使用open创建文件并进行打印以写入文件。 (然后关闭以将其关闭)。