2016-06-03 2 views
0

Ранее я опубликовал сценарий загрузки файлов PERL, который я использовал годами, которые таинственно перестали работать. С тех пор я попробовал другой скрипт (заимствованный с сайта - https://www.sitepoint.com/uploading-files-cgi-perl/), и он тоже не работает. Мне действительно нужно получить скрипт загрузки файлов, работающий на нашем сайте, поэтому любая помощь приветствуется.Файлы, не загружаемые через Perl Script

Когда я пытаюсь загрузить файл с использованием формы html, он работает правильно и отображает экран подтверждения. Файл существует в папке загрузки, но он пуст. Я изменил разрешения на 777 в папке, где хранятся файлы для загрузки, но это, похоже, не помогло. Таким образом, он может открыть файл в папке, но не писать на него.

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>File Upload</title> 

    </head> 

    <body> 

    <form action="/cgi-bin/upload.cgi" method="post" enctype="multipart/form-data"> 
    <h2 style="margin-left:40px;">Nursing File Upload</h2> 

    <p style="margin-left:40px;margin-top:40px;font-size:24px;">File to Upload: <input type="file" name="photo" /></p> 

    <p style="margin-left:40px;font-size:24px;">Password: <input type="password" name="password" /></p> 

    <p style="margin-left:40px;font-size:24px;"><input type="submit" name="Submit" value="Submit Form" /></p> 

    </form> 

    </body> 

    </html> 

PERL КОД

#!/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/httpd/cgi-bin/ge"; 

    my $query = new CGI; 
    my $filename = $query->param("photo"); 
    my $password = $query->param("password"); 

    if ($password ne "nursing1") 
    { 
    print $query->header (); 
    print "Password incorrect. Please try again."; 
    exit; 
    } 

    if (!$filename) 
    { 
    print $query->header (); 
    print "There was a problem uploading your 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 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"  \"DTD/xhtml1-strict.dtd\">"; 
    print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">"; 
    print "<head>"; 
    print "<meta http-equiv=\"Content-Type\" content=\"text/html;  charset=utf-8\" />"; 
    print "<title>Thanks!</title>"; 
    print "<style type=\"text/css\">"; 
    print "img {border: none;}"; 
    print "</style>"; 
    print "</head>"; 
    print "<body>"; 
    print "<p>Thanks for uploading your file!</p>"; 
    print "</body>"; 
    print "</html>"; 
+1

Я думаю, что сегодня файл-пятница. Это третий вопрос о загрузке файлов через сеть почти в ряд. : D – simbabque

+0

Несколько отладочных вопросов. (1) Пробовал ли вы линию в ответе на предыдущий вопрос, чтобы посмотреть файл _temporary_, который пишет сервер? Это может помочь проверить, работает ли эта часть процесса. То же самое происходит и с этим новым скриптом. (2) Можете ли вы добавить еще одну печать вместе с 'print UPLOADFILE', чтобы печатать в том месте, где вы, безусловно, можете записать файл, например, ваш домашний каталог? – zdim

+0

Попробуйте напечатать UPLOADFILE $ _; – Nagaraju

ответ

0

разрешения Ваша папка должна быть установлена ​​на 755. Не загружайте в CGI-BIN, переместить папку оттуда. Загруженные файлы могут быть установлены с разрешениями 644 chmod 0644, $upload_dir.'/'.$filename; после вас close UPLOADFILE;, но с этим сценарием загрузки у вас все еще есть несколько проблем с безопасностью.