做钢化膜网站线上营销怎么做
效果图
1.上传文件
2.压缩包文件
3.itemno1文件
或
4.上传到系统路径\ItemNo
5.更名后的itemno1文件(命名:当天日期+六位随机数)
代码
<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->文件夹->料号文件夹->料号文件 -->
<!-- 二层结构: 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)) {//获取当前日期$dateForFilename = date('Ymd');//生成随机数$random_number = generateUniqueRandomNumber($target_dir, $dateForFilename);// 构建新的文件名YMD_六位随机数( pathinfo用于从文件路径 $file 中提取出文件扩展名。 )$newFileName = $dateForFilename . '_' . sprintf('%06d', $random_number) . '.' . pathinfo($file, PATHINFO_EXTENSION);//新文件路径$new_path = $subDir . '/' . $newFileName;// 重命名文件rename($file, $new_path);// $target_dir 是一个变量,它包含了目标目录的完整路径。// $itemNo 是另一个变量,它代表了要创建的子目录的名称或者是某种项目的唯一标识符。$targetSubDir = $target_dir . $itemNo;// 检查 $targetSubDir 是否已经存在且是一个目录if (!is_dir($targetSubDir)) {// 调用 mkdir() 函数尝试创建这个子目录// 第一个参数是待创建目录的路径名,即 $targetSubDir。// 第二个参数 0755 是指创建的目录的权限模式。这是一个八进制数,转换成二进制后表示所有者有读写执行权限,同组用户和其他用户有读和执行权限,但没有写入权限。// 第三个参数 true 表示如果父级目录不存在,也将递归创建它们(即允许创建多级目录)。mkdir($targetSubDir, 0755, true);}// 将处理完的文件移动到最终目标目录rename($new_path, $targetSubDir . '/' . $newFileName);// 插入数据库$time = time();//获取文件名称(去掉后缀)$baseNameWithoutExt1 = pathinfo($new_path, PATHINFO_FILENAME);// 检查assembly_item_no是否存在$sql_check = "SELECT COUNT(*) as count FROM bom_headers_all WHERE assembly_item_no = '" . $itemNo . "'";$result_check = DB_query($sql_check, $db);$row_check = DB_fetch_array($result_check);if ($row_check['count'] > 0) {// 如果记录已存在,则更新last_update_date$sql_update = "UPDATE bom_headers_all SET last_update_date = '" . $time . "',last_updated_by = '" . $_SESSION['UserID'] . "' WHERE assembly_item_no = '" . $itemNo . "'";$result_update = DB_query($sql_update, $db);} else {// 如果记录不存在,上传到料号文件头$sql_insert = "INSERT INTO bom_headers_all (assembly_item_no,last_update_date,last_updated_by,creation_date,created_by)VALUES ('" . $itemNo . "','" . $time . "','" . $_SESSION['UserID'] . "','" . $time . "','" . $_SESSION['UserID'] . "')";$result_insert = DB_query($sql_insert, $db);}//查询该条料号的id$sql_selid = "SELECT bom_header_id FROM bom_headers_all WHERE assembly_item_no = '" . $itemNo . "'";$result_selid = DB_query($sql_selid, $db);if (DB_num_rows($result_selid) > 0) {// 获取第一条记录的bom_header_id$row_selid = mysqli_fetch_assoc($result_selid);$bom_header_id = $row_selid['bom_header_id'];//上传到料号文件行$sql_insert1 = "INSERT INTO bom_headers_all_file(bom_header_id,file_name,file_desc,file_patch,creation_date,created_by,last_update_by,last_update_date,enable_flag)VALUES ('" . $bom_header_id . "','" . '新文件名:' . $newFileName . "','" . '文件名:' . $fileName . "','" . $targetSubDir . '/' . $newFileName . "','" . $time . "','" . $_SESSION['UserID'] . "','" . $_SESSION['UserID'] . "','" . $time . "','Y')";$result_insert1 = DB_query($sql_insert1, $db);// prnMsg( sprintf( _( '文件 "%s" 在料号 "%s" 下已成功上传并重命名为 "%s" 并已插入数据库.' ), basename( $file ), $itemNo, $newFileName ), 'success' );} else {prnMsg('未获取到相应料号', 'error');}}}}// 删除临时解压目录及其内容delTree($unpack_dir);prnMsg(sprintf(_('文件 "%s" 上传成功.'), $file_name), 'success');} else {// 结构不合法,关闭ZIP资源并删除临时解压目录$zip->close();delTree($unpack_dir);continue;// 跳过该文件,进入下一个文件的处理}} else {prnMsg(sprintf(_('文件 "%s" 上传成功但无法解压.'), $file_name), 'error');}} else {prnMsg(sprintf(_('文件 "%s" 上传失败.'), $file_name), 'error');}}unset($_POST['update']);} else {prnMsg(_('附件上传失败!'), 'error');}
}// 定义一个函数,生成当天内不重复的六位随机数function generateUniqueRandomNumber($dir, $dateForFilename)
{//用do-while循环去判断文件名是否存在,如果存在就在此循环直到不存在为止do {// 生成一个介于100000到999999之间的随机整数$random_number = mt_rand(100000, 999999);//拼接字符串( /path/YMD_123456.ext 的字符串 )( .ext 是一个占位符,表示文件的扩展名,实际应用中应替换为具体的文件类型如 .jpg, .txt, .pdf 等。 )$filePath = $dir . '/' . $dateForFilename . '_' . sprintf('%06d', $random_number) . '.ext';} while (file_exists($filePath));//检查指定的文件路径 $filePath 是否存在。//跳出循环后返回随机数return $random_number;
}// 定义一个递归删除目录及其内容的函数function delTree($dir)
{// array_diff( scandir( $dir ), array( '.', '..' ) ) 从上述数组中排除.// (当前目录)和 ..(上级目录),得到的就是该目录下所有实际的文件和子目录名称,然后将其赋值给 $files。$files = array_diff(scandir($dir), array('.', '..'));// 使用 foreach 循环遍历 $files 数组中的每一个文件或子目录foreach ($files as $file) {// ( is_dir( "$dir/$file" ) ) 判断当前 $file 是否为子目录。// 如果 $file 是子目录,则调用 delTree( "$dir/$file" ) 函数递归删除这个子目录及其内部的所有文件和子目录。// 如果 $file 不是子目录(即普通文件),则调用 unlink( "$dir/$file" ) 函数删除这个文件。(is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");}// 删除最初传入的 $dir 目录本身。注意,只有当该目录为空时,rmdir() 才能成功删除目录。return rmdir($dir);
}
?>