2011-01-03 19 views
0

私はcodeigniterに複数のファイルアップロードスクリプトを実装しようとしています。スクリプトはここに見つけることができます http://valums.com/ajax-upload/。私はそれが非常に良いと思うので、私は現在のアプリケーションに入れて決定します。codeigniterでアップロードスクリプトを実装する方法

問題は、私はcodeigniterでアップロードしたファイルにアクセスできませんでした。あなたがcodeigniterの開発者であれば、スクリプトを使ってファイルを送信する方法を教えてください。 https://github.com/valums/file-uploader/blob/master/server/php.php

あなたはAjaxのスクリプトのXMLHttpRequestのを処理するために、あなたのコントローラ上でそのような何かを再現しました:

+0

そしてrurunforest、あなたはより多くの情報を追加する必要があります

は、ここに私のライブラリのコードです。 –

+0

@Ipalausありがとう、私はそれを行う必要があるかわからなかった、ちょうどVをチェックした –

答えて

1

CodeIgniterにはアップロードを処理する方法がいくつかありますが、あなたのajax-uploadスクリプトにはすでにハンドラがあるので、それを使用する必要があります。

にする方法:

はQqfileuploader.phpという名前のアプリケーション/ライブラリフォルダ内の新しいファイルを作成し、これを貼り付けます。

<?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'); 
      } 

     }  
    } 

を今、あなたがアップロードしているコントローラに

// 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); 

作業する必要があること:これを行います。

0

/server/php.phpファイルに多くを取ります。

0

私は非常に簡単な解決策を見つけました。

まず、スクリプトに行き、querystring変数を編集して、私が分割されたURIを生成するようにします。

次に、コントローラでは、コンテンツを取得するためにfile_get_contents( "php:// input")を使用します。 ファイルの名前を取得するには$ this-> input-> uri(3)を実行します。

1

実際、CodeIgniterライブラリは1つのパラメータだけをコンストラクタに渡すことができます。だから、Adrian Gonzalesのコードは私のためにはうまくいかなかった - 私は、コンストラクタを変更してパラメータを単一の配列として受け取らなければならなかった(ここで述べたように:http://codeigniter.com/user_guide/general/creating_libraries.html)。そして、それは働いた。

<?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

qqUploadedFileXhr()とqqUploadedFileForm()クラスを同じライブラリにどのように追加しましたか? – aslamdoctor

+0

@aslamdoctor投稿をライブラリファイルで更新しました。 –

+0

ありがとうございました。私はそれを、別々のライブラリファイルLolzz – aslamdoctor

関連する問題