2013-07-09 7 views
0

Я столкнулся с небольшой проблемой здесь. У меня есть следующие формы, которые я использую, чтобы предоставить возможность пользователям загружать один или несколько файлов:Как я могу переименовать несколько файлов при загрузке

<form action="RejoinReq.php" method="post" enctype="multipart/form-data"> 
    Attachment 1: <input type="file" name="file[]" id="file" maxlength="500" accept="application/pdf,image/*" /> 
    <input type="submit" name="submit" value="Request" /> 
</form> 

Далее, мне нужно переименовать файл (ы) перед сохранением их на сервер. Для этого я пытаюсь использовать:

RejoinReq.php

<?php 

function findexts ($filename) { 
    $filename = strtolower($filename); 
    $exts = explode(".", $_FILES["file"]["name"]); 
    $n = count($exts) - 1; 
    $exts = $exts[$n]; 
    return $exts; 
} 
$ext = findexts($_FILES['file']['name']); 
$target = "upload/"; 
$target = $target . $_SESSION['myusername'] . "Rejoin." . $ext; 
if (file_exists("upload/" . $_FILES["file"]["name"])) { 
    //echo $_FILES["file"]["name"] . " already exists. "; 
} 
else { 
    move_uploaded_file($_FILES["file"]["tmp_name"],$target); 
    //echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
} 

Обновлено - Модификация на PHP код

Предупреждение: findexts() ожидает параметр 1, чтобы быть строка, массив данные

Внимание: move_uploaded_file() ожидает параметр 1, чтобы быть строка, массив с учетом

+1

