zoukankan      html  css  js  c++  java
  • 关于在TP中使用webupload切片上传文件与CI框架中切片上传文件

    一、在TP框架中使用切片上传

    (1).HTML页面的内容

    <head>
    <link href="/webuploader/webuploader.css" rel="stylesheet">
    </head>
    <body>
    <div id="uploader" class="wu-example">
        <!--用来存放文件信息-->
        <div id="thelist" class="uploader-list"></div>
        <div class="btns">
            <div id="picker">选择文件</div>
            <button id="ctlBtn" class="btn btn-default">开始上传    
           </button>
           </div>
    </div>
    <script type="text/javascript" src="/webuploader/webuploader.js"></script>
    <script type="text/javascript">
    var $btn = $('#ctlBtn');
    var uploader = WebUploader.create({
    
        // swf文件路径
        swf: '/webuploader/Uploader.swf',
    
        // 文件接收服务端。
        server: 'uploadFile',
    
        // 选择文件的按钮。可选。
        // 内部根据当前运行是创建,可能是input元素,也可能是flash.
        pick: '#picker',
        chunked: true, //是否要分片处理大文件上传
        chunkSize:2*1024*1024, //分片上传,每片2M,默认是5M
        fileSingleSizeLimit: 10*1024* 1024 * 1024,  
        // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
        resize: false
    });
    // 当有文件被添加进队列的时候
    uploader.on( 'fileQueued', function( file ) {
        var $list = $('#thelist');
        $list.append( '<div id="' + file.id + '" class="item">' +
            '<h4 class="info">' + file.name + '</h4>' +
            '<p class="state">等待上传...</p>' +
        '</div>' );
    });
    // 文件上传过程中创建进度条实时显示。
    uploader.on( 'uploadProgress', function( file, percentage ) {
        var $li = $( '#'+file.id ),
            $percent = $li.find('.progress .progress-bar');
    
        // 避免重复创建
        if ( !$percent.length ) {
            $percent = $('<div class="progress progress-striped active">' +
              '<div class="progress-bar" role="progressbar" style=" 0%">' +
              '</div>' +
            '</div>').appendTo( $li ).find('.progress-bar');
        }
    
        $li.find('p.state').text('上传中');
    
        $percent.css( 'width', percentage * 100 + '%' );
    });
    uploader.on( 'uploadSuccess', function( file ) {
        $( '#'+file.id ).find('p.state').text('已上传');
    });
    
    uploader.on( 'uploadError', function( file ) {
        $( '#'+file.id ).find('p.state').text('上传出错');
    });
    
    uploader.on( 'uploadComplete', function( file ) {
        $( '#'+file.id ).find('.progress').fadeOut();
    });
    
    $btn.on('click',function(){
        if ($(this).hasClass('disabled')) {
            return false;
        }
        uploader.upload();
    });
    </script>
    </body>

    (2)php控制器的内容

    public function sourceSave(){
            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
            header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
            header("Content-type: text/html; charset=gbk32");
            header("Cache-Control: no-store, no-cache, must-revalidate");
            header("Cache-Control: post-check=0, pre-check=0", false);
            header("Pragma: no-cache");
            $folder = input('folder');
            if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
                exit; // finish preflight CORS requests here
            }
            if ( !empty($_REQUEST[ 'debug' ]) ) {
                $random = rand(0, intval($_REQUEST[ 'debug' ]) );
                if ( $random === 0 ) {
                    header("HTTP/1.0 500 Internal Server Error");
                    exit;
                }
            }
            // header("HTTP/1.0 500 Internal Server Error");
            // exit;
            // 5 minutes execution time
            set_time_limit(5 * 60);
            // Uncomment this one to fake upload time
            usleep(5000);
            // Settings
            $targetDir = './Public'.DIRECTORY_SEPARATOR.'file_material_tmp';            //存放分片临时目录
            if($folder){
                $uploadDir = './Public'.DIRECTORY_SEPARATOR.'file_material'.DIRECTORY_SEPARATOR.$folder.DIRECTORY_SEPARATOR.date('Ymd');
            }else{
                $uploadDir = './Public'.DIRECTORY_SEPARATOR.'file_material'.DIRECTORY_SEPARATOR.date('Ymd');    //分片合并存放目录
            }
    
            $cleanupTargetDir = true; // Remove old files
            $maxFileAge = 5 * 3600; // Temp file age in seconds
    
            // Create target dir
            if (!file_exists($targetDir)) {
                mkdir($targetDir,0777,true);
            }
            // Create target dir
            if (!file_exists($uploadDir)) {
                mkdir($uploadDir,0777,true);
            }
            // Get a file name
            if (isset($_REQUEST["name"])) {
                $fileName = $_REQUEST["name"];
            } elseif (!empty($_FILES)) {
                $fileName = $_FILES["file"]["name"];
            } else {
                $fileName = uniqid("file_");
            }
            $oldName = $fileName;
    
            $fileName = iconv('UTF-8','gb2312',$fileName);
            $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;
            // $uploadPath = $uploadDir . DIRECTORY_SEPARATOR . $fileName;
            // Chunking might be enabled
            $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
            $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1;
            // Remove old temp files
            if ($cleanupTargetDir) {
                if (!is_dir($targetDir) || !$dir = opendir($targetDir)) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory111."}, "id" : "id"}');
                }
                while (($file = readdir($dir)) !== false) {
                    $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;
                    // If temp file is current file proceed to the next
                    if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") {
                        continue;
                    }
                    // Remove temp file if it is older than the max age and is not the current file
                    if (preg_match('/.(part|parttmp)$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge)) {
                        unlink($tmpfilePath);
                    }
                }
                closedir($dir);
            }
            // Open temp file
            if (!$out = fopen("{$filePath}_{$chunk}.parttmp", "wb")) {
                die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream222."}, "id" : "id"}');
            }
            if (!empty($_FILES)) {
                if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file333."}, "id" : "id"}');
                }
                // Read binary input stream and append it to temp file
                if (!$in = fopen($_FILES["file"]["tmp_name"], "rb")) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream444."}, "id" : "id"}');
                }
            } else {
                if (!$in = fopen("php://input", "rb")) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream555."}, "id" : "id"}');
                }
            }
            while ($buff = fread($in, 4096)) {
                fwrite($out, $buff);
            }
            fclose($out);
            fclose($in);
            rename("{$filePath}_{$chunk}.parttmp", "{$filePath}_{$chunk}.part");
            $index = 0;
            $done = true;
            for( $index = 0; $index < $chunks; $index++ ) {
                if ( !file_exists("{$filePath}_{$index}.part") ) {
                    $done = false;
                    break;
                }
            }
    
            if ($done) {
                $pathInfo = pathinfo($fileName);
                $hashStr = substr(md5($pathInfo['basename']),8,16);
                $hashName = time() . $hashStr . '.' .$pathInfo['extension'];
                $uploadPath = $uploadDir . DIRECTORY_SEPARATOR .$hashName;
                if (!$out = fopen($uploadPath, "wb")) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream666."}, "id" : "id"}');
                }
                //flock($hander,LOCK_EX)文件锁
                if ( flock($out, LOCK_EX) ) {
                    for( $index = 0; $index < $chunks; $index++ ) {
                        if (!$in = fopen("{$filePath}_{$index}.part", "rb")) {
                            break;
                        }
                        while ($buff = fread($in, 4096)) {
                            fwrite($out, $buff);
                        }
                        fclose($in);
                        unlink("{$filePath}_{$index}.part");
                    }
                    flock($out, LOCK_UN);
                }
                fclose($out);
                $response = [
                    'success'=>true,
                    'oldName'=>$oldName,
                    'filePath'=>$uploadPath,
    //                'fileSize'=>$data['size'],
                    'fileSuffixes'=>$pathInfo['extension'],          //文件后缀名
    //                'file_id'=>$data['id'],
                ];
                return json($response);
            }
    
            // Return Success JSON-RPC response
            die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
        }

    二、在CI框架中使用切片上传

    (1).这里直接写控制器里面的方法

    public function uploadFile(){
            header("Access-Control-Allow-origin:*");
            //header("Access-Control-Allow-Credentials:true");
            //header('Access-Control-Allow-Headers:x-requested-with,content-type');
            header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
            header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
            header("Cache-Control: no-store, no-cache, must-revalidate");
            header("Cache-Control: post-check=0, pre-check=0", false);
            header("Pragma: no-cache");
     
            // Support CORS
            // header("Access-Control-Allow-Origin: *");
            // other CORS headers if any...
            if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
                exit; // finish preflight CORS requests here
            }
             
            if ( !empty($_REQUEST[ 'debug' ]) ) {
                $random = rand(0, intval($_REQUEST[ 'debug' ]) );
                if ( $random === 0 ) {
                    header("HTTP/1.0 500 Internal Server Error");
                    exit;
                }
            }
            //
            //var_dump($_REQUEST);
            //
            // header("HTTP/1.0 500 Internal Server Error");
            // exit;
             
            // 5 minutes execution time
            @set_time_limit(5 * 60);
             
            $targetDir = './uploads/yinshua/upload_tmp';
            $uploadDir = './uploads/yinshua';
             
            $cleanupTargetDir = true; // Remove old files
            $maxFileAge = 5 * 3600; // Temp file age in seconds
             
             
            // Create target dir
            if (!file_exists($targetDir)) {
                @mkdir($targetDir);
            }
             
            // Create target dir
            if (!file_exists($uploadDir)) {
                @mkdir($uploadDir);
            }
             
            // Get a file name
            if (isset($_REQUEST["name"])) {
                $fileName = $_REQUEST["name"];
            } elseif (!empty($_FILES)) {
                $fileName = $_FILES["file"]["name"];
            } else {
                $fileName = uniqid("file_");
            }
            $time = time();
            $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;
            $uploadPath = $uploadDir . DIRECTORY_SEPARATOR .$time. $fileName;
             
            // Chunking might be enabled
            $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
            $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1;
             
     
            // Remove old temp files
            if ($cleanupTargetDir) {
                if (!is_dir($targetDir) || !$dir = opendir($targetDir)) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');
                }
             
                while (($file = readdir($dir)) !== false) {
                    $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;
             
                    // If temp file is current file proceed to the next
                    if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") {
                        continue;
                    }
             
                    // Remove temp file if it is older than the max age and is not the current file
                    if (preg_match('/.(part|parttmp)$/', $file) && (@filemtime($tmpfilePath) < time() - $maxFileAge)) {
                        @unlink($tmpfilePath);
                    }
                }
                closedir($dir);
            }
     
     
            // Open temp file
            if (!$out = @fopen("{$filePath}_{$chunk}.parttmp", "wb")) {
                die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
            }
             
            if (!empty($_FILES)) {
                if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
                }
             
            // Read binary input stream and append it to temp file
            if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) {
                die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
            }
            } else {
                if (!$in = @fopen("php://input", "rb")) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
                }
            }
             
            while ($buff = fread($in, 4096)) {
                fwrite($out, $buff);
            }
             
            @fclose($out);
            @fclose($in);
             
            rename("{$filePath}_{$chunk}.parttmp", "{$filePath}_{$chunk}.part");
             
            $index = 0;
            $done = true;
            for( $index = 0; $index < $chunks; $index++ ) {
                if ( !file_exists("{$filePath}_{$index}.part") ) {
                    $done = false;
                    break;
                }
            }
            if ( $done ) {
                if (!$out = @fopen($uploadPath, "wb")) {
                    die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
                }
             
                if ( flock($out, LOCK_EX) ) {
                    for( $index = 0; $index < $chunks; $index++ ) {
                        if (!$in = @fopen("{$filePath}_{$index}.part", "rb")) {
                            break;
                        }
             
                        while ($buff = fread($in, 4096)) {
                            fwrite($out, $buff);
                        }
             
                        @fclose($in);
                        @unlink("{$filePath}_{$index}.part");
                    }
             
                    flock($out, LOCK_UN);
                }
                @fclose($out);
            }
            $data = array(
                'jsonrpc'=>"2.0",
                'path' =>$uploadPath
            );
            echo json_encode($data,true);die;
            // Return Success JSON-RPC response   $uploadPath
            //die('{"jsonrpc" : "2.0", "result" : $data, "id" : "id"}');
    
        }
  • 相关阅读:
    Javascript正则表达式详解转载
    转载Sqlserver2005 存储过程分页
    转载手把手教你用C#打包应用程序
    学习内容
    用C#实现将HTML文件转换为CHM文件(转)
    C# Windows服务添加安装程序
    sql 2008评估期已过有关如何升级,企业试用版到期,升级为企业版+sql2008破解
    iis不能启动是什么原因?错误提示:“提示服务器没有及时相应启动或控制请求”
    .NET 获取数据库中所有表名的方法
    如何获取Dynamics当前登录的用户的GUID,进而获取用户的信息
  • 原文地址:https://www.cnblogs.com/zzc666/p/11341250.html
Copyright © 2011-2022 走看看