2011-11-10 4 views
0

私が助けてくれるかどうか皆さんにおねがいします。私はzendフレームワークで作業しているので、ユーザが (実際のアップロードの前に)ブラウザにファイルをドロップすると、ファイル名と拡張子が既に存在するかどうかがチェックされます。 ifleの存在に応じて、ごみ箱アイコンの右側に アイコンが表示されます(新規アップロードの場合は緑色のチェックマークが付きます。ファイルがある場合は同じ名前の他のファイルは赤字になりません)。ファイル名と拡張子に応じて、フォルダにファイルがアップロードされます。 Jquery/blueimp - plugin

しかし私にとってもっと重要な問題に取り組むためには、ファイル名とファイル拡張子に応じてアップロードするときにコードを設定するのが適切です。ファイルは特定のフォルダにアップロードされています。だからX.pngは、「PNG」フォルダに入った - サブフォルダ「X」、およびY.pdfは「PDF」フォルダに入った - サブフォルダ「Y」

ここに私のコードはない遠く...

です

これはapplication.jsとjquery.fileupload-ui.jsです。これは、アップロードされ

<?php 
class Design_InterfaceController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
     $this->_helper->layout()->setLayout('media'); 
     set_include_path(implode(PATH_SEPARATOR, array(
     realpath(APPLICATION_PATH . '/modules/design/models'), 
     realpath(APPLICATION_PATH . '/models'), 
     realpath(APPLICATION_PATH . '/../library'), 
     get_include_path(), 
     ))); 
    } 

    public function indexAction() 
    { 

    } 

    public function mediaAction() 
    { 
    $this->_helper->layout()->setLayout('media'); 

    } 

    public function checkFile(){ 



     //isn't doing anything at all, just my start of thinking in a way of 
      //sloving this 


    } 

    function uploadjqAction() 
    { 
    $this->_helper->layout()->setLayout('media'); 
      Zend_Loader::loadClass('Upload', 
            array(
             APPLICATION_PATH.'/modules/design/models/vendors' 
            ) 
      ); 


     $upload_handler = new Upload(); 

     header('Pragma: no-cache'); 
     header('Cache-Control: private, no-cache'); 
     header('Content-Disposition: inline; filename="files.json"'); 
     header('X-Content-Type-Options: nosniff'); 

     switch ($_SERVER['REQUEST_METHOD']) { 
      case 'HEAD': 
      case 'GET': 
       $upload_handler->get(); 
       break; 
      case 'POST': 
       $upload_handler->post(); 
       break; 
      case 'DELETE': 
       $upload_handler->delete(); 
       break; 
      case 'OPTIONS': 
       break; 
      default: 
       header('HTTP/1.0 405 Method Not Allowed'); 
     } 
     exit; 

    } 






} 

:(ジャバスクリプト) http://pastebin.com/eqpK1KmX

これはindex.phtmlをとindex.phtmlをレイアウト(図) http://pastebin.com/mh5jnLju

InterfaceController.php(コントローラ)であります.php(モデルとして動作します):

<?php 
/* 
* Copyright 2010, Sebastian Tschan 
* https://blueimp.net 
* 
* Licensed under the MIT license: 
* http://creativecommons.org/licenses/MIT/ 
*/ 

error_reporting(E_ALL | E_STRICT); 

class Upload 
{ 
    /* public function uploadAction() { 
     ini_set("max_execution_time", 10000); 
     $this->_helper->layout->disableLayout(); 
     $this->_helper->viewRenderer->setNoRender(true); 
      if (!empty($_FILES)) { 
      $tempFile = $_FILES['Filedata']['tmp_name']; 
      $targetPath = STORAGE_PATH.'/books/' . $_POST['bookid'] . '/' . $_POST['folder']; 
      $targetFile = str_replace('//','/',$targetPath) . "/".$_POST['name'].".".$_POST['ext']; 
      if (!file_exists(str_replace('//','/',$targetPath))) mkdir(str_replace('//','/',$targetPath), 0755, true); 
      $result = move_uploaded_file($tempFile,$targetFile); 
      echo ($result)?"Success":"Fail"; 
     } 
    } 
*/ 
    private $options; 

