如何将 Blue Imp 文件上传集成到 CakePHP?

2021-12-21 00:00:00 php cakephp

Wa 正在使用 CakePHP,需要集成 Blue Imp 文件上传库.有没有人成功集成这些?如果是这样,您是否设置了上传以将文件存储在数据库或文件系统上?您能否分享此类集成的示例?

非常感谢您的帮助和指导.

解决方案

是的,我在 php 中集成了 BlueImp 文件上传功能.请找到以下组件和要使用的元素.

options = array('script_url' =>$this->getFullUrl().'/','上传目录' =>目录名($_SERVER['SCRIPT_FILENAME']).'/attachments/files/','upload_url' =>$this->getFullUrl().'/files/','param_name' =>'文件',//将以下选项设置为POST",如果您的服务器不支持//删除请求.这是发送给客户端的参数:'delete_type' =>'邮政',//php.ini 设置upload_max_filesize 和post_max_size//优先于以下 max_file_size 设置:'max_file_size' =>空值,'min_file_size' =>1、'accept_file_types' =>'/.+$/i','max_number_of_files' =>空值,//将以下选项设置为 false 以启用可恢复上传:'discard_aborted_uploads' =>真的,//设置为 true 以根据 EXIF 元数据旋转图像(如果可用):'orient_image' =>错误的,'image_versions' =>大批(//取消注释以下版本以限制大小//上传的图片.您还可以添加其他版本//自己的上传目录:/*'大' =>大批('上传目录' =>目录名($_SERVER['SCRIPT_FILENAME']).'/files/','upload_url' =>$this->getFullUrl().'/files/','max_width' =>1920年,'max_height' =>1200,'jpeg_quality' =>95),*/'缩略图' =>大批('上传目录' =>dirname($_SERVER['SCRIPT_FILENAME']).'/attachments/thumbnails/','upload_url' =>$this->getFullUrl().'/attachments/thumbnails/','max_width' =>80,'max_height' =>80)));如果(is_array($options)){$this->options = array_replace_recursive($this->options, $options);}}受保护的函数 getFullUrl() {返回(isset($_SERVER['HTTPS']) ? 'https://' : 'http://').(isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : '').(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'].(isset($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT'] === 443 ||$_SERVER['SERVER_PORT'] === 80 ?'' : ':'.$_SERVER['SERVER_PORT']))).substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));}受保护的函数 set_file_delete_url($file) {$file->delete_url = $this->options['script_url'].'?file='.rawurlencode($file->name);$file->delete_type = $this->options['delete_type'];如果 ($file->delete_type !== 'DELETE') {$file->delete_url .= '&_method=DELETE';}}受保护的函数 get_file_object($file_name) {$file_path = $this->options['upload_dir'].$file_name;如果 (is_file($file_path) && $file_name[0] !== '.') {$file = new stdClass();$file->name = $file_name;$file->size = 文件大小($file_path);$file->url = $this->options['upload_url'].rawurlencode($file->name);foreach($this->options['image_versions'] as $version => $options) {如果 (is_file($options['upload_dir'].$file_name)) {$file->{$version.'_url'} = $options['upload_url'].rawurlencode($file->name);}}$this->set_file_delete_url($file);返回 $ 文件;}返回空;}受保护的函数 get_file_objects() {返回数组值(数组过滤器(数组映射(数组($this, 'get_file_object'),scandir($this->options['upload_dir']))));}受保护的函数 create_scaled_image($file_name, $options) {$file_path = $this->options['upload_dir'].$file_name;$new_file_path = $options['upload_dir'].$file_name;列表($img_width, $img_height) = @getimagesize($file_path);如果 (!$img_width || !$img_height) {返回假;}$规模=分钟($options['max_width']/$img_width,$options['max_height']/$img_height);如果 ($scale >= 1) {如果($file_path !== $new_file_path){返回副本($file_path,$new_file_path);}返回真;}$new_width = $img_width * $scale;$new_height = $img_height * $scale;$new_img = @imagecreatetruecolor($new_width, $new_height);开关 (strtolower(substr(strrchr($file_name, '.'), 1))) {案例'jpg':案例'jpeg':$src_img = @imagecreatefromjpeg($file_path);$write_image = 'imagejpeg';$image_quality = isset($options['jpeg_quality']) ?$options['jpeg_quality'] : 75;休息;案例'gif':@imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));$src_img = @imagecreatefromgif ($file_path);$write_image = 'imagegif';$image_quality = null;休息;案例'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';$image_quality = isset($options['png_quality']) ?$options['png_quality'] : 9;休息;默认:$src_img = null;}$success = $src_img &&@imagecopyresampled($new_img,$src_img,0, 0, 0, 0,$new_width,$新高度,$img_width,$img_height) &&$write_image($new_img, $new_file_path, $image_quality);//释放内存(imagedestroy 不删除文件):@imagedestroy($src_img);@imagedestroy($new_img);返回 $success;}受保护的函数 has_error($uploaded_file, $file, $error) {如果($错误){返回$错误;}if (!preg_match($this->options['accept_file_types'], $file->name)) {返回接受文件类型";}如果 ($uploaded_file && is_uploaded_file($uploaded_file)) {$file_size = 文件大小($uploaded_file);} 别的 {$file_size = $_SERVER['CONTENT_LENGTH'];}如果 ($this->options['max_file_size'] && ($file_size >$this->options['max_file_size'] ||$文件->大小>$this->options['max_file_size'])){返回最大文件大小";}if ($this->options['min_file_size'] &&$file_size <$this->options['min_file_size']) {返回 '​​minFileSize';}如果 (is_int($this->options['max_number_of_files']) && (count($this->get_file_objects())>= $this->options['max_number_of_files'])){返回 '​​maxNumberOfFiles';}返回$错误;}受保护的函数 upcount_name_callback($matches) {$index = isset($matches[1]) ?intval($matches[1]) + 1 : 1;$ext = isset($matches[2]) ?$matches[2] : '';返回 '​​ ('.$index.')'.$ext;}受保护的函数 upcount_name($name) {返回 preg_replace_callback('/(?:(?: (([d]+)))?(.[^.]+))?$/',数组($this,'upcount_name_callback'),$姓名,1);}受保护的函数trim_file_name($name, $type) {//删除路径信息和文件名周围的点,以防止上传//进入不同的目录或替换隐藏的系统文件.//同时删除文件名周围的控制字符和空格 (x00..x20):$file_name = trim(basename(stripslashes($name)), ".x00..x20");//为已知图像类型添加缺少的文件扩展名:if (strpos($file_name, '.') === false &&preg_match('/^image/(gif|jpe?g|png)/', $type, $matches)) {$file_name .= '.'.$matches[1];}如果 ($this->options['discard_aborted_uploads']) {while(is_file($this->options['upload_dir'].$file_name)) {$file_name = $this->upcount_name($file_name);}}返回 $file_name;}受保护的函数 orient_image($file_path) {$exif = exif_read_data($file_path);$orientation = intval(@$exif['Orientation']);if (!in_array($orientation, array(3, 6, 8))) {返回假;}$image = @imagecreatefromjpeg($file_path);开关($方向){案例3:$image = @imagerotate($image, 180, 0);休息;案例6:$image = @imagerotate($image, 270, 0);休息;案例8:$image = @imagerotate($image, 90, 0);休息;默认:返回假;}$success = imagejpeg($image, $file_path);//释放内存(imagedestroy 不删除文件):@imagedestroy($image);返回 $success;}受保护的函数 handle_file_upload($uploaded_file, $name, $size, $type, $error) {$file = new stdClass();$file->name = $this->trim_file_name($name, $type);$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_path);clearstatcache();如果 ($uploaded_file && is_uploaded_file($uploaded_file)) {//multipart/formdata 上传(POST 方法上传)如果($append_file){file_put_contents($file_path,fopen($uploaded_file, 'r'),FILE_APPEND);} 别的 {move_uploaded_file($uploaded_file, $file_path);}} 别的 {//非分段上传(PUT 方法支持)file_put_contents($file_path,fopen('php://input', 'r'),$append_file ?FILE_APPEND : 0);}$file_size = 文件大小($file_path);if ($file_size === $file->size) {如果 ($this->options['orient_image']) {$this->orient_image($file_path);}$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)) {if ($this->options['upload_dir'] !== $options['upload_dir']) {$file->{$version.'_url'} = $options['upload_url'].rawurlencode($file->name);} 别的 {clearstatcache();$file_size = 文件大小($file_path);}}}} else if ($this->options['discard_aborted_uploads']) {取消链接($file_path);$file->error = '中止';}$file->size = $file_size;$this->set_file_delete_url($file);} 别的 {$file->error = $error;}返回 $ 文件;}公共函数 get() {$file_name = isset($_REQUEST['file']) ?basename(stripslashes($_REQUEST['file'])) : null;如果($file_name){$info = $this->get_file_object($file_name);} 别的 {$info = $this->get_file_objects();}header('内容类型:应用程序/json');回声 json_encode($info);}公共函数 post() {if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {返回 $this->delete();}$upload = isset($_FILES[$this->options['param_name']]) ?$_FILES[$this->options['param_name']] : null;$info = 数组();if ($upload && is_array($upload['tmp_name'])) {//param_name 是一个数组标识符,如files[]",//$_FILES 是一个多维数组: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],$上传['错误'][$index]);}} elseif ($upload || isset($_SERVER['HTTP_X_FILE_NAME'])) {//param_name 是一个单一的对象标识符,如文件",//$_FILES 是一维数组:$info[] = $this->handle_file_upload(isset($upload['tmp_name']) ?$upload['tmp_name'] : null,isset($_SERVER['HTTP_X_FILE_NAME']) ?$_SERVER['HTTP_X_FILE_NAME'] : (isset($upload['name']) ?$upload['name'] : null),isset($_SERVER['HTTP_X_FILE_SIZE']) ?$_SERVER['HTTP_X_FILE_SIZE'] : (isset($upload['size']) ?$upload['size'] : null),isset($_SERVER['HTTP_X_FILE_TYPE']) ?$_SERVER['HTTP_X_FILE_TYPE'] : (isset($upload['type']) ?$upload['type'] : null),isset($upload['error']) ?$upload['error'] : null);}header('变化:接受');$json = json_encode($info);$redirect = isset($_REQUEST['redirect']) ?stripslashes($_REQUEST['redirect']) : null;如果($重定向){header('位置:'.sprintf($redirect, rawurlencode($json)));返回;}if (isset($_SERVER['HTTP_ACCEPT']) &&(strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false)) {header('内容类型:应用程序/json');} 别的 {header('内容类型:文本/普通');}回声 $json;}公共函数删除(){$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] !== '.'&&取消链接($file_path);如果($成功){foreach($this->options['image_versions'] as $version => $options) {$file = $options['upload_dir'].$file_name;如果(is_file($文件)){取消链接($文件);}}}header('内容类型:应用程序/json');回声 json_encode($success);}}

你的元素应该是这样的:

<?php echo $this->Html->css('fileuploads/bootstrap.min');?><!-- 响应式网站布局的 Bootstrap 样式,支持不同的屏幕尺寸 --><?php echo $this->Html->css('fileuploads/bootstrap-responsive.min');?><!-- IE6 的 Bootstrap CSS 修复 --><!--[if lt IE 7]><?php echo $this->Html->css('fileuploads/bootstrap-ie6.min');?><![endif]--><!-- Bootstrap 图片库样式--><?php echo $this->Html->css('fileuploads/bootstrap-image-gallery.min');?><!-- CSS 将文件输入字段的样式设置为按钮并调整 Bootstrap 进度条 --><?php echo $this->Html->css('fileuploads/jquery.fileupload-ui');?><!-- Shim 使 HTML5 元素可用于较旧的 Internet Explorer 版本--><!--[if lt IE 9]><?php echo $this->Html->script('html5');?></script><![endif]-->

添加文件...开始上传取消上传删除

 </tbody></表单>

<!-- modal-gallery 是用于图片库的模态对话框--><div id="modal-gallery" class="modal-modal-gallery hidefade"><div class="modal-header"><a class="close" data-dismiss="modal">&times;</a><h3 class="modal-title"></h3>

<div class="modal-body"><div class="modal-image"></div></div><div class="modal-footer"><a class="btn modal-download" target="_blank"><i class="icon-download"></i><span>下载</span></a><a class="btn btn-success modal-play modal-slideshow" data-slideshow="5000"><i class="icon-play icon-white"></i><span>幻灯片</span></a><a class="btn btn-info modal-prev"><i class="icon-arrow-left icon-white"></i><span>上一个</span></a><a class="btn btn-primary modal-next"><span>下一步</span><i class="icon-arrow-right icon-white"></i></a>

<!-- 显示可上传文件的模板--><script id="template-upload" type="text/x-tmpl">{% for (var i=0, file; file=o.files[i]; i++) { %}<tr class="模板上传淡入淡出"><td class="preview"><span class="fade"></span></td><td class="name"><span>{%=file.name%}</span></td><td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td>{% if (file.error) { %}<td class="error" colspan="2"><span class="label label-important">{%=locale.fileupload.error%}</span>{%=locale.fileupload.errors[file.error] ||file.error%}</td>{% } else if (o.files.valid && !i) { %}<td><div class="progress progress-success progress-striped active"><div class="bar" style="width:0%;"></div></div></td><td class="start">{% if (!o.options.autoUpload) { %}<button class="btn btn-primary"><i class="icon-upload icon-white"></i><span>{%=locale.fileupload.start%}</span>{% } %}</td>{% } 别的 { %}<td colspan="2"></td>{%}%}<td class="cancel">{% if (!i) { %}<button class="btn btn-warning"><i class="icon-ban-circle icon-white"></i><span>{%=locale.fileupload.cancel%}</span>{% } %}</td></tr>{%}%}<!-- 显示可供下载的文件的模板--><script id="template-download" type="text/x-tmpl">{% for (var i=0, file; file=o.files[i]; i++) { %}<tr class="模板下载淡入淡出">{% if (file.error) { %}<td></td><td class="name"><span>{%=file.name%}</span></td><td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td><td class="error" colspan="2"><span class="label label-important">{%=locale.fileupload.error%}</span>{%=locale.fileupload.errors[file.error] ||file.error%}</td>{% } 别的 { %}<td class="preview">{% if (file.thumbnail_url) { %}<a href="{%=file.url%}" title="{%=file.name%}" rel="gallery" download="{%=file.name%}"><img src="{%=file.thumbnail_url%}"></a>{% } %}</td><td class="name"><a href="{%=file.url%}" title="{%=file.name%}" rel="{%=file.thumbnail_url&&'gallery'%}" download="{%=file.name%}">{%=file.name%}</a></td><td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td><td colspan="2"></td>{%}%}<td class="删除"><button class="btn btn-danger" data-type="{%=file.delete_type%}" data-url="{%=file.delete_url%}"><i class="icon-trash icon-white"></i><span>{%=locale.fileupload.destroy%}</span><input type="checkbox" name="delete" value="1"></td></tr>{%}%}

<!-- jQuery UI 部件工厂,如果已经包含 jQuery UI 可以省略 --><?php echo $this->Html->script('fileuploads/vendor/jquery.ui.widget');?><!-- 包含模板插件以呈现上传/下载列表--><?php echo $this->Html->script('fileuploads/tmpl.min');?><!-- 包含用于预览图像和图像大小调整的加载图像插件功能 --><?php echo $this->Html->script('fileuploads/load-image.min');?><!-- 包含用于调整图像大小功能的 Canvas to Blob 插件 --><?php echo $this->Html->script('fileuploads/canvas-to-blob.min');?><!-- Bootstrap JS 和 Bootstrap Image Gallery 不是必需的,但包含在演示中 --><?php echo $this->Html->script(array('fileuploads/bootstrap.min', 'fileuploads/bootstrap-image-gallery.min'));?><!-- 不支持 XHR 文件上传的浏览器需要 Iframe Transport --><?php echo $this->Html->script('fileuploads/jquery.iframe-transport');?><!-- 基本的文件上传插件--><?php echo $this->Html->script('fileuploads/jquery.fileupload');?><!-- 文件上传图片处理插件--><?php echo $this->Html->script('fileuploads/jquery.fileupload-ip');?><!-- 文件上传用户界面插件--><?php echo $this->Html->script('fileuploads/jquery.fileupload-ui');?><!-- 本地化脚本--><?php echo $this->Html->script('fileuploads/locale');?><!-- 主应用脚本--><?php echo $this->Html->script('fileuploads/main');?><!-- IE8+跨域文件删除包含XDomainRequest传输--><!--[if gte IE 8]><?php echo $this->Html->script('fileuploads/cors/jquery.xdr-transport');?><![endif]-->

Wa are using CakePHP and need to integrate the Blue Imp file upload libraries. Has anyone successfully integrated these? If so, did you setup the upload to store files on the database or file system? Can you share examples of such an integration?

Thanks much for your help and guidance.

解决方案

Yes I integrated the BlueImp file upload functionality in php. Please find the following component and the element to use.

<?php
/*
 * jQuery File Upload Plugin PHP Class 5.9.1
 * https://github.com/blueimp/jQuery-File-Upload
 *
 * Copyright 2010, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/MIT
 * Created By: Arun Jain
 */
App::import('Core', 'Inflector');
class UploadComponent extends Component
{

protected $options;

function __construct($options=null) {
    $this->options = array(
        'script_url' => $this->getFullUrl().'/',
        'upload_dir' => dirname($_SERVER['SCRIPT_FILENAME']).'/attachments/files/',
        'upload_url' => $this->getFullUrl().'/files/',
        'param_name' => 'files',
        // Set the following option to 'POST', if your server does not support
        // DELETE requests. This is a parameter sent to the client:
        'delete_type' => 'POST',
        // The php.ini settings upload_max_filesize and post_max_size
        // take precedence over the following max_file_size setting:
        'max_file_size' => null,
        'min_file_size' => 1,
        'accept_file_types' => '/.+$/i',
        'max_number_of_files' => null,
        // Set the following option to false to enable resumable uploads:
        'discard_aborted_uploads' => true,
        // Set to true to rotate images based on EXIF meta data, if available:
        'orient_image' => false,
        'image_versions' => array(
            // Uncomment the following version to restrict the size of
            // uploaded images. You can also add additional versions with
            // their own upload directories:
            /*
            'large' => array(
                'upload_dir' => dirname($_SERVER['SCRIPT_FILENAME']).'/files/',
                'upload_url' => $this->getFullUrl().'/files/',
                'max_width' => 1920,
                'max_height' => 1200,
                'jpeg_quality' => 95
            ),
            */
            'thumbnail' => array(
                'upload_dir' => dirname($_SERVER['SCRIPT_FILENAME']).'/attachments/thumbnails/',
                'upload_url' => $this->getFullUrl().'/attachments/thumbnails/',
                'max_width' => 80,
                'max_height' => 80
            )
        )
    );
    if (is_array($options)) {
        $this->options = array_replace_recursive($this->options, $options);
    }
}

protected function getFullUrl() {
    return
        (isset($_SERVER['HTTPS']) ? 'https://' : 'http://').
        (isset($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : '').
        (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'].
        (isset($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT'] === 443 ||
        $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))).
        substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));
}

protected function set_file_delete_url($file) {
    $file->delete_url = $this->options['script_url']
        .'?file='.rawurlencode($file->name);
    $file->delete_type = $this->options['delete_type'];
    if ($file->delete_type !== 'DELETE') {
        $file->delete_url .= '&_method=DELETE';
    }
}

protected 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);
            }
        }
        $this->set_file_delete_url($file);
        return $file;
    }
    return null;
}

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

