大文件切片功能
近期接到的新需求:上傳大文件,因文件上傳的大小不定,所以需要切片上傳
前端代碼:
后端代碼:我們后端是用PHP完成的
<?phpif (!defined('BASEPATH')) exit('No direct script access allowed'); header('Content-Type:text/html;charset=utf-8');header('Access-Control-Allow-Origin:*');class chunkupload extends CI_Controller {private $filepath; // 上傳目錄private $tmpPath; // PHP文件上傳臨時目錄private $blobNum; // 當前第幾個文件塊private $totalBlobNum; // 文件塊總數private $fileName; // 原文件名private $finalFileName; // 經過處理的最終文件名public function __construct(){parent::__construct();}// 大文件分片上傳public function bigFileUpload(){if (empty($_POST['code'])) {echo_json(0,'code不能為空');}if (empty($_POST['module_name'])) {echo_json(0,'上傳目錄不能為空');}if (empty($_POST['blob_num'])) {echo_json(0,'當前片數不能為空');}if (empty($_POST['file_name'])) {echo_json(0,'文件名不能為空');}if (empty($_POST['total_blob_num'])) {echo_json(0,'總片數不能為空');}if (empty($_FILES['file'])) {echo_json('file為空');}if (empty($_FILES['file']['tmp_name'])) {echo_json(0,'tmp_name為空');}$fileDir = './uploads/'.trim($_POST['module_name'],'/').'/' . date('Y/m/d');$this->filepath = $fileDir;$this->tmpPath = $_FILES['file']['tmp_name'];$this->blobNum = $_POST['blob_num'];$this->totalBlobNum = $_POST['total_blob_num'];$this->fileName = $_POST['file_name'];// 校驗$this->validate($_POST['code'], $_POST['file_name']);// 移動文件$this->moveFile();// 合并分塊的文件$this->fileMerge();// 響應狀態$this->apiReturn();}// 判斷是否是最后一塊,如果是則進行文件合成并且刪除文件塊private function fileMerge(){if($this->blobNum == $this->totalBlobNum){$blob = '';for($i=1; $i<= $this->totalBlobNum; $i++){$blob .= file_get_contents($this->filepath.'/'. $this->fileName.'__'.$i);}$ext = '.'.substr(strrchr($this->fileName, '.'), 1);$this->finalFileName = date('YmdHis') . rand('10000', '99999') . $ext;file_put_contents($this->filepath.'/'. $this->finalFileName,$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(){header('Content-type: application/json');if($this->blobNum == $this->totalBlobNum){if(file_exists($this->filepath.'/'. $this->finalFileName)){$data['code'] = 2;$data['msg'] = 'success';$data['file_path'] = ltrim($this->filepath,'./').'/'. $this->finalFileName;echo json_encode($data);exit;}}else{if(file_exists($this->filepath.'/'. $this->fileName.'__'.$this->blobNum)){$data['code'] = 1;$data['msg'] = '上傳中,共:'.$this->totalBlobNum.'塊,當前第'.$this->blobNum.'塊....';$data['file_path'] = '';echo json_encode($data);exit;}}}// 建立上傳文件夾private function touchDir(){if(!file_exists($this->filepath)){return mkdir($this->filepath, 0777, true);}}// 參數校驗private function validate($code,$fileName){if (md5(md5($fileName.config_item('encryption_key'))) != $code) {echo_json(0,'參數校驗失敗');}} }function echo_json($code = 0, $msg = '', $data = array()) {$arr = array('code' => $code,'msg' => $msg,'data' => $data);echo json_encode($arr);exit; }?
轉載于:https://www.cnblogs.com/mxyr/p/10343039.html
總結
- 上一篇: python文件引用其他文件中的变量
- 下一篇: jmeter--入参为json类型