Прежде всего, нет нужно написать все в шапках вашего кода. Это раздражает. Кроме того, попробуйте использовать атрибут ['multiple'] (http://www.w3.org/TR/html-markup/input.file.html#input.file.attrs.multiple) атрибута' file input' –

+0

, который было не все, но в любом случае я обновил свой код, извиняюсь, чтобы раздражать вас, теперь я добавил 'multiple =" muliple "' в свой код, по-прежнему та же ошибка. –

+0

Код будет работать для 1 цикла _provided, что '$ _FILES [" file "]' is ** not ** empy_ (так что сначала проверьте это). Также: не определяйте функции в цикле и делайте это 'findexts ($ name)', и пусть он снова использует свой параметр, а не суперкоммулят '$ _FILES'. – Wrikken

ответ

1

Здесь должно быть все, что вам нужно!

index.html с формой:

<form action="RejoinReq.php" method="post" enctype="multipart/form-data"> 
    Attachment(s): <input type="file" name="file[]" id="file" maxlength="500" accept="application/pdf,image/*" multiple> 
    <input type="submit" name="submit" value="Request"> 
</form> 

И получающей RejoinReq.php:

<?php 

// config 
$upload_dir = '/var/www/html/upload'; // set your upload dir 
$max_size = 1048576; // max file size: 1 MB 
$allow_override = FALSE; // allow uploading files overriding existing ones 
$valid_exts = array(// allowed extensions 
    'gif', 
    'jpeg', 
    'jpg', 
    'png', 
    'pdf', 
); 
$valid_types = array(
    'image/gif', 
    'image/jpeg', 
    'image/jpg', 
    'image/pjpeg', 
    'image/x-png', 
    'image/png', 
    'text/pdf', 
    'application/pdf', 
); 

// reorganize files array 
$files = array(); 
foreach ($_FILES['file'] as $attr => $arr) { 
    foreach ($arr as $k => $v) { 
     $files[$k][$attr] = $v; 
    } 
} 

// loop thru files 
foreach ($files as $file) { 
    $status = 'Failure'; 

    // get extension 
    $extension = pathinfo($file['name'], PATHINFO_EXTENSION); 

    // make sure extension and type are not empty 
    if (! (strlen($extension) && strlen($file['type']))) { 
     $msg = 'File extension or type not found'; 
    } 
    else { 

     // make sure extension and type are allowed 
     if (! (in_array($file['type'], $valid_types) && in_array($extension, $valid_exts))) { 
      $msg = "Extension '$extension' or file type '$file[type]' is not permitted"; 
     } 
     else { 

      // make sure file is not empty 
      if (! $file['size']) { 
       $msg = 'File seems to be empty (0 KB)'; 
      } 
      else { 

       // make sure file is not too large 
       if ($file['size'] > $max_size) { 
        $msg = 'File is too large (' . ceil($file['size']/1024) . 'kB > ' . floor($max_size/1024) . 'kB)'; 
       } 
       else { 

        // rename file here as you need 
        $target = "$upload_dir/$_SESSION[myusername]Rejoin.$file[name]"; 

        // make sure files don't override 
        if (! $allow_override && file_exists($target)) { 
         $msg = "File already exists"; 
        } 
        else { 

         // no other errors 
         if ($file['error'] > 0) { 
          $msg = "Unknown upload error (Code: $file[error])"; 
         } 
         else { 

          // attempt uploading 
          if (! move_uploaded_file($file['tmp_name'], $target)) { 
           $msg = 'Upload failed. Folder issues?'; 
          } 
          else { 

           // all good! 
           $msg = 'Upload successful!'; 
           $status = 'Success'; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    $out[] = "$file[name]: $status. $msg"; 
} 

echo implode("\n", $out); 

/* End of file */ 
+1

Do ** NOT ** используйте атрибут '['type']' в $ _FILES для обеспечения безопасности. Трудно злоупотреблять. И не используйте операции массива для дополнительного расширения файла. Собственный 'pathinfo() PHP PHP делает это уже для вас. –

+0

@MarcB, спасибо за отзыв! Вначале есть атрибут 'accept = 'application/pdf, image/*" 'в форме HTML. Затем я использую '['type']' в сочетании с расширением (часть имени файла) как только одна из нескольких проверок. Если вы считаете это совершенно бесполезным, пожалуйста, не стесняйтесь редактировать мой ответ. – Geo

+0

@ Geo, в первую очередь спасибо за ваши усилия, я попытался запустить этот код, но у меня появились ошибки: 'Строгие стандарты: только переменные должны передаваться по ссылке в' в строке 'if (! (Strlen ($ extension = end (explode ('.', $ file ['name']))) && strlen ($ file ['type']))) {' –

2

Этот код должен быть переписан полностью, чтобы быть полезным.

<?PHP 
$filekeys=array_keys($_FILES); 
foreach($filekeys as $activefile) 
    { 
    if($_FILES[$activefile]['error']==0) 

     { 
     $file= fopen($_FILES[$activefile]['tmp_name'],'r'); 
     $content = fread($file, filesize($_FILES[$activefile]['tmp_name'])); 
     fclose($file); 
      //determine $target here 
      $file2= fopen($target,"w"); 
      fwrite($file2,$content); 
      fclose($file2); 
      } 
    } 
?> 

Этот код будет работать для любого количества файлов, но вам нужно обрабатывать изменения $ целей все, что вы хотите, чтобы это было для каждого файла.

Это немного сложнее, но это позволяет вам манипулировать $ content. Он адаптирован из некоторого кода, который я использую для хранения зашифрованных файлов в базе данных, следовательно, необходимо извлечь содержимое файла.

+0

исправьте меня, если я ошибаюсь, эта функция будет открыть файл temp, создать новый файл, а затем закрыть его. –

+0

Я обновил свой код, попробуйте еще раз проверить. –

+0

Да, вы правы, код, который я предоставил, открывает временный файл, делает его содержимое доступным как $ Затем содержимое сохраняет $ content как новый файл, $ target.Временный файл удалит себя. Upvote для публикации собственного исправления. –

0

Попробуйте это:

<?php 

class Upload_Rename{ 


    const ALLOWED_TYPES = "jpg,gif,png"; 

    public static function generate_new_name($extension,$uppercase=true,$prefix='',$sufix=''){ 
     $new_name = $prefix.uniqid().'_'.time().$sufix; 
     return ($uppercase ? strtoupper($new_name) : $new_name).'.'.$extension; 
    } 

    public static function check_and_get_extension($file){ 

     $file_part  = pathinfo($file); 
     $allowed_types = explode(",",Upload_Rename::ALLOWED_TYPES); 

     if(!in_array($file_part['extension'], $allowed_types)){ 
      throw new Exception('Not ok.. bad bad file type.'); 
     } 

     return $file_part['extension']; 
    } 


    public function upload($file,$target_destination){ 

     if(!isset($file['tmp_name'])){ 
      throw new Exception('Whaaaat?'); 
     } 

     $_name = $file['name']; 
     $_tmp = $file['tmp_name']; 
     $_type = $file['type']; 
     $_size = $file['size']; 


     $file_extension = ''; 

     try{ 
      $file_extension = Upload_Rename::check_and_get_extension($_name); 
     }catch(Exception $e){ 
      throw new Exception('Ops.. file extension? what? '.$e->getMessage()); 
     } 

     $new_name = Upload_Rename::generate_new_name($file_extension,true,'whaat_','_okey'); 
     $destination = $target_destination . DIRECTORY_SEPARATOR . $new_name; 

     return move_uploaded_file($_tmp, $destination); 
    } 

    public function multiple_files($files,$destination){ 

     $number_of_files = isset($files['tmp_name']) ? sizeof($files['tmp_name']) : 0; 

     $errors = array(); 

     for($i=0;$i<$number_of_files;$i++){ 
      if(isset($files['tmp_name'][$i]) && !empty($files['tmp_name'][$i])){ 
       try{ 
        $this->upload(array(
         'name'=>$files['name'][$i], 
         'tmp_name'=>$files['tmp_name'][$i], 
         'size'=>$files['size'][$i], 
         'type'=>$files['type'][$i] 
        ),$destination); 
       }catch(Exception $e){ 
        array_push($errors,array('file'=>$files['name'][$i],'error'=>$e->getMessage())); 
       } 
      } 
     } 

     print_r($errors); 
    } 

} 

if($_FILES){ 
    $upload = new Upload_Rename(); 
    $destination = dirname(__FILE__); 
    $upload->multiple_files($_FILES['myfile'],$destination); 
} 
?> 

<form method="post" enctype="multipart/form-data"> 
    <?php for($i=0;$i<10;$i++): ?> 
    file: <input type="file" name="myfile[]"><hr> 
    <?php endfor; ?> 
    <input type="submit"> 
</form> 
Смежные вопросы