protected 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) {
        if ($file_path !== $new_file_path) {
            return copy($file_path, $new_file_path);
        }
        return true;
    }
    $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';
            $image_quality = isset($options['jpeg_quality']) ?
                $options['jpeg_quality'] : 75;
            break;
        case 'gif':
            @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
            $src_img = @imagecreatefromgif ($file_path);
            $write_image = 'imagegif';
            $image_quality = null;
            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';
            $image_quality = isset($options['png_quality']) ?
                $options['png_quality'] : 9;
            break;
        default:
            $src_img = 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, $image_quality);
    // Free up memory (imagedestroy does not delete files):
    @imagedestroy($src_img);
    @imagedestroy($new_img);
    return $success;
}

protected 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;
}

protected function upcount_name_callback($matches) {
    $index = isset($matches[1]) ? intval($matches[1]) + 1 : 1;
    $ext = isset($matches[2]) ? $matches[2] : '';
    return ' ('.$index.')'.$ext;
}

protected function upcount_name($name) {
    return preg_replace_callback(
        '/(?:(?: (([d]+)))?(.[^.]+))?$/',
        array($this, 'upcount_name_callback'),
        $name,
        1
    );
}

protected function trim_file_name($name, $type) {
    // 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");
    // Add missing file extension for known image types:
    if (strpos($file_name, '.') === false &&
        preg_match('/^image/(gif|jpe?g|png)/', $type, $matches)) {
        $file_name .= '.'.$matches[1];
    }
    if ($this->options['discard_aborted_uploads']) {
        while(is_file($this->options['upload_dir'].$file_name)) {
            $file_name = $this->upcount_name($file_name);
        }
    }
    return $file_name;
}