    function __construct($options=null) { 
     $this->options = array(
      'script_url' => $_SERVER['PHP_SELF'], 
      'upload_dir' => dirname(__FILE__).'/vendors/files/', 
      'upload_url' => dirname($_SERVER['PHP_SELF']).'/vendors/files/', 
      'param_name' => 'files', 
      // The php.ini settings upload_max_filesize and post_max_size 
      // take precedence over the following max_file_size setting: 
      'max_file_size' => 10000000, 
      'min_file_size' => 1, 
      'accept_file_types' =>'/(\.|\/)(gif|jpeg|jpg|png|pdf)$/i', 
      'max_number_of_files' => null, 
      'discard_aborted_uploads' => true, 
      'image_versions' => array(
       'thumbnail' => array(
        'upload_dir' => dirname(__FILE__).'/vendors/thumbnails/', 
        'upload_url' => dirname($_SERVER['PHP_SELF']).'/vendors/thumbnails/', 
        'max_width' => 80, 
        'max_height' => 150 
       ) 
      ) 
     ); 
     if ($options) { 
      $this->options = array_replace_recursive($this->options, $options); 
     } 
    } 

    private function get_file_object($file_name) { 
     $file_path = $this->options['upload_dir'].$file_name; 
     if (is_file($file_path) && $file_name[0] !== '.') { 
      $file = new stdClass(); 
      $file->name = $file_name; 
      $file->size = filesize($file_path); 
      $file->url = $this->options['upload_url'].rawurlencode($file->name); 
      foreach($this->options['image_versions'] as $version => $options) { 
       if (is_file($options['upload_dir'].$file_name)) { 
        $file->{$version.'_url'} = $options['upload_url'] 
         .rawurlencode($file->name); 
       } 
      } 
      $file->delete_url = $this->options['script_url'] 
       .'?file='.rawurlencode($file->name); 
      $file->delete_type = 'DELETE'; 
      return $file; 
     } 
     return null; 
    } 

    private function get_file_objects() { 
     return array_values(array_filter(array_map(
      array($this, 'get_file_object'), 
      scandir($this->options['upload_dir']) 
     ))); 
    } 

