загрузка файла perl не может инициировать дескриптор файла - PullRequest
1 голос
/ 07 июля 2010

Я пытался использовать этот очень простой скрипт для загрузки файла на мой сервер.По какой-то причине это не работает.В журнале ошибок apache я получаю следующее сообщение:


Use of uninitialized value in <HANDLE> at /opt/www/demo1/upload/image_upload_2.pl line 15.
readline() on unopened filehandle at /opt/www/demo1/upload/image_upload_2.pl line 15.

#!/usr/bin/perl -w

use CGI;  

 $upload_dir = "/opt/www/demo1/upload/data"; 
 $query = new CGI; 
 $filename = $query->param("photo"); 
 $filename =~ s/.*[\/\\](.*)/$1/; 
 $upload_filehandle = $query->upload("photo"); 

 open UPLOADFILE, ">$upload_dir/$filename"; 
 binmode UPLOADFILE; 

 while ( <$upload_filehandle> ) 
 { 
   print UPLOADFILE; 
 } 

 close UPLOADFILE;

 1

Есть идеи, что там не так?Спасибо mx

Ответы [ 2 ]

7 голосов
/ 07 июля 2010

Для формы загрузки файла необходимо указать enctype="multipart/form-data".См. Документация W3C .

Кроме того, обратите внимание на следующее:

#!/usr/bin/perl

use strict; use warnings;
use CGI;

my $upload_dir = "/opt/www/demo1/upload/data"; 
my $query = CGI->new; # avoid indirect object notation

my $filename = $query->param("photo"); 
$filename =~ s/.*[\/\\](.*)/$1/; # this validation looks suspect

my $target = "$upload_dir/$filename";

# since you are reading binary data, use read to
# read chunks of a specific size

my $upload_filehandle = $query->upload("photo"); 
if ( defined $upload_filehandle ) {
    my $io_handle = $upload_filehandle->handle;
    # use lexical filehandles, 3-arg form of open
    # check for errors after open
    open my $uploadfile, '>', $target
        or die "Cannot open '$target': $!";
    binmode $uploadfile;

    my $buffer;        
    while (my $bytesread = $io_handle->read($buffer,1024)) {
        print $uploadfile $buffer
            or die "Error writing to '$target': $!";
    }
    close $uploadfile
        or die "Error closing '$target': $!";
}

См. Документация CGI .

0 голосов
/ 30 января 2014

Если вы загружаете текстовый файл, то ниже следует установить в <head> html-файл:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

В противном случае $file_name = $query->param("file_name") определяется в скалярном контексте (print $file_name) и undef в контексте файла (<$file_name>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...