protected function orient_image($file_path) {
    $exif = exif_read_data($file_path);
    $orientation = intval(@$exif['Orientation']);
    if (!in_array($orientation, array(3, 6, 8))) { 
        return false;
    }
    $image = @imagecreatefromjpeg($file_path);
    switch ($orientation) {
          case 3:
            $image = @imagerotate($image, 180, 0);
            break;
          case 6:
            $image = @imagerotate($image, 270, 0);
            break;
          case 8:
            $image = @imagerotate($image, 90, 0);
            break;
        default:
            return false;
    }
    $success = imagejpeg($image, $file_path);
    // Free up memory (imagedestroy does not delete files):
    @imagedestroy($image);
    return $success;
}

protected function handle_file_upload($uploaded_file, $name, $size, $type, $error) {
    $file = new stdClass();
    $file->name = $this->trim_file_name($name, $type);
    $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) {
            if ($this->options['orient_image']) {
                $this->orient_image($file_path);
            }
            $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)) {
                    if ($this->options['upload_dir'] !== $options['upload_dir']) {
                        $file->{$version.'_url'} = $options['upload_url']
                            .rawurlencode($file->name);
                    } else {
                        clearstatcache();
                        $file_size = filesize($file_path);
                    }
                }
            }
        } else if ($this->options['discard_aborted_uploads']) {
            unlink($file_path);
            $file->error = 'abort';
        }
        $file->size = $file_size;
        $this->set_file_delete_url($file);
    } 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() {
    if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {
        return $this->delete();
    }
    $upload = isset($_FILES[$this->options['param_name']]) ?
        $_FILES[$this->options['param_name']] : null;
    $info = array();
    if ($upload && is_array($upload['tmp_name'])) {
        // param_name is an array identifier like "files[]",
        // $_FILES is a multi-dimensional array:
        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]
            );
        }
    } elseif ($upload || isset($_SERVER['HTTP_X_FILE_NAME'])) {
        // param_name is a single object identifier like "file",
        // $_FILES is a one-dimensional array:
        $info[] = $this->handle_file_upload(
            isset($upload['tmp_name']) ? $upload['tmp_name'] : null,
            isset($_SERVER['HTTP_X_FILE_NAME']) ?
                $_SERVER['HTTP_X_FILE_NAME'] : (isset($upload['name']) ?
                    $upload['name'] : null),
            isset($_SERVER['HTTP_X_FILE_SIZE']) ?
                $_SERVER['HTTP_X_FILE_SIZE'] : (isset($upload['size']) ?
                    $upload['size'] : null),
            isset($_SERVER['HTTP_X_FILE_TYPE']) ?
                $_SERVER['HTTP_X_FILE_TYPE'] : (isset($upload['type']) ?
                    $upload['type'] : null),
            isset($upload['error']) ? $upload['error'] : null
        );
    }
    header('Vary: Accept');
    $json = json_encode($info);
    $redirect = isset($_REQUEST['redirect']) ?
        stripslashes($_REQUEST['redirect']) : null;
    if ($redirect) {
        header('Location: '.sprintf($redirect, rawurlencode($json)));
        return;
    }
    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;
}

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

}