    private function create_scaled_image($file_name, $options) { 
     $file_path = $this->options['upload_dir'].$file_name; 
     $new_file_path = $options['upload_dir'].$file_name; 
     list($img_width, $img_height) = @getimagesize($file_path); 
     if (!$img_width || !$img_height) { 
      return false; 
     } 
     $scale = min(
      $options['max_width']/$img_width, 
      $options['max_height']/$img_height 
     ); 
     if ($scale > 1) { 
      $scale = 1; 
     } 
     $new_width = $img_width * $scale; 
     $new_height = $img_height * $scale; 
     $new_img = @imagecreatetruecolor($new_width, $new_height); 
     switch (strtolower(substr(strrchr($file_name, '.'), 1))) { 
      case 'jpg': 
      case 'jpeg': 
       $src_img = @imagecreatefromjpeg($file_path); 
       $write_image = 'imagejpeg'; 
       break; 
      case 'gif': 
       @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0)); 
       $src_img = @imagecreatefromgif($file_path); 
       $write_image = 'imagegif'; 
       break; 
      case 'png': 
       @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0)); 
       @imagealphablending($new_img, false); 
       @imagesavealpha($new_img, true); 
       $src_img = @imagecreatefrompng($file_path); 
       $write_image = 'imagepng'; 
       break; 
      default: 
       $src_img = $image_method = null; 
     } 
     $success = $src_img && @imagecopyresampled(
      $new_img, 
      $src_img, 
      0, 0, 0, 0, 
      $new_width, 
      $new_height, 
      $img_width, 
      $img_height 
     ) && $write_image($new_img, $new_file_path); 
     // Free up memory (imagedestroy does not delete files): 
     @imagedestroy($src_img); 
     @imagedestroy($new_img); 
     return $success; 
    } 

    private function has_error($uploaded_file, $file, $error) { 
     if ($error) { 
      return $error; 
     } 
     if (!preg_match($this->options['accept_file_types'], $file->name)) { 
      return 'acceptFileTypes'; 
     } 
     if ($uploaded_file && is_uploaded_file($uploaded_file)) { 
      $file_size = filesize($uploaded_file); 
     } else { 
      $file_size = $_SERVER['CONTENT_LENGTH']; 
     } 
     if ($this->options['max_file_size'] && (
       $file_size > $this->options['max_file_size'] || 
       $file->size > $this->options['max_file_size']) 
      ) { 
      return 'maxFileSize'; 
     } 
     if ($this->options['min_file_size'] && 
      $file_size < $this->options['min_file_size']) { 
      return 'minFileSize'; 
     } 
     if (is_int($this->options['max_number_of_files']) && (
       count($this->get_file_objects()) >= $this->options['max_number_of_files']) 
      ) { 
      return 'maxNumberOfFiles'; 
     } 
     return $error; 
    } 

    private function handle_file_upload($uploaded_file, $name, $size, $type, $error) { 
     $file = new stdClass(); 
     // Remove path information and dots around the filename, to prevent uploading 
     // into different directories or replacing hidden system files. 
     // Also remove control characters and spaces (\x00..\x20) around the filename: 
     $file->name = trim(basename(stripslashes($name)), ".\x00..\x20"); 
     $file->size = intval($size); 
     $file->type = $type; 
     $error = $this->has_error($uploaded_file, $file, $error); 
     if (!$error && $file->name) { 
      $file_path = $this->options['upload_dir'].$file->name; 
      $append_file = !$this->options['discard_aborted_uploads'] && 
       is_file($file_path) && $file->size > filesize($file_path); 
      clearstatcache(); 
      if ($uploaded_file && is_uploaded_file($uploaded_file)) { 
       // multipart/formdata uploads (POST method uploads) 
       if ($append_file) { 
        file_put_contents(
         $file_path, 
         fopen($uploaded_file, 'r'), 
         FILE_APPEND 
        ); 
       } else { 
        move_uploaded_file($uploaded_file, $file_path); 
       } 
      } else { 
       // Non-multipart uploads (PUT method support) 
       file_put_contents(
        $file_path, 
        fopen('php://input', 'r'), 
        $append_file ? FILE_APPEND : 0 
       ); 
      } 
      $file_size = filesize($file_path); 
      if ($file_size === $file->size) { 
       $file->url = $this->options['upload_url'].rawurlencode($file->name); 
       foreach($this->options['image_versions'] as $version => $options) { 
        if ($this->create_scaled_image($file->name, $options)) { 
         $file->{$version.'_url'} = $options['upload_url'] 
          .rawurlencode($file->name); 
        } 
       } 
      } else if ($this->options['discard_aborted_uploads']) { 
       unlink($file_path); 
       $file->error = 'abort'; 
      } 
      $file->size = $file_size; 
      $file->delete_url = $this->options['script_url'] 
       .'?file='.rawurlencode($file->name); 
      $file->delete_type = 'DELETE'; 
     } else { 
      $file->error = $error; 
     } 
     return $file; 
    } 

    public function get() { 
     $file_name = isset($_REQUEST['file']) ? 
      basename(stripslashes($_REQUEST['file'])) : null; 
     if ($file_name) { 
      $info = $this->get_file_object($file_name); 
     } else { 
      $info = $this->get_file_objects(); 
     } 
     header('Content-type: application/json'); 
     echo json_encode($info); 
    } 

    public function post() { 
     $upload = isset($_FILES[$this->options['param_name']]) ? 
      $_FILES[$this->options['param_name']] : array(
       'tmp_name' => null, 
       'name' => null, 
       'size' => null, 
       'type' => null, 
       'error' => null 
      ); 
     $info = array(); 
     if (is_array($upload['tmp_name'])) { 
      foreach ($upload['tmp_name'] as $index => $value) { 
       $info[] = $this->handle_file_upload(
        $upload['tmp_name'][$index], 
        isset($_SERVER['HTTP_X_FILE_NAME']) ? 
         $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'][$index], 
        isset($_SERVER['HTTP_X_FILE_SIZE']) ? 
         $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'][$index], 
        isset($_SERVER['HTTP_X_FILE_TYPE']) ? 
         $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'][$index], 
        $upload['error'][$index] 
       ); 
      } 
     } else { 
      $info[] = $this->handle_file_upload(
       $upload['tmp_name'], 
       isset($_SERVER['HTTP_X_FILE_NAME']) ? 
        $_SERVER['HTTP_X_FILE_NAME'] : $upload['name'], 
       isset($_SERVER['HTTP_X_FILE_SIZE']) ? 
        $_SERVER['HTTP_X_FILE_SIZE'] : $upload['size'], 
       isset($_SERVER['HTTP_X_FILE_TYPE']) ? 
        $_SERVER['HTTP_X_FILE_TYPE'] : $upload['type'], 
       $upload['error'] 
      ); 
     } 
     header('Vary: Accept'); 
     if (isset($_SERVER['HTTP_ACCEPT']) && 
      (strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) { 
      header('Content-type: application/json'); 
     } else { 
      header('Content-type: text/plain'); 
     } 
     echo json_encode($info); 
    } 

    public function delete() { 
     $file_name = isset($_REQUEST['file']) ? 
      basename(stripslashes($_REQUEST['file'])) : null; 
     $file_path = $this->options['upload_dir'].$file_name; 
     $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); 
     if ($success) { 
      foreach($this->options['image_versions'] as $version => $options) { 
       $file = $options['upload_dir'].$file_name; 
       if (is_file($file)) { 
        unlink($file); 
       } 
      } 
     } 
     header('Content-type: application/json'); 
     echo json_encode($success); 
    } 
} 

