【问题标题】:How can I handle HTTP file uploads?如何处理 HTTP 文件上传?
【发布时间】:2010-09-14 19:54:21
【问题描述】:

如何编写一个 Perl CGI 脚本,通过 HTTP post 接收文件并将其保存到文件系统?

【问题讨论】:

    标签: perl cgi file-upload


    【解决方案1】:

    使用CGI module

    my $fh = $query->upload('upload_field');
    while(<$fh>) {
      print SAVE_FILE $_;
    }
    

    【讨论】:

      【解决方案2】:

      请注意:无论您怎么写,不要将其保存在您的网络服务器可访问的位置。

      现在重点是:下面是我使用了一段时间来上传照片的脚本。它可能需要一些调整,但应该会为您指明方向。

      由于图片未上传到网络可访问目录,因此我们有单独的过程对其进行检查、调整大小、添加水印并将其放置在可以访问的位置。

       #!/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 = $1;
      }
      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
      

      【讨论】:

      • 在 perl 5.6 及更高版本中,您可以将文件打开模式与文件名分开,使其“更安全”,例如 open(my $fh, ">", $file_name) 或 die "Can '不打开 $filename: $!"。在 5.8 及更高版本中,您甚至可以使用“-|”或 "|-" 并为剩余的 args 使用数组以获得更安全的 fork/execs。
      • 对 :) 我远不是一个知道 perl golf 允许每个版本中的哪些错误的 perl 黑客;)感谢您提供的信息 :)
      【解决方案3】:
      【解决方案4】:

      我首先使用CGI 和读取CREATING A FILE UPLOAD FIELD,然后使用open 创建一个文件并使用print 写入它。 (然后close 关闭它)。

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 2013-10-16
        • 2010-12-30
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 2018-02-08
        • 2021-04-03
        相关资源
        最近更新 更多