根据文件名和扩展名将文件上载到文件夹中. jQuery/Blueimp-插件 [英] File uploaded in a folder depending on the file name and extension. Jquery/blueimp - plugin

查看:118
本文介绍了根据文件名和扩展名将文件上载到文件夹中. jQuery/Blueimp-插件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请问大家是否可以帮助我.我正在zend框架中工作,因此需要调整代码,以便当用户 将文件放在浏览器中(实际上传之前),从某种意义上检查文件名和扩展名是否已存在.根据ifle的存在, 图标将显示在废纸icon图标的右侧(如果是新上传的文件,则为绿色勾号,没有其他同名文件;如果有文件,则为红色叉号).

I would kindly ask all of you if you could help me. I'm working in zend framework and I need to adjust my code so, when a user drops the file in the browser(before the actual upload), the file name and extension is checked in a sense if it already exists. Depending on the existence of the ifle, an icon right by the trash icon will appear (green tick if fresh upload, no other file with the same name. Red cross if there is a file).

但是要解决对我来说更重要的事情,这就是我以某种方式设置代码,以便在根据文件名和文件扩展名进行上载时,文件将在特定的文件夹中上载.所以X.png,进入"png"文件夹-子文件夹"X",而Y.pdf进入"pdf"文件夹-子文件夹"Y"

But to address a matter that is more important to me, and that is for me to set up the code in a manner so when uploading depending on the file name and file extension, the file is being uploaded in a specific folder. So e.g. an X.png, gets into a "png" folder - subfolder "X", and Y.pdf gets into a "pdf" folder - subfolder "Y"

这是我的代码可以做的...

Here is my code do far...

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

This is the application.js and the jquery.fileupload-ui.js. (javascript) http://pastebin.com/eqpK1KmX

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

This is the index.phtml and the layout of the index.phtml (view) http://pastebin.com/mh5jnLju

InterfaceController.php(控制器):

InterfaceController.php (controller):

<?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(充当模型):

This is the upload.php (acting as a model):

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

?>

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

If anyone is willing to help, I would be very very grateful, I know it a lot of work, I'm a noob and I need all the help I can get.

先谢谢您!而且请不要生我的气.

Thank you in advance! and please don't get mad at me.

推荐答案

一些一般性注释.

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

Typically, the include_path setting is done at Bootstrap, not in the controller.

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

I would clearly separate in my mind what happens on the server side and what happens on the client side.

首先,首先将其视为标准表单提交.该表单具有一个file元素,用户浏览他的文件系统以选择他的文件.他单击提交.它成功或失败.所有的拖放图标和更改图标都是纯客户端糖果,在您具备核心功能之后即可添加.

First, think of it first as a standard form submission. The form has a file element, the user browses his file system to select his file. He clicks submit. It either succeeds or fails. All the dragging and dropping and changing icons is pure client-side candy to be added after you have the core functionality in place.

因此,我将创建一个具有标准文件元素的表单.在该元素上,我将附加一个自定义验证器,该验证器将执行您特定的目录/文件名检查.在提交有效的情况下,您采用了一种模型/服务,该模型/服务将文件移至正确的位置,写入数据库记录,等等.

So, I would create a form that has a standard file element. To that element, I would attach a custom validator that performs your specific directory/filename checks. In the event of a valid submission, you employ a model/service that moves the file to the right place, writes your db records, etc.

然后,我将对一些AJAX处理进行分层.客户端脚本截获表单的Submit事件,并且您在服务器端使用AjaxContext操作帮助程序发送回JSON响应.这些响应由呈现您的确定/失败"图标的客户端代码处理.

Then I would layer on some AJAX handling. Client-side script intercepts the form's submit event and you use an AjaxContext action helper on the server side to send back JSON responses. These responses are handled by client-side code that renders your ok/fail icons.

最后,我将在客户端的拖放功能上分层以触发Submit事件.

Finally, I would layer on the client-side drag/drop functionality to trigger the submit event.

好处:

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

我认识到这只是广泛的笔触,但是我希望这有助于澄清一些想法.

I recognize that this is only broad brush-strokes, but I hope it helps to clarify some thinking.

这篇关于根据文件名和扩展名将文件上载到文件夹中. jQuery/Blueimp-插件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