And your element should looks like it:

<!-- Bootstrap CSS Toolkit styles -->
<?php echo $this->Html->css('fileuploads/bootstrap.min');?>
<!-- Bootstrap styles for responsive website layout, supporting different screen sizes     -->
<?php echo $this->Html->css('fileuploads/bootstrap-responsive.min');?>
<!-- Bootstrap CSS fixes for IE6 -->
<!--[if lt IE 7]><?php echo $this->Html->css('fileuploads/bootstrap-ie6.min');?>        <![endif]-->
<!-- Bootstrap Image Gallery styles -->
<?php echo $this->Html->css('fileuploads/bootstrap-image-gallery.min');?>
<!-- CSS to style the file input field as button and adjust the Bootstrap progress      bars -->
<?php echo $this->Html->css('fileuploads/jquery.fileupload-ui');?>
<!-- Shim to make HTML5 elements usable in older Internet Explorer versions -->
<!--[if lt IE 9]><?php echo $this->Html->script('html5');?></script><![endif]-->

Add files... Start upload Cancel upload Delete

        </tbody>
    </table>
</form>    
</div>
<!-- modal-gallery is the modal dialog used for the image gallery -->
<div id="modal-gallery" class="modal modal-gallery hide fade">
    <div class="modal-header">
        <a class="close" data-dismiss="modal">&times;</a>
        <h3 class="modal-title"></h3>
    </div>

    <div class="modal-body"><div class="modal-image"></div></div>
