php:實現壓縮文件上傳、解壓、文件更名、刪除上傳臨時文件、存入數據庫等操作

 一、效果圖

1.上傳文件

2.壓縮包文件

3.itemno1文件

二層結構

三層結構

4.上傳到系統路徑\ItemNo

5.更名后的itemno1文件(命名:當天日期+六位隨機數)

二、普通實現

1、內容介紹

含有兩種結構

  • 二層結構:zip->料號文件夾->料號文件
  • 三層結構:zip->總文件夾->子文件夾->料號文件

(1)功能概述

  1. 允許用戶批量上傳包含產品文件的ZIP壓縮包
  2. 自動解壓ZIP文件并驗證其結構
  3. 將文件按照料號(ItemNo)分類存儲
  4. 為每個文件生成唯一的文件名
  5. 將文件信息記錄到數據庫

(2)主要實現步驟

a. 前端部分
  • 創建一個表單,允許用戶選擇多個ZIP文件上傳
  • 表單使用multipart/form-data編碼類型,支持文件上傳
  • 限制文件類型為.zip格式
b. 上傳處理流程

文件驗證??:

  • 檢查上傳的文件是否為ZIP格式
  • 檢查文件是否上傳成功

??ZIP文件處理??:

  • 創建臨時解壓目錄
  • 驗證ZIP文件內部結構是否符合要求
  • 解壓ZIP文件到臨時目錄

??文件結構分析??:

  • 遞歸查找一級子目錄(料號文件夾)
  • 確保結構為:ZIP -> 一級子目錄 -> 文件

??文件處理??:

  • 為每個文件生成唯一文件名(格式:YYYYMMDD_六位隨機數.擴展名)
  • 將文件移動到目標目錄(按料號分類)
  • 重命名文件以避免沖突

數據庫操作??:

  • 檢查料號是否存在,不存在則創建
  • 更新料號的最后修改時間和修改人
  • 記錄文件信息到數據庫表

??清理工作??:

  • 刪除臨時解壓目錄
  • 顯示上傳結果信息
c. 輔助功能

??唯一文件名生成??:

  • 使用日期前綴加隨機數確保文件名唯一
  • 檢查目標目錄避免重復

??遞歸刪除目錄??:

  • 安全刪除臨時解壓目錄及其所有內容

2、代碼實現

