【问题标题】:File uploaded in a folder depending on the file name and extension. Jquery/blueimp - plugin根据文件名和扩展名上传到文件夹中的文件。 Jquery/blueimp - 插件
【发布时间】:2011-11-10 08:02:34
【问题描述】:

如果你能帮助我,我很想问你们所有人。我在 zend 框架中工作,我需要调整我的代码,所以当用户 在浏览器中删除文件(在实际上传之前),文件名和扩展名在某种意义上检查它是否已经存在。根据 ifle 的存在,一个 垃圾桶图标旁边会出现图标(如果是新上传的,则为绿色勾号,没有其他同名文件。如果有文件,则为红色叉号)。

但要解决一个对我来说更重要的问题,那就是我设置代码的方式,以便在根据文件名和文件扩展名进行上传时,将文件上传到特定文件夹中。所以例如一个 X.png,进入“png”文件夹 - 子文件夹“X”,Y.pdf 进入“pdf”文件夹 - 子文件夹“Y”

这是我的代码……

这是 application.js 和 jquery.fileupload-ui.js。 (javascript) http://pastebin.com/eqpK1KmX

这是 index.phtml 和 index.phtml 的布局(视图) http://pastebin.com/mh5jnLju

InterfaceController.php(控制器):

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

    }






}

这是upload.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);
    }
}

?>

如果有人愿意提供帮助,我将非常感激,我知道这有很多工作,我是菜鸟,我需要我能得到的所有帮助。

提前感谢您!请不要生我的气。

【问题讨论】:

    标签: php jquery jquery-ui zend-framework upload


    【解决方案1】:

    一些通用的cmets。

    通常,include_path 设置在 Bootstrap 中完成,而不是在控制器中。

    我会清楚地区分服务器端发生的事情和客户端发生的事情。

    首先,首先将其视为标准表单提交。表单有一个文件元素,用户浏览他的文件系统来选择他的文件。他点击提交。它要么成功,要么失败。所有拖放和更改图标都是纯客户端糖果,在您拥有核心功能后添加。

    所以,我将创建一个具有标准文件元素的表单。对于该元素,我将附加一个自定义验证器来执行您的特定目录/文件名检查。在有效提交的情况下,您使用模型/服务将文件移动到正确的位置,写入您的数据库记录等。

    然后我会在一些 AJAX 处理上分层。客户端脚本截获表单的提交事件,您在服务器端使用 AjaxContext 操作助手来发回 JSON 响应。这些响应由呈现您的 ok/fail 图标的客户端代码处理。

    最后,我将在客户端拖放功能上叠加以触发提交事件。

    好处:

    1. 它清楚地描述了服务器端和客户端问题。
    2. 它将整个工作分解为目标明确的任务集合。
    3. 渐进式增强/优雅降级。
    4. 似乎更符合 ZF 在控制器中处理表单提交的方式(使用验证器创建表单,检查 isValid(),处理成功提交)。

    我承认这只是粗略的笔触,但我希望它有助于澄清一些想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2016-05-23
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多