Загрузка по маске. Вопрос

Тема в разделе "PHP", создана пользователем irk, 25 окт 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. irk

    irk Постоялец

    Регистр.:
    18 май 2009
    Сообщения:
    87
    Симпатии:
    1
    Есть вот такой скрипт, который загружает файл на ftp сервер в локалке. Помогите прикрутить фунцию загрузки по маске, то есть чтобы можно было указать какие файлы можно загружать по расширению, остальные нельзя...

    PHP:
    <?
    $path"АДРЕС FTP СЕРВЕРА";
    if(!
    file_exists($path))
    die(
    "<b>Пожалуйста, создайте папку <font color=red>".$path."</font> и <a href=?>повторите попытку загрузить файл</a>.</b>");
    if(empty(
    $_FILES['UserFile']['tmp_name']))
    echo
    "<form method=post enctype=multipart/form-data>
    Выберите файл для загрузки: <input type=file name=UserFile class='stat'>
    <input type=submit class='stat' value=Загрузить>
    </form>"
    ;
    elseif(!
    is_uploaded_file($_FILES['UserFile']['tmp_name']))
    die(
    "<b><font color=red>Файл не был загружен! Попробуйте <a href=?>повторить попытку</a>!</font></b>");
    else{
    if(@!
    copy($_FILES['UserFile']['tmp_name'],$path.chr(47).$_FILES['UserFile']['name']))
    die(
    "<b><font color=red>Файл не был загружен! Попробуйте <a href=?>повторить попытку</a>!</font></b>");
    else
    echo 
    "<center><b>Файл \"<font color=red>".$_FILES['UserFile']['name']."\"</font> успешно загружён</font></b></center>"."<hr>".

    "<center><b><font color=blue>Ссылка на файл: БЛА-БЛА-БЛА".$_FILES['UserFile']['name']."</font></b></center>"."<hr>".

    "Тип файла: <b>".$_FILES['UserFile']['type']."</b><br>".
    "Размер файла: <b>".round($_FILES['UserFile']['size']/1024.2)." кб.</b>".
    "<hr><center><a href=?>Загрузить ещё один файл!</a></center>";
    }
    ?>
     
  2. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    733
    Симпатии:
    422
    используйте для обработки $_FILES['userfile']['type']

    лучше использовать такую схему (пример с загрузкой изображений:(
    PHP:
    <?php
      $strpicture
    ="";
      if (
    $_FILES['userfile']['error']>0) {
        
    $strpicture.="Ошибка: ";
        switch (
    $_FILES['userfile']['error']):
          case 
    1$strpicture.="размер файла более upload_max_filesize."; break;
          case 
    2$strpicture.="размер файла более max_file_size."; break;
          case 
    3$strpicture.="загружена только часть файла."; break;
          case 
    4$strpicture.="файл не загружен."; break;
        endswitch;
      } else {
        if ((
    $_FILES['userfile']['type']!='image/gif')
        and(
    $_FILES['userfile']['type']!='image/jpeg')
        and(
    $_FILES['userfile']['type']!='image/png')
        and(
    $_FILES['userfile']['type']!='image/pjpeg')) {
          echo 
    "Ошибка: файл должен быть: .gif, .jpg или .png";
        } else {
          if (
    $_FILES['userfile']['tmp_name']) {
            
    // добавлен блок проверки каталогов 
            
    if( !is_dir($_SERVER['DOCUMENT_ROOT'].'/img') ) mkdir($_SERVER['DOCUMENT_ROOT'].'/img');
            if( !
    is_dir($_SERVER['DOCUMENT_ROOT'].'/img/articles') ) mkdir($_SERVER['DOCUMENT_ROOT'].'/img/articles');

            if (
    move_uploaded_file($_FILES['userfile']['tmp_name'],$_SERVER['DOCUMENT_ROOT']."/img/articles/".$_FILES['userfile']['name'])) { // "username" исправлено на "userfile", и добавлено "$_SERVER['DOCUMENT_ROOT']."
              
    $strpicture.="Файл загружен сюда: img/articles/".$_FILES['userfile']['name'];
            } else {
              
    $strpicture.="Ошибка: невозможно поместить файл в каталог.";
            }
          } else {
            
    $strpicture.="Возможна атака через загрузку файла '".$_FILES['userfile']['name']."'.";
          }
        }
      }
      
    $strpicture.="<br/>";

    echo 
    $strpicture;

    $str="<form action='a1.php' name='uploadForm' method='post' enctype='multipart/form-data'>
    <input type='file' name='userfile' />
    <input type='submit' value='Загрузить'  />
    </form>"
    ;
    echo 
    $str;
    ?>
     
    irk нравится это.
  3. irk

    irk Постоялец

    Регистр.:
    18 май 2009
    Сообщения:
    87
    Симпатии:
    1
    t0wer, спасибо!! А как прикрутить к моему коду?((
     
  4. GrizliK

    GrizliK Создатель

    Регистр.:
    4 сен 2009
    Сообщения:
    47
    Симпатии:
    3
    Как то так

    <?php
    $path= "АДРЕС FTP СЕРВЕРА";
    $strpicture="";
    if ($_FILES['userfile']['error']>0) {
    $strpicture.="Ошибка: ";
    switch ($_FILES['userfile']['error']:(
    case 1: $strpicture.="размер файла более upload_max_filesize."; break;
    case 2: $strpicture.="размер файла более max_file_size."; break;
    case 3: $strpicture.="загружена только часть файла."; break;
    case 4: $strpicture.="файл не загружен."; break;
    endswitch;
    } else {
    if (($_FILES['userfile']['type']!='image/gif')
    and($_FILES['userfile']['type']!='image/jpeg')
    and($_FILES['userfile']['type']!='image/png')
    and($_FILES['userfile']['type']!='image/pjpeg')) {
    echo "Ошибка: файл должен быть: .gif, .jpg или .png";
    } else {
    if ($_FILES['userfile']['tmp_name']) {
    // добавлен блок проверки каталогов
    if( !is_dir($_SERVER['DOCUMENT_ROOT'].'/img') ) mkdir($_SERVER['DOCUMENT_ROOT'].'/img');
    if( !is_dir($_SERVER['DOCUMENT_ROOT'].'/img/articles') ) mkdir($_SERVER['DOCUMENT_ROOT'].'/img/articles');

    if (move_uploaded_file($_FILES['userfile']['tmp_name'],$_SERVER['DOCUMENT_ROOT']."/img/articles/".$_FILES['userfile']['name'])) { // "username" исправлено на "userfile", и добавлено "$_SERVER['DOCUMENT_ROOT']."
    $strpicture.="<center><b>Файл \"<font color=red>".$_FILES['UserFile']['name']."\"</font> успешно загружён</font></b></center>"."<hr>".

    "<center><b><font color=blue>Ссылка на файл: БЛА-БЛА-БЛА".$_FILES['UserFile']['name']."</font></b></center>"."<hr>".

    "Тип файла: <b>".$_FILES['UserFile']['type']."</b><br>".
    "Размер файла: <b>".round($_FILES['UserFile']['size']/1024.2)." кб.</b>".
    "<hr><center><a href=?>Загрузить ещё один файл!</a></center>";
    } else {
    $strpicture.="Ошибка: невозможно поместить файл в каталог.";
    }
    } else {
    $strpicture.="Возможна атака через загрузку файла '".$_FILES['userfile']['name']."'.";
    }
    }
    }
    $strpicture.="<br/>";

    echo $strpicture;

    $str="<form action='a1.php' name='uploadForm' method='post' enctype='multipart/form-data'>
    <input type='file' name='userfile' />
    <input type='submit' value='Загрузить' />
    </form>";
    echo $str;
    ?>

    Добавлено через 20 секунд
    PHP:
      <?php
      $path
    "АДРЕС FTP СЕРВЕРА";
      
    $strpicture="";
      if (
    $_FILES['userfile']['error']>0) {
        
    $strpicture.="Ошибка: ";
        switch (
    $_FILES['userfile']['error']):
          case 
    1$strpicture.="размер файла более upload_max_filesize."; break;
          case 
    2$strpicture.="размер файла более max_file_size."; break;
          case 
    3$strpicture.="загружена только часть файла."; break;
          case 
    4$strpicture.="файл не загружен."; break;
        endswitch;
      } else {
        if ((
    $_FILES['userfile']['type']!='image/gif')
        and(
    $_FILES['userfile']['type']!='image/jpeg')
        and(
    $_FILES['userfile']['type']!='image/png')
        and(
    $_FILES['userfile']['type']!='image/pjpeg')) {
          echo 
    "Ошибка: файл должен быть: .gif, .jpg или .png";
        } else {
          if (
    $_FILES['userfile']['tmp_name']) {
            
    // добавлен блок проверки каталогов 
            
    if( !is_dir($_SERVER['DOCUMENT_ROOT'].'/img') ) mkdir($_SERVER['DOCUMENT_ROOT'].'/img');
            if( !
    is_dir($_SERVER['DOCUMENT_ROOT'].'/img/articles') ) mkdir($_SERVER['DOCUMENT_ROOT'].'/img/articles');

            if (
    move_uploaded_file($_FILES['userfile']['tmp_name'],$_SERVER['DOCUMENT_ROOT']."/img/articles/".$_FILES['userfile']['name'])) { // "username" исправлено на "userfile", и добавлено "$_SERVER['DOCUMENT_ROOT']."
                
    $strpicture.="<center><b>Файл \"<font color=red>".$_FILES['UserFile']['name']."\"</font> успешно загружён</font></b></center>"."<hr>".

                
    "<center><b><font color=blue>Ссылка на файл: БЛА-БЛА-БЛА".$_FILES['UserFile']['name']."</font></b></center>"."<hr>".

                
    "Тип файла: <b>".$_FILES['UserFile']['type']."</b><br>".
                
    "Размер файла: <b>".round($_FILES['UserFile']['size']/1024.2)." кб.</b>".
                
    "<hr><center><a href=?>Загрузить ещё один файл!</a></center>";
            } else {
              
    $strpicture.="Ошибка: невозможно поместить файл в каталог.";
            }
          } else {
            
    $strpicture.="Возможна атака через загрузку файла '".$_FILES['userfile']['name']."'.";
          }
        }
      }
      
    $strpicture.="<br/>";

    echo 
    $strpicture;

    $str="<form action='a1.php' name='uploadForm' method='post' enctype='multipart/form-data'>
    <input type='file' name='userfile' />
    <input type='submit' value='Загрузить'  />
    </form>"
    ;
    echo 
    $str;
    ?> 
     
    irk нравится это.
  5. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    733
    Симпатии:
    422
    У вас корявенький код... можно прикрутить так:

    PHP:
    <?php
    $path
    "АДРЕС FTP СЕРВЕРА";
    if(!
    file_exists($path))
      die(
    "<b>Пожалуйста, создайте папку <font color=red>".$path."</font> и <a href=?>повторите попытку загрузить файл</a>.</b>");

      
    $strpicture="";
      if (
    $_FILES['userfile']['error']>0)
      {
        
    $strpicture.="Ошибка: ";
        switch (
    $_FILES['userfile']['error']):
          case 
    1$strpicture.="размер файла более upload_max_filesize."; break;
          case 
    2$strpicture.="размер файла более max_file_size."; break;
          case 
    3$strpicture.="загружена только часть файла."; break;
          case 
    4$strpicture.="файл не загружен."; break;
        endswitch;
      }
        else
      {
        if ((
    $_FILES['userfile']['type']!='image/gif')
        and(
    $_FILES['userfile']['type']!='image/jpeg')
        and(
    $_FILES['userfile']['type']!='image/png')
        and(
    $_FILES['userfile']['type']!='image/pjpeg'))
        {
          echo 
    "Ошибка: файл должен быть: .gif, .jpg или .png";
        }
        else
        {
          if (
    $_FILES['userfile']['tmp_name'])
          {
              if(@!
    copy($_FILES['UserFile']['tmp_name'],$path.chr(47).$_FILES['UserFile']['name']))
                  
    $strpicture.= "<b><font color=red>Файл не был загружен! Попробуйте <a href=?>повторить попытку</a>!</font></b>";
              else
                
    $strpicture.= "<br /><center><b>Файл \"<font color=red>".$_FILES['UserFile']['name']."\"</font> успешно загружён</font></b></center>"."<hr>".
                    
    "<center><b><font color=blue>Ссылка на файл: БЛА-БЛА-БЛА".$_FILES['UserFile']['name']."</font></b></center>"."<hr>".
                    
    "Тип файла: <b>".$_FILES['UserFile']['type']."</b><br>".
                    
    "Размер файла: <b>".round($_FILES['UserFile']['size']/1024.2)." кб.</b>".
                    
    "<hr><center><a href=?>Загрузить ещё один файл!</a></center>";
          }
          else
          {
              
    $strpicture.="Возможна атака через загрузку файла '".$_FILES['userfile']['name']."'.";
          }
        }
      }
      
    $strpicture.="<br/>";

    echo 
    $strpicture;

    $str="<form action='ВАШ_СКРИПТ.php' name='uploadForm' method='post' enctype='multipart/form-data'>
        Выберите файл для загрузки: <input type='file' name='UserFile' class='stat'>
        <input type='submi' class='stat' value='Загрузить'>
    </form>"
    ;
    echo 
    $str;
    ?>

    P.S. 4GrizliK: вы бы привели свой топик в порядок и поправили код?!
     
    irk нравится это.
  6. irk

    irk Постоялец

    Регистр.:
    18 май 2009
    Сообщения:
    87
    Симпатии:
    1
    дайте кто-нибудь готовый рабочий скрипт заливки на удаленный ftp..

    Тот скрипт что в первом посте льет, но льет файл не целиком, а его кусок процентов на 80...хз почему..
     
  7. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    733
    Симпатии:
    422
    Ваш и приведенные мной примеры выше работают через протокол HTTP, а не FTP. Вот эти примеры работают по протоколу FTP.

    вот пример 1:

    image_upload.php
    PHP:
    <?php
    echo '<form action="image_upload.php" method="post" enctype="multipart/form-data">';
    echo 
    'Click the Browse button to find the file you wish to upload';
    echo 
    '<input type="file" name="imagefile">';
    echo 
    '<INPUT TYPE="submit" name="upload" value="upload">';
    echo 
    '</form>';

    //change these values to suit your site
    $ftp_user_name='XXXXXXXX';
    $ftp_user_pass='XXXXXXXX';
    $ftp_server='ftp.YOURSITE.com';
    $ftp_dir='/YOURSITE.COM/public_html/upload/';
    //$web_location is needed for the file_exists function, the directories used by FTP
    //are not visible to it will will always return not found.
    $web_dir='../upload/';
    $web_location=$web_dir.$imagefile_name;

    //build a fully qualified (FTP) path name where the file will reside
    $destination_file=$ftp_dir.$imagefile_name;

    // connect, login, and transfer the file
    $conn_id ftp_connect($ftp_server);
    $login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);
    $upload ftp_put($conn_id$destination_file$imagefileFTP_BINARY);

    //use ftp_site to change mode of the file
    //this will allow it be visible by the world,
    $ch=ftp_site($conn_id,"chmod 777 ".$destination_file);
    // close the FTP stream
    ftp_close($conn_id);

    //verify file was written
    if (file_exists($web_location))
            {
            echo 
    "file was uploaded as $web_location";
            }
    else
            {
            echo 
    "Could not create $web_location";
            }
    //end if
    ?>
    вот пример 2:
    index.html
    HTML:
    <form action="curlupload.php" method="post" enctype="multipart/form-data">
    <div>
    <label for="upload">Select file</label>
    <input name="upload" type="file" />
    <input type="submit" name="Submit" value="Upload" />
    </div>
    </form>
    curlupload.php
    PHP:
    <?php
    if (isset($_POST['Submit'])) {
     if (!empty(
    $_FILES['upload']['name'])) {
         
    $ch curl_init();
         
    $localfile $_FILES['upload']['tmp_name'];
         
    $fp fopen($localfile'r');
         
    curl_setopt($chCURLOPT_URL'ftp://ftp_login:password@ftp.domain.com/'.$_FILES['upload']['name']);
         
    curl_setopt($chCURLOPT_UPLOAD1);
         
    curl_setopt($chCURLOPT_INFILE$fp);
         
    curl_setopt($chCURLOPT_INFILESIZEfilesize($localfile));
         
    curl_exec ($ch);
         
    $error_no curl_errno($ch);
         
    curl_close ($ch);
            if (
    $error_no == 0) {
                
    $error 'File uploaded succesfully.';
            } else {
                
    $error 'File upload error.';
            }
     } else {
            
    $error 'Please select a file.';
     }
    }
    ?>
     
    irk нравится это.
  8. irk

    irk Постоялец

    Регистр.:
    18 май 2009
    Сообщения:
    87
    Симпатии:
    1
    а как доработать код, чтобы после загрузки выводилась ссылка на загруженный файл?

    Вот в этом коде:

    и + почему не выводятся сообщения об успешной/неудачной загрузке файла...хотя в коде это есть?

    index.html
    PHP:
    <form action="curlupload.php" method="post" enctype="multipart/form-data">
    <
    div>
    <
    label for="upload">Select file</label>
    <
    input name="upload" type="file" />
    <
    input type="submit" name="Submit" value="Upload" />
    </
    div>
    </
    form>
    curlupload.php
    PHP:
    <?php
    if (isset($_POST['Submit'])) {
     if (!empty(
    $_FILES['upload']['name'])) {
         
    $ch curl_init();
         
    $localfile $_FILES['upload']['tmp_name'];
         
    $fp fopen($localfile'r');
         
    curl_setopt($chCURLOPT_URL'ftp://ftp_login:password@ftp.domain.com/'.$_FILES['upload']['name']);
         
    curl_setopt($chCURLOPT_UPLOAD1);
         
    curl_setopt($chCURLOPT_INFILE$fp);
         
    curl_setopt($chCURLOPT_INFILESIZEfilesize($localfile));
         
    curl_exec ($ch);
         
    $error_no curl_errno($ch);
         
    curl_close ($ch);
            if (
    $error_no == 0) {
                
    $error 'File uploaded succesfully.';
            } else {
                
    $error 'File upload error.';
            }
     } else {
            
    $error 'Please select a file.';
     }
    }
    ?>
     
  9. t0wer

    t0wer BlackHerald

    Регистр.:
    24 июн 2008
    Сообщения:
    733
    Симпатии:
    422
    тут два варианта:
    1) вы используете функцию чтения файловой директории и формируете таблицу со списком файлов (название, размер, права, ссылка на файл и т.д.)

    2) вы при загрузке формируете текстовый файл с данными о загруженных файлах, потом читаете его и формируете таблицу со списком файлов (название, размер, права, ссылка на файл и т.д.)

    Первый вариант тяжелее, но точнее. Второй вариант быстрее, но при удалении файла из папки нужно править текстовый файл, чтобы он был на текущий момент актуальным.

    Если вам нужна ссылка на только что загруженный файл, то можно при помощи Location из curlupload.php передать название в индексный файл и включив обработчик сформировать на него ссылку. Тогда название файла лучше использовать index.php, а не index.html
    Можно вообще все в одном файле сделать, используя сценарий условий
    PHP:
    if ()
     {
     ...
     }
    else
     {
     ...
     }
     
    irk нравится это.
  10. irk

    irk Постоялец

    Регистр.:
    18 май 2009
    Сообщения:
    87
    Симпатии:
    1
    именно так и нужно, помогите реализовать, если не сложно...
     
Статус темы:
Закрыта.