<?php
include('includes/session.inc');
$Title = _('產品文件整批上傳');
$ViewTopic = '產品文件整批上傳';
$BookMark = '產品文件整批上傳';
include('includes/header.inc');
include('includes/SQL_CommonFunctions.inc');
require_once 'upload.class.php';
echo '<p class="page_title_text"><img src="' . $RootPath . '/css/' . $Theme . '/images/magnifier.png" title="' . _('Search') . '" alt="" />' . ' ' . _('產品文件整批上傳') . '</p>';
?>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?>" method='post' enctype='multipart/form-data'><input type='hidden' name='FormID' value="<?php echo $_SESSION['FormID']; ?>"><input type='file' name='folderArchive[]' accept='.zip' multiple><input type='submit' value='上傳' name='update'>
</form>
<!-- 三層結構: zip->文件夾->料號文件夾->料號文件 -->
<?php
//指定路徑
$target_dir = 'ItemNo/';
// 臨時解壓目錄( 新建后會被刪除 )
$unpack_dir = 'ItemNo_Updates/';
//開始上傳
if (isset($_POST['update'])) {// 判斷是否有上傳的文件if (isset($_FILES['folderArchive']) && !empty($_FILES['folderArchive']['name'])) {//設定一個變量,值為上傳的文件信息$zip_files = $_FILES['folderArchive'];//對上傳的文件的name值( 例如test.zip )進行遍歷foreach ($zip_files['name'] as $key => $file_name) {//檢驗文件是否是zip文件// pathinfo() 函數用于解析路徑信息:PATHINFO_EXTENSION參數,表明它會返回文件路徑中的擴展名部分(如zip、txt 等)// 將 pathinfo() 返回的擴展名轉換為小寫形式,if (strtolower(pathinfo($file_name, PATHINFO_EXTENSION)) !== 'zip') {// sprintf 函數:格式化字符串輸出的函數prnMsg(sprintf(_('文件 "%s" 不是ZIP格式,請上傳ZIP文件.'), $file_name), 'error');// 如果不是zip文件就,跳過此文件( 將不再做上傳等操作 ),繼續執行后面的上傳文件continue;}//判斷每一條數據的error值:看是否上傳成功( UPLOAD_ERR_OK表示長傳成功 )if ($zip_files['error'][$key] === UPLOAD_ERR_OK) {//取出該條數據的tmp_name值( 獲取上傳文件的臨時存儲路徑 )$temp_file = $zip_files['tmp_name'][$key];// 先創建并打開 ZipArchive 對象,創建一個新的ZipArchive對象(ZipArchive用于讀取、創建、更新和提取ZIP格式的壓縮文件)$zip = new ZipArchive;//打開壓縮文件if ($zip->open($temp_file) === TRUE) {//創建臨時解壓目錄mkdir($unpack_dir, 0755, true);// 驗證ZIP文件結構//設置一個變量用于判斷結構是否合規$structure_valid = true;//遍歷ZipArchive對象(通過 $zip 引用)中的所有文件.numFiles是壓縮包內的文件數量for ($i = 0; $i < $zip->numFiles && $structure_valid; $i++) {// 獲取指定索引 $i 處的ZIP壓縮包內文件的名稱$filename = $zip->getNameIndex($i);//將返回一個數組,數組中的每個元素對應于字符串中兩個斜杠(/)之間的部分$path_parts = explode('/', $filename);// 檢查文件路徑分隔符個數,必須是兩層結構if (count($path_parts) != 2 && count($path_parts) != 3) {//如果不是兩層結構,結構不正確$structure_valid = false;prnMsg(sprintf(_('文件 "%s" 的內部結構不符合要求.'), $file_name), 'error');// prnMsg( sprintf( _( '文件 "%s" 的內部結構不符合要求(必須是 ZIP -> (一級目錄) -> 文件 的結構,至少要有一級子目錄).' ), $file_name ), 'error' );//跳出循環break;}}//如果結構正確if ($structure_valid) {// 解壓縮文件$zip->extractTo($unpack_dir);// 關閉已經打開的 ZipArchive 對象的( 與open對應 )$zip->close();// 尋找解壓后的一級子目錄(不論外部文件夾是否存在)$subDirs = [];// 定義遞歸函數,找出所有一級子目錄function findSubDirs($dir, &$subDirs){foreach (glob($dir . '/*', GLOB_ONLYDIR) as $subDir) {// 如果當前目錄下還有子目錄且子目錄下包含文件,則認定為一級子目錄if (count(glob($subDir . '/*')) > 0 && count(glob($subDir . '/*', GLOB_ONLYDIR)) == 0) {$subDirs[] = $subDir;} else {// 繼續遞歸尋找下一級子目錄findSubDirs($subDir, $subDirs);}}}foreach (glob($unpack_dir . '/*', GLOB_ONLYDIR) as $possibleOuterDir) {// 直接處理一級子目錄(ZIP -> 一級子目錄 -> 文件結構)if (count(glob($possibleOuterDir . '/*', GLOB_ONLYDIR)) == 0) {$subDirs[] = $possibleOuterDir;} else {// 遞歸尋找可能的外部文件夾下的一級子目錄findSubDirs($possibleOuterDir, $subDirs);}}//遍歷每個文件夾的文件foreach ($subDirs as $subDir) {// 獲取料號名稱( 文件夾名稱 )$itemNo = basename($subDir);// 獲取子文件夾中的所有文件$temp_sub_dir_files = glob($subDir . '/*');//循環子文件中的文件foreach ($temp_sub_dir_files as $file) {// 如果 $file 是一個目錄,跳過if (is_dir($file)) {continue;}//驗證文件是否已在目標目錄中存在//獲取文件名稱$fileName = basename($file);// 獲取目標目錄下所有文件和目錄的名字$existingFiles = scandir($target_dir);// 如果文件不在目標目錄現存文件列表中,則是新上傳的文件if (!in_array($fileName, $existingFiles)) {

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77821.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于大語言模型的減肥健身計劃系統設計與實現

基于大語言模型的減肥健身計劃系統設計與實現 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】功能演示與部署指南 【技術棧】 ①&#xff1a;系統環境&#xff1a;Python 3.x Django 4.2 ②&#xff1a;開發環境&#xff1a;Web服務…

c#開發大沖鋒游戲登錄器

1 前言 本文主要分享登錄器的簡要開發過程&#xff0c;只適合小白選手&#xff0c;高手請自動避讓。 此項目是復刻大沖鋒計劃中的子集。 &#xff08;注&#xff1a;大沖鋒是迅雷代理的一款次時代多職業第一人稱FPS射擊游戲&#xff0c;目前已經關服嗝屁。&#xff09; 2 …

Linux[基礎指令][2]

Linux[基礎指令][2] cp(復制) 格式:cp [-rf] 源文件 {普通文件,目錄} 拷貝 cp -r 遞歸拷貝目錄 藍色為目錄,白色為具體文件 拷貝后面加一個不存在的文件會新建文件再拷貝 cp -ir -i是覆蓋的時候詢問 如果目標文件存在就會覆蓋原有文件 mv(重命名/剪切) 格式:mv 源文件…

React18+ 項目搭建-從初始化、技術選型到開發部署的全流程規劃

搭建一個 React 項目需要從項目初始化、技術選型到開發部署的全流程規劃。以下是詳細步驟和推薦的技術棧&#xff1a; 一、項目初始化 1. 選擇腳手架工具 推薦工具&#xff1a; Vite&#xff08;現代輕量級工具&#xff0c;支持 React 模板&#xff0c;速度快&#xff09;&am…

人工智能學習框架完全指南(2025年更新版)

一、核心框架分類與適用場景 人工智能框架根據功能可分為深度學習框架、機器學習框架、強化學習框架和傳統工具庫,以下是主流工具及選型建議: 1. 深度學習框架 (1)PyTorch 核心優勢:動態計算圖、靈活性強,適合科研與快速原型開發,支持多模態任務(如NLP、CV) 。技術生…

MySQL 詳解之事務管理

MySQL 詳解之事務管理 在數據庫領域,事務是一個核心概念,它確保了數據操作的可靠性和一致性。尤其是在處理涉及多個步驟且必須全部成功或全部失敗的業務場景時,事務更是不可或缺。本篇文章將深入探討 MySQL 中的事務管理,幫助您全面理解事務的工作原理及其在實際應用中的重…

SpringAI+DeepSeek大模型應用開發——5 ChatPDF

ChatPDF 知識庫 RAG檢索增強 由于訓練大模型非常耗時&#xff0c;再加上訓練語料本身比較滯后&#xff0c;所以大模型存在知識限制問題&#xff1a; 知識數據比較落后&#xff0c;往往是幾個月之前的&#xff1b;不包含太過專業領域或者企業私有的數據&#xff1b; 為了解決…

SSH 互信被破壞能導致 RAC 異常關閉嗎

一、 SSH 互信和 RAC 的關系 1、SSH 互信對 RAC 的作用 Oracle 11g R2 在安裝 Grid Infrastructure 的時候&#xff0c;能夠通過安裝程序配置節 點間的 SSH 用戶等效性&#xff0c;之所以要在安裝之前配置 SSH 用戶等效性&#xff0c;是為了能 夠在安裝前使用 C…

【數字圖像處理】立體視覺信息提取

雙目立體視覺原理 設一個為參考平面&#xff0c;一個為目標平面。增加了一個攝像頭后&#xff0c;P與Q在目標面T上有分別的成像點 雙目立體視覺&#xff1a;從兩個不同的位置觀察同一物體&#xff0c;用三角測量原理計算攝像機到該物體的距離的 方法 原理&#xff1a;三角測量…

基于springboot+vue的校園二手物品交易平臺

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【Redis】Redis基本命令(1)

KEYS 返回所有滿足樣式&#xff08;pattern&#xff09;的key。 KEY * 返回所有key&#xff0c;不簡易使用 性能問題&#xff1a;當 Redis 存儲百萬級鍵時&#xff0c;會消耗大量 CPU 和內存資源&#xff0c;Redis 是單線程模型&#xff0c;KEYS * 執行期間會阻塞其他所有命令…

C#通用常見面試題-精心整理

以下是優化后的版本,在原有內容基礎上補充了應用場景,其他結構保持不變: 上位機面試題解答(技術詳解+示例) C#-IOC框架 1. 值類型和引用類型的本質區別 解釋 值類型:存儲在棧中,直接保存數據值(如 int, struct)。引用類型:存儲在堆中,變量保存對象地址(如 class,…

K8S節點出現Evicted狀態“被驅逐”

在Kubernetes集群中&#xff0c;Pod狀態為“被驅逐&#xff08;evicted&#xff09;”表示Pod無法在當前節點上繼續運行&#xff0c;已被集群從節點上移除。 問題分析&#xff1a; 節點磁盤空間不足 &#xff0c;使用df -h查看磁盤使用情況 可以看到根目錄 / 已100%滿&#x…

[密碼學基礎]國密算法深度解析:中國密碼標準的自主化之路

國密算法深度解析&#xff1a;中國密碼標準的自主化之路 國密算法&#xff08;SM系列算法&#xff09;是中國自主研發的密碼技術標準體系&#xff0c;旨在打破國際密碼技術壟斷&#xff0c;保障國家信息安全。本文將從技術原理、應用場景和生態發展三個維度&#xff0c;全面解…

Linux 網絡基礎(三) TCP/IP協議

一、TCP 與 IP 的關系 IP 層的核心作用是定位主機&#xff0c;具有將數據從主機 A 發送到主機 B 的能力&#xff0c;但是能力并不能保證一定能夠做到&#xff0c;所以這時就需要 TCP 起作用了&#xff0c;TCP 可以通過超時重傳、擁塞控制等策略來保證數據能夠發送到 B 主機。 所…

基于 Vue 的Tiptap 富文本編輯器使用指南

目錄 &#x1f9f0; 技術棧 &#x1f4e6; 所需依賴 &#x1f4c1; 文件結構 &#x1f9f1; 編輯器組件實現&#xff08;components/Editor.vue&#xff09; ? 常用操作指令 &#x1f9e0; 小貼士 &#x1f9e9; Tiptap 擴展功能使用說明&#xff08;含快捷鍵與命令&am…

統計圖表ECharts

統計某個時間段&#xff0c;觀看人數 ①、數據表 ②、業務代碼 RestController RequstMapping(value"/admin/vod/videoVisitor") CrossOrigin public class VideoVisitorController{Autowriedprivate VideoVisitorService videoVisitorService;//課程統計的接口…

ubuntu 安裝 redis server

ubuntu 安裝 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…

【白雪講堂】[特殊字符]內容戰略地圖|GEO優化框架下的內容全景布局

&#x1f4cd;內容戰略地圖&#xff5c;GEO優化框架下的內容全景布局 1?? 頂層目標&#xff1a;GEO優化戰略 目標關鍵詞&#xff1a; 被AI理解&#xff08;AEO&#xff09; 被AI優先推薦&#xff08;GEO&#xff09; 在關鍵場景中被AI復讀引用 2?? 三大引擎邏輯&#x…

NVIDIA 自動駕駛技術見解

前言 參與 NVIDIA自動駕駛開發者實驗室 活動&#xff0c;以及解讀了 NVIDIA 安全報告 自動駕駛 白皮書&#xff0c;本文是我的一些思考和見解。自動駕駛技術的目標是為了改善道理安全、減少交通堵塞&#xff0c;重塑更安全、高效、包容的交通生態。在這一領域&#xff0c;NVI…