<div class="modal-footer">
    <a class="btn modal-download" target="_blank">
        <i class="icon-download"></i>
        <span>Download</span>
    </a>
    <a class="btn btn-success modal-play modal-slideshow" data-slideshow="5000">
        <i class="icon-play icon-white"></i>
        <span>Slideshow</span>
    </a>
    <a class="btn btn-info modal-prev">
        <i class="icon-arrow-left icon-white"></i>
        <span>Previous</span>
    </a>
    <a class="btn btn-primary modal-next">
        <span>Next</span>
        <i class="icon-arrow-right icon-white"></i>
    </a>
</div>
</div>
<!-- The template to display files available for upload -->
<script id="template-upload" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
<tr class="template-upload fade">
    <td class="preview"><span class="fade"></span></td>
    <td class="name"><span>{%=file.name%}</span></td>
    <td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td>
    {% if (file.error) { %}
        <td class="error" colspan="2"><span class="label label-important">{%=locale.fileupload.error%}</span> {%=locale.fileupload.errors[file.error] || file.error%}</td>

        {% } else if (o.files.valid && !i) { %}
        <td>
            <div class="progress progress-success progress-striped active"><div class="bar" style="width:0%;"></div></div>
        </td>
        <td class="start">{% if (!o.options.autoUpload) { %}
            <button class="btn btn-primary">
                <i class="icon-upload icon-white"></i>
                <span>{%=locale.fileupload.start%}</span>
            </button>
        {% } %}</td>
    {% } else { %}
        <td colspan="2"></td>
    {% } %}
    <td class="cancel">{% if (!i) { %}
        <button class="btn btn-warning">
            <i class="icon-ban-circle icon-white"></i>
            <span>{%=locale.fileupload.cancel%}</span>
        </button>
    {% } %}</td>
