电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

php文件上傳小技巧與后端處理

瀏覽:113日期:2022-09-11 15:52:29

引語:在上一篇文章中說到,在頁面中可以用隱藏的方式讓你的上傳頁面看起來漂亮。但是這對于性能來說,并沒有什么卵用,那么在后臺的處理中,難道就沒有一些處理技巧么?所謂后臺的技巧,應該要包括上傳得快一點,上傳的文件大一點!那么,本文就來說說,后端處理都有些什么技巧吧!

業務場景一、我們只會選擇一個單個的文件上傳,而且不需要做一些即時的驗證工作。那么,也許并沒有什么優化可言了,因為,最后你要做的,只是將這個文件放在表單里最后一起提交,直接處理即可!

業務場景二、需要上傳多個文件,而且需要時時驗證文件內部內容,并時行相應頁面顯示。對于這種況,在用戶選擇了上傳文件之后,我們需要立即將文件上傳,因為我們需要讀取文件里的信息,在最后提交的時候,我們也需要提交一次文件。很明顯,在這里是存在一個重復上傳的工作的,一個耗費用戶時間,二個是耗費服務器帶寬資源!優化,能夠想得到的方法也很簡單,能不能在第一次上傳完文件之后,就將文件保留在服務器,真正提交表單的時候,去讀取這個已經被上傳的臨時文件即可。是的,這就是我們的處理思路!

業務場景三、與場景二類似,需要上傳多個文件,但是多個文件可能是分開上傳的。即我們可能第一次上傳了10M,第二次上傳了10M,總共上傳了10次,那么,在服務器端來說的話,一次性提交肯定是超出了上傳大小的限制了,但是如果,我們是分每一次的上傳,這是可以的,而最后提交的時候,我們只需要將簡短的文本信息傳上去即可!

思路的確是簡單的,看起來,也是沒什么問題,但是,也許我是能力有限,當時著實花了我不少時間去處理這個什么鬼!下面,我將給出一些示例代碼,以供參考:

文件上傳技巧(將單次上傳的文件作為臨時文件存在在服務器端)示例代碼:

1. 頁面js處理

//點擊選擇完成文件后,觸發上傳文件操作,將文件上傳至服務器臨時目錄 $(’.upload-real-file’).off().on(’change’, function(){ if(!$(this).val()){ return false; } var responseObjId = $(this).attr(’response-id’); var responseObj = $(’#’ + responseObjId); $(’#Form’).ajaxSubmit({url:’/aa/bb/uploadTmpApkTool’,resetForm: false,dataType: ’json’,beforeSubmit: function(option){ window.loading = layer.load(2);},success: function(data, statusText){ layer.close(window.loading); if(data.status == 1){responseObj.html(data.apkInfoHtml); var parentContainer = responseObj.parent().parent(), nameContainer = parentContainer.find(’.file-name-container’);nameContainer.html(data.apkName);nameContainer.attr(’title’, data.apkName);responseObj.find(’.file-tmp’).html(data.fileInfo); //將文件信息存放于隱藏域中,以便在提交時能找到 $(submitId).removeAttr(’disabled’); }else{layer.alert(data.info); }},error: function(data){ layer.close(window.loading); layer.alert(’未知錯誤,請稍后再試!’);} }); return false;//防止dialog 自動關閉 });

2. 很明顯,頁面里面需要獲取文件信息,后臺處理代碼(PHP)

