2011-01-03 3 views
0

Ich versuche, ein Multiple-File-Upload-Skript zu codeigniter zu implementieren. Das Skript finden Sie hier http://valums.com/ajax-upload/. Ich finde es ziemlich gut, also entscheide ich mich für aktuelle Apps.Wie man ein Upload-Skript mit Code-Signierer implementieren

Das Problem ist, ich konnte nicht auf die hochgeladenen Dateien mit Codeigniter zugreifen. Wenn Sie ein Codeigniter Entwickler sind, bitte beraten Sie, wie ich die vom Skript gesendete Datei erfassen könnte?

+0

Und rurunforest, sollten Sie weitere Informationen hinzufügen. –

+0

@Ipalaus Danke, ich wusste nicht, dass ich das tun sollte, tickte einfach die Vs –

Antwort

1

CodeIgniter hat einige Möglichkeiten, mit Uploads umzugehen, aber da Ihr ajax-upload Skript bereits einen Handler hat, sollten Sie diesen verwenden.

Gewusst wie:

Erstellen Sie eine neue Datei in Ihrer Anwendung/Bibliotheken-Ordner namens Qqfileuploader.php und fügen Sie diese in ihm:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
    class Qqfileuploader { 
     private $allowedExtensions = array(); 
     private $sizeLimit = 10485760; 
     private $file; 

     function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){   
      $allowedExtensions = array_map("strtolower", $allowedExtensions); 

      $this->allowedExtensions = $allowedExtensions;   
      $this->sizeLimit = $sizeLimit; 

      $this->checkServerSettings();  

      if (isset($_GET['qqfile'])) { 
       $this->file = new qqUploadedFileXhr(); 
      } elseif (isset($_FILES['qqfile'])) { 
       $this->file = new qqUploadedFileForm(); 
      } else { 
       $this->file = false; 
      } 
     } 

     private function checkServerSettings(){   
      $postSize = $this->toBytes(ini_get('post_max_size')); 
      $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));   

      if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){ 
       $size = max(1, $this->sizeLimit/1024/1024) . 'M';    
       die("{'error':'increase post_max_size and upload_max_filesize to $size'}");  
      }   
     } 

     private function toBytes($str){ 
      $val = trim($str); 
      $last = strtolower($str[strlen($str)-1]); 
      switch($last) { 
       case 'g': $val *= 1024; 
       case 'm': $val *= 1024; 
       case 'k': $val *= 1024;   
      } 
      return $val; 
     } 

     /** 
     * Returns array('success'=>true) or array('error'=>'error message') 
     */ 
     function handleUpload($uploadDirectory, $replaceOldFile = FALSE){ 
      if (!is_writable($uploadDirectory)){ 
       return array('error' => "Server error. Upload directory isn't writable."); 
      } 

      if (!$this->file){ 
       return array('error' => 'No files were uploaded.'); 
      } 

      $size = $this->file->getSize(); 

      if ($size == 0) { 
       return array('error' => 'File is empty'); 
      } 

      if ($size > $this->sizeLimit) { 
       return array('error' => 'File is too large'); 
      } 

      $pathinfo = pathinfo($this->file->getName()); 
      $filename = $pathinfo['filename']; 
      //$filename = md5(uniqid()); 
      $ext = $pathinfo['extension']; 

      if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){ 
       $these = implode(', ', $this->allowedExtensions); 
       return array('error' => 'File has an invalid extension, it should be one of '. $these . '.'); 
      } 

      if(!$replaceOldFile){ 
       /// don't overwrite previous files that were uploaded 
       while (file_exists($uploadDirectory . $filename . '.' . $ext)) { 
        $filename .= rand(10, 99); 
       } 
      } 

      if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){ 
       return array('success'=>true); 
      } else { 
       return array('error'=> 'Could not save uploaded file.' . 
        'The upload was cancelled, or server error encountered'); 
      } 

     }  
    } 

nun in der Steuerung, die Sie hochladen zu , dies tun:

// list of valid extensions, ex. array("jpeg", "xml", "bmp") 
$allowedExtensions = array(); 
// max file size in bytes 
$sizeLimit = 10 * 1024 * 1024; 

$this->load->library("Qqfileuploader",array($allowedExtensions, $sizeLimit)); 
$this->Qqfileuploader->handleUpload('uploads/'); 
// to pass data through iframe you will need to encode all html tags 
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES); 

Der sollte Arbeit.

0

Ich finde eine sehr einfache Lösung.

Zuerst gehen Sie zum Skript, bearbeiten Sie die Querystring-Variable, so dass ich segmentierte URI erzeugen werde.

Dann In der Steuerung verwende ich file_get_contents ("php: // input"), um den Inhalt zu greifen. Um den Namen der Datei zu erhalten, einfach $ this-> input-> uri (3);

1