</tr>
{% } %}
</script>
<!-- The template to display files available for download -->
<script id="template-download" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
<tr class="template-download fade">
    {% if (file.error) { %}
        <td></td>
        <td class="name"><span>{%=file.name%}</span></td>
        <td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td>
        <td class="error" colspan="2"><span class="label label-important">{%=locale.fileupload.error%}</span> {%=locale.fileupload.errors[file.error] || file.error%}</td>
    {% } else { %}
        <td class="preview">{% if (file.thumbnail_url) { %}
            <a href="{%=file.url%}" title="{%=file.name%}" rel="gallery" download="{%=file.name%}"><img src="{%=file.thumbnail_url%}"></a>
        {% } %}</td>
        <td class="name">
            <a href="{%=file.url%}" title="{%=file.name%}" rel="{%=file.thumbnail_url&&'gallery'%}" download="{%=file.name%}">{%=file.name%}</a>
        </td>
        <td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td>
        <td colspan="2"></td>
    {% } %}
    <td class="delete">
        <button class="btn btn-danger" data-type="{%=file.delete_type%}" data-url="{%=file.delete_url%}">
            <i class="icon-trash icon-white"></i>
            <span>{%=locale.fileupload.destroy%}</span>
        </button>
        <input type="checkbox" name="delete" value="1">
    </td>