?> 

誰かが助けてくれると嬉しいですuldは非常に非常に感謝する、私はそれが多くの仕事を知っている、私は騒ぎであり、私は得ることができるすべてのヘルプが必要です。

ありがとうございます!私に怒らないようにしてください。

答えて

2

いくつかの一般的なコメント。

通常、include_pathの設定は、コントローラではなく、ブートストラップで行われます。

私は、サーバー側で何が起きているのか、クライアント側では何が起こっているのかはっきりと分かります。

まず、標準的なフォーム提出と考えてください。フォームにはfile要素があり、ユーザーはファイルシステムを参照してファイルを選択します。彼は提出をクリックする。それは成功するか失敗するかのいずれかです。すべてのドラッグアンドドロップとアイコンの変更は、コア機能を適所に置いた後に追加される純粋なクライアント側のキャンディです。

したがって、標準のファイル要素を持つフォームを作成します。その要素には、特定のディレクトリ/ファイル名のチェックを実行するカスタムバリデーターを添付します。有効な投稿があった場合、適切な場所にファイルを移動するモデル/サービスを採用し、DBレコードなどを書き込みます。

次に、私はAJAXの処理を重ねます。クライアント側スクリプトはフォームのサブミット・イベントをインターセプトし、サーバー側でAjaxContextアクション・ヘルパーを使用してJSON応答を戻します。これらの応答は、ok/failアイコンをレンダリングするクライアント側のコードによって処理されます。

最後に、クライアント側のドラッグ/ドロップ機能をレイヤーして、送信イベントをトリガーします。

メリット:

  1. これは明らかに、サーバ側とクライアント側の問題を描きます。
  2. これは、全体的なジョブを、明確に定義されたタスクのターゲットコレクションに分割します。
  3. プログレッシブな強化/優雅な劣化。
  4. コントローラのフォーム送信を処理するZFの方法(バリデータを含むフォームを作成する、isValid()をチェックする、送信が成功したことを処理する)と一貫しているようです。

私はこれが広範な筆跡であることを認識していますが、私はそれがいくつかの考えを明確にするのに役立つことを願っています。

関連する問題