Eigentlich scheinen CodeIgniter-Bibliotheken nur 1 Parameter an den Konstruktor zu übergeben. Also der Code von Adrian Gonzales funktionierte nicht ganz für mich - ich musste den Konstruktor ändern, um die Parameter als ein einzelnes Array zu akzeptieren (wie hier notiert: http://codeigniter.com/user_guide/general/creating_libraries.html). Und dann hat es geklappt.

Hier ist meine Bibliothek Code:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 


class qqFileUploader { 
    private $allowedExtensions = array(); 
    private $sizeLimit = 10485760; 
    private $file; 

    function __construct($params = array()){ 
     $allowedExtensions = $params['allowedExtensions']; 
     $sizeLimit = $params['sizeLimit']; 

     $allowedExtensions = array_map("strtolower", $allowedExtensions); 

     $this->allowedExtensions = $allowedExtensions;   
     $this->sizeLimit = $sizeLimit; 

     $this->checkServerSettings();  

     if (isset($_GET['qqfile'])) { 
      $this->file = new qqUploadedFileXhr(); 
     } elseif (isset($_FILES['qqfile'])) { 
      $this->file = new qqUploadedFileForm(); 
     } else { 
      $this->file = false; 
     } 
    } 

    private function checkServerSettings(){   
     $postSize = $this->toBytes(ini_get('post_max_size')); 
     $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));   

     if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){ 
      $size = max(1, $this->sizeLimit/1024/1024) . 'M';    

      die("{'error':'increase post_max_size and upload_max_filesize to $size'}");  
     }   
    } 

    private function toBytes($str){ 
     $val = trim($str); 
     $last = strtolower($str[strlen($str)-1]); 
     switch($last) { 
      case 'g': $val *= 1024; 
      case 'm': $val *= 1024; 
      case 'k': $val *= 1024;   
     } 
     return $val; 
    } 


    function handleUpload($uploadDirectory, $replaceOldFile = FALSE){ 
     if (!is_writable($uploadDirectory)){ 
      return array('error' => "Server error. Upload directory isn't writable."); 
     } 

     if (!$this->file){ 
      return array('error' => 'No files were uploaded.'); 
     } 

     $size = $this->file->getSize(); 

     if ($size == 0) { 
      return array('error' => 'File is empty'); 
     } 

     if ($size > $this->sizeLimit) { 
      return array('error' => 'File is too large'); 
     } 

     $pathinfo = pathinfo($this->file->getName()); 
     //$filename = $pathinfo['filename']; 
     $filename = md5(uniqid()); 
     $ext = $pathinfo['extension']; 

     if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){ 
      $these = implode(', ', $this->allowedExtensions); 
      return array('error' => 'File has an invalid extension, it should be one of '. $these . '.'); 
     } 

     if(!$replaceOldFile){ 
      /// don't overwrite previous files that were uploaded 
      while (file_exists($uploadDirectory . $filename . '.' . $ext)) { 
       $filename .= rand(10, 99); 
      } 
     } 

     if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){ 
      return array('success'=>true, 'fileName' => $filename . '.' . $ext); 
     } else { 
      return array('error'=> 'Could not save uploaded file.' . 
       'The upload was cancelled, or server error encountered'); 
     } 

    }  
} 


class qqUploadedFileXhr { 

    function save($path) {  
     $input = fopen("php://input", "r"); 
     $temp = tmpfile(); 
     $realSize = stream_copy_to_stream($input, $temp); 
     fclose($input); 

     if ($realSize != $this->getSize()){    
      return false; 
     } 

     $target = fopen($path, "w");   
     fseek($temp, 0, SEEK_SET); 
     stream_copy_to_stream($temp, $target); 
     fclose($target); 

     return true; 
    } 
    function getName() { 
     return $_GET['qqfile']; 
    } 
    function getSize() { 
     if (isset($_SERVER["CONTENT_LENGTH"])){ 
      return (int)$_SERVER["CONTENT_LENGTH"];    
     } else { 
      throw new Exception('Getting content length is not supported.'); 
     }  
    } 
} 


class qqUploadedFileForm { 
    /** 
    * Save the file to the specified path 
    * @return boolean TRUE on success 
    */ 
    function save($path) { 
     if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){ 
      return false; 
     } 
     return true; 
    } 
    function getName() { 
     return $_FILES['qqfile']['name']; 
    } 
    function getSize() { 
     return $_FILES['qqfile']['size']; 
    } 
} 
+0

Wie hast du qqUploadedFileXhr() und qqUploadedFileForm() Klassen in der gleichen Bibliothek hinzugefügt? – aslamdoctor

+0

@aslamdoctor Ich habe den Beitrag mit der Bibliotheksdatei aktualisiert. –

+0

Vielen Dank. Ich habe es getan, indem ich jede Klasse in der separaten Bibliotheksdatei Lolzz getrennt habe – aslamdoctor

Verwandte Themen