php切片上传
html
<style> html { _overflow-y: scroll } .swfupload { position: absolute; z-index: 1; } .mainnav_title { display: none; } </style> <link rel="stylesheet" href="layui/css/layui.css"> <script src="__ROOT__/Public/Js/jquery-3.7.1.min.js"></script> <script src="/layui/layui.js"></script> <script type="text/javascript" src="__ROOT__/Public/Js/swfupload/handlers.js"></script> <?php if($file_types == '*.jpeg;*.jpg;*.png;*.gif') { $accept_file_types = str_replace([';', '*.'], [',', 'image/'], $file_types); }elseif($file_types == '*.flv;*.mp4;*.swf') { $accept_file_types = 'video/mp4'; } $fileName = date('YmdHis', time()).rand(1000,9999); ?> <div class="layui-upload" style="margin: 10px;"> <input type="file" id="fileElem" autocomplete="off" style="display: none;" accept="<?php echo $accept_file_types;?>"></input> <button type="button" class="layui-btn" id="fileSelect">选择文件</button> <span style="color: #FF5722">每次只能上传1个文件,文件大小情况控制在3G内</span> <div class="layui-upload-list"> <table class="layui-table"> <thead> <tr style="width: 15%"> <th>文件名</th> <th style="width: 10%">大小</th> <th style="width: 65%">进度</th> <th style="width: 10%">状态</th> </thead> <tbody id="demoList"></tbody> </table> </div> <button type="button" class="layui-btn" id="upstart">开始上传</button> </div> <script> var fileSelect = document.getElementById("fileSelect"), fileElem = document.getElementById("fileElem"), upload_url = '{:U('NewUpload/upload')}&PHPSESSID=<?php echo $sessid;?>&isadmin=<?php echo $isadmin;?>&userid=<?php echo $userid?>&isthumb=<?php echo $isthumb;?>&addwater=<?php echo intval($watermark_enable);?>&lang=<?php echo $lang;?>&moduleid=<?php echo $moduleid?>'; fileSelect.addEventListener("click", function(e) { if (fileElem) { fileElem.click(); fileElem.addEventListener("change", handleFiles, false); } e.preventDefault(); // prevent navigation to "#" }, false); var fileList = []; var file_size = 3100; function handleFiles() { var filecontent = ""; fileList.push($('#fileElem')[0].files[0]) for (var i = 0; i < fileList.length; i++) { // 定义允许上传文件的大小 var filesize = (fileList[i].size / 1024 / 1024).toFixed(1); if (filesize >= file_size) { layer.msg(fileList[i].name + '文件大小超出限制', { icon: 2, time: 3000 }); fileList = ""; return false; } filecontent += '<tr>' + '<td>' + fileList[i].name + '</td>' + '<td>' + (fileList[i].size / 1024 / 1024).toFixed(1) + 'MB</td>' + '<td>' + '<div lay-filter="' + fileList[i].lastModified + '_' + i + '" lay-showPercent="true" lay-filter="progress_' + i + '">' + '<div lay-percent="0%"></div>' + '</div>' + '</td>' + '<td id="' + fileList[i].lastModified + '_' + i + '">等待上传</td>' + '<td style="display:none" id="filepath"></td>' + '</tr>'; } $("#demoList").append(filecontent); } //--------------- var upstartBtn = document.getElementById('upstart'); //--------------- const LENGTH = 512 * 1024 * 1; var start = 0; var end = start + LENGTH; var blob; var blob_num = 1; var is_stop = 0 var file = null; var loading; //----------------------------- var upload_instance = new Upload(); var fileid = 0; upstartBtn.onclick = function() { if (fileList.length == 0) { layer.msg('请选择文件'); return; } for (var i = 0; i < fileList.length; i++) { fileid = fileList[i].lastModified + '_' + i; upload_instance.addFileAndSend(fileList[i]); } return false; } function Upload() { //对外方法,传入文件对象 this.addFileAndSend = function(that) { // loading loading = layer.load(1, { shade: [0.3, '#fff'] }); file = that; blob = cutFile(file); sendData(blob, file); blob_num += 1; } //切割文件 function cutFile(file) { var file_blob = file.slice(start, end); start = end; end = start + LENGTH; return file_blob; }; //发送文件 function sendData(blob, file) { var form_data = new FormData(); var total_blob_num = Math.ceil(file.size / LENGTH); form_data.append('file', blob); form_data.append('blob_num', blob_num); form_data.append('total_blob_num', total_blob_num); form_data.append('file_name', '<?php echo $fileName;?>'); form_data.append('file_full_name', file.name); //console.log(blob_num); //console.log(total_blob_num); $.ajax({ url: upload_url, type: 'post', async: true, dataType: "json", data: form_data, contentType: false, processData: false, success: function(data) { //console.log(data); if (data['code'] == 1) { // 进度条和状态设置 if (total_blob_num == 1) { progress = '100%'; } else { progress = (Math.min(100, (blob_num / total_blob_num) * 100)).toFixed(2) + '%'; } // 进度条 layui.element.progress(fileid, progress); // 状态 var type = document.getElementById(fileid); type.innerText = progress; //console.log('progress-----' + progress); //继续上传 if (start < file.size && is_stop === 0) { blob = cutFile(file); sendData(blob, file); blob_num += 1; } //每次清空 form_data = ""; } else if (data['code'] == 2) { console.log(data); // 进度条 progress = '100%'; layui.element.progress(fileid, progress); // loading end layer.close(loading); // 上传成功 var type = document.getElementById(fileid); type.innerText = "上传成功"; var text = '<span style="display:none">' + data.file_path + '</span><span style="display:none">' + data.file_extension + '</span><span style="display:none">' + data.file_name + '</span>'; <?php if($file_types == '*.jpeg;*.jpg;*.png;*.gif') { echo '$(window.parent.document).find(\'#Main\')[0].contentDocument.getElementById("thumb_pic").setAttribute(\'src\', data.file_full_name);$(window.parent.document).find(\'#Main\')[0].contentDocument.getElementById("thumb").setAttribute(\'value\', data.file_full_name);'; }elseif($file_types == '*.flv;*.mp4;*.swf') { echo '$(window.parent.document).find(\'#Main\')[0].contentDocument.getElementById("video_path").setAttribute(\'value\', data.file_full_name);'; }elseif($file_types == '*.zip;*.rar;*.doc;*.ppt') { echo '$(window.parent.document).find(\'#Main\')[0].contentDocument.getElementById("file").setAttribute(\'value\', data.file_full_name);'; } ?> $("#filepath").append(text); //每次清空 form_data = ""; } }, error: function(data) { // loading end layer.close(loading); layer.msg('网络错误', { icon: 2, time: 2000 }); return; } }) } } </script>
php
<?php ini_set('memory_limit', -1); //要有足够大的内存来允许处理上传的文件 set_time_limit(0); //防止超时 /** * * Upload(附件管理) * * @package YOURPHP * @author liuxun QQ:147613338 <admin@yourphp.cn> * @copyright Copyright (c) 2008-2011 (http://www.yourphp.cn) * @license http://www.yourphp.cn/license.txt * @version YourPHP企业网站管理系统 v2.1 2012-10-08 yourphp.cn $ */ if(!defined("Yourphp")) exit("Access Denied"); class NewUploadAction extends Action { private $filepath; //上传目录 private $tmpPath; //PHP文件临时目录 private $blobNum; //第几个文件块 private $totalBlobNum; //文件块总数 private $fileName; //文件名 public function __construct($tmpPath, $blobNum, $totalBlobNum, $fileName, $filepath) { } public function upload() { // 上传文件 $uploadDir = './upload'; $dirDate = date('Y-m-d', time()); $uploadDir = $uploadDir . '/' . $dirDate; if(!is_dir($uploadDir)) mkdir($uploadDir); $fileName = $_POST['file_name']; $ext = substr(strrchr($_POST['file_full_name'], '.'), 1); $fileName = $fileName.'.'.$ext; $this->tmpPath = $_FILES['file']['tmp_name']; $this->blobNum = $_POST['blob_num']; $this->totalBlobNum = $_POST['total_blob_num']; $this->fileName = $fileName; $this->filepath = $uploadDir; $this->moveFile(); $this->fileMerge(); $this->apiReturn(); } private function fileMerge() { $blob = ''; $blob = file_get_contents($this->filepath . '/' . $this->fileName . '__' . $this->blobNum); $res = file_put_contents($this->filepath . '/' . $this->fileName, $blob, FILE_APPEND); unset($blob); $this->deleteFileBlob(); } //删除文件块 private function deleteFileBlob() { for ($i = 1; $i <= $this->totalBlobNum; $i++) { @unlink($this->filepath . '/' . $this->fileName . '__' . $i); } } private function moveFile() { $this->touchDir(); $filename = $this->filepath . '/' . $this->fileName . '__' . $this->blobNum; move_uploaded_file($this->tmpPath, $filename); } //API返回数据 public function apiReturn() { if ($this->blobNum == $this->totalBlobNum) { if (file_exists($this->filepath . '/' . $this->fileName)) { $data['code'] = 2; $data['msg'] = 'success'; $data['file_full_name'] = str_replace(['./'], ['/'], $this->filepath.'/'.$this->fileName); $data['file_name'] = substr($this->fileName, 0, strrpos($this->fileName, '.')); $data['file_extension'] = substr(strrchr($this->fileName, '.'), 1); } } else { if (file_exists($this->filepath . '/' . $this->fileName)) { $data['code'] = 1; $data['msg'] = 'waiting'; $data['file_path'] = ''; } } header('Content-type: application/json'); echo json_encode($data); } private function touchDir() { if (!file_exists($this->filepath)) { return mkdir($this->filepath); } } }