$apkConfig = $this->_getApkConfig();$params = $this->getFilteredParam(’get’);$subFile = $_FILES[’apkToolFiles’];$apkName = $apkInfoHtml = ''; if(empty($subFile)){ $this->ajaxReturn(array(’status’ => -4, ’info’ => ’請選擇要上傳的文件’));} foreach ($subFile[’name’] as $subKey => $subVal){ if ($subFile[’name’][$subKey]) {$fileData = $this->_getFileData($subFile, $subKey);$checkData = array( ’maxSize’ => $apkConfig[’FILE_MAX_SIZE’], ’savePath’ => $apkConfig[’TMP_CHILD_PATH’], ’extArr’ => array(’apk’), ’releaseName’ => str_replace(’.apk’, ’’, $fileData[’fileName’]), //特有 );$checkResult = $this->_checkFileData($fileData, $checkData); if ($checkResult[’status’] != 1){ $this->ajaxReturn($checkResult);} //移動文件 $filePath = $checkData[’savePath’] . ’/’ . $fileData[’fileName’] . ’.tmp’ . genRandStr(6);;$this->_moveUploadedFile($fileData[’tmpName’], $filePath);$apkInfo = $this->_apkParser($filePath); //解析 if($apkInfo[’UMENG_CHANNEL’] != ’UMENG_CHANNEL_VALUE’){ @unlink($filePath); //刪除無效文件 $this->ajaxReturn(array(’status’ => 0, ’info’ => 'UMENG_CHANNEL的值要是 UMENG_CHANNEL_VALUE才行'));}$tmpFileArr[’file_info’] = array( ’name’ => $subFile[’name’][$subKey], ’type’ => $subFile[’type’][$subKey], ’tmp_name’ => str_replace($apkConfig[’TMP_CHILD_PATH’] . ’/’, ’’, $filePath), ’error’ => $subFile[’error’][$subKey], ’size’ => $subFile[’size’][$subKey],); //轉存該值,不再重復上傳文件 } else {$this->ajaxReturn(array(’status’ => 0, ’info’ => '文件不能為空')); } foreach ($apkInfo as $key => $val) {$apkInfoHtml .= '{$key}:{$val} rn'; } $apkName = $fileData[’fileName’]; $version = $apkInfo[’versionName’];}$fileInfo = htmlspecialchars(json_encode($tmpFileArr[’file_info’]));$fileInfoHtml = '<input name='apkToolFileTmp[]' value=’{$fileInfo}’ type='hidden'/>'; //一定要輸出前使用htmlspecialchars, 否則不能正確顯示頁面值和獲取至正確的文件信息 $this->ajaxReturn(array(’status’ => 1, ’info’ => '上傳成功', ’version’ => $version, ’item’ => $item, ’apkName’ => $apkName, ’apkInfoHtml’ => $apkInfoHtml, ’fileInfo’ => $fileInfoHtml)); }

3. 通過以兩部分代碼的配合,我們在頁面上已經有正確的信息了,只需要在最后提交表單的時候, 不要將文件提交到服務器,在服務器端處理時,只需將之前上傳的臨時文件移動一下位置即可 ,這樣就算大功告成了!

$(’.upload-file-real’).attr(’disabled’, ’disabled’); //提交表單前,禁用上傳文件

4. 后續工作

將臨時文件上傳到服務器后,是沒辦法判斷用戶是否取消當前操作的,如果取消了,則臨時文件將一直存在于服務器,所以,我們需要一個定時清理臨時目錄的腳本。當然,這個很簡單,就只需要找到這個目錄,比較一下時間,比如超過一天前的文件就給刪除。注意控制清理頻率即可!

5. 題外話

日志真的很重要,哪里出錯了,哪里刪除文件了,哪里清理數據庫了,一定要做好記錄,否則,到時查找原因時,到哪里去喊救命!

上傳文件到服務器臨時目錄,后端處理原理看起來很簡單,但是也需要你仔細調試,至少當初我在做這個小功能時,著實費了不少勁才縷清楚的!

標簽: PHP
相關文章:
主站蜘蛛池模板: 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 山东艾德实业有限公司| Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 工业风机_环保空调_冷风机_工厂车间厂房通风降温设备旺成服务平台 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 睿婕轻钢别墅_钢结构别墅_厂家设计施工报价 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | SRRC认证|CCC认证|CTA申请_IMEI|MAC地址注册-英利检测 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 澳洁干洗店加盟-洗衣店干洗连锁「澳洁干洗免费一对一贴心服务」 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 苏商学院官网 - 江苏地区唯一一家企业家自办的前瞻型、实操型商学院 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 萃取箱-萃取槽-PVC萃取箱厂家-混合澄清槽- 杭州南方化工设备 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 |