</tr>
{% } %}

<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<?php echo $this->Html->script('fileuploads/vendor/jquery.ui.widget');?>
<!-- The Templates plugin is included to render the upload/download listings -->
<?php echo $this->Html->script('fileuploads/tmpl.min');?>
<!-- The Load Image plugin is included for the preview images and image resizing 
functionality -->
<?php echo $this->Html->script('fileuploads/load-image.min');?>
<!-- The Canvas to Blob plugin is included for image resizing functionality -->
<?php echo $this->Html->script('fileuploads/canvas-to-blob.min');?>
<!-- Bootstrap JS and Bootstrap Image Gallery are not required, but included for the demo -->
<?php echo $this->Html->script(array('fileuploads/bootstrap.min', 'fileuploads/bootstrap-image-gallery.min'));?>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<?php echo $this->Html->script('fileuploads/jquery.iframe-transport');?>
<!-- The basic File Upload plugin -->
<?php echo $this->Html->script('fileuploads/jquery.fileupload');?>
<!-- The File Upload image processing plugin -->
<?php echo $this->Html->script('fileuploads/jquery.fileupload-ip');?>
<!-- The File Upload user interface plugin -->
<?php echo $this->Html->script('fileuploads/jquery.fileupload-ui');?>
<!-- The localization script -->
<?php echo $this->Html->script('fileuploads/locale');?>
<!-- The main application script -->
<?php echo $this->Html->script('fileuploads/main');?>
<!-- The XDomainRequest Transport is included for cross-domain file deletion for IE8+ -->
<!--[if gte IE 8]><?php echo $this->Html->script('fileuploads/cors/jquery.xdr-transport');?><!  [endif]-->

相关文章