本文描述了电子仓服务器的迁移过程,包括准备新服务器、安装必要软件、数据迁移和配置。系统验证阶段发现部分文件无法打开,原因是文件MD5不一致,由移动硬盘格式不兼容引起。解决方法包括重新复制文件、使用脚本批量查询和替换MD5不一致的文件,确保数据完整性和一致性。
一、迁移过程
1、准备新的电子仓服务器,安装IIS、aps.net4.0,安装需要使用PDF浏览功能的文件类型软件:如:office、SolidWorks、AutoCAD等,安装金蝶ERP客户端和PLM客户端,如果需要在线浏览文件还需要安装AutoVue;
2、原电子仓服务器断网,保持数据静止,将FTP整个文件夹复制到移动硬盘;
3、将移动硬盘中FTP整个文件夹复制到新电子仓服务器;
4、在新的电子仓服务器上:下载密钥、进行文档服务器配置、文档转换配置、文档浏览服务配置、导入密钥、启动文档转换服务;
二、系统验证
上传、下载、打开文档、检出修改检入等
三、问题及解决方法
问题
在打开文档或下载时发现部分文件无法打开,报错“缓冲区不能为null”,经过PLM研发工程师排查发现是文件的MD5与原文件不一致造成的,根本原因是移动硬盘格式不兼容造成的;
处理方法
1、使用新移动硬盘重新复制一份PLM文件到新服务器,并在新服务器查询所有移动硬盘中PLM文件的MD5;
2、在新电子仓服务器查询所有PLM文件的MD5;
批量查询文件MD5并输出TXT文档的语句如下:
Get-ChildItem -Path 'D:\Kingdee\PLMFTP0' -Recurse | Where-object { !$_.PSIsContainer } | ForEach-0bject {
$md5 =(Get-FileHash -Path $_.FullName -Algorithm MD5).Hash
"$($_.FullName) ~$md5" | Out -File-FilePath C:\Users\Administrator\Desktop\d_plmftp_1.txt -Append
}
3、通过EXCEL-VLOOKUP函数进行对比,筛选出MD5不一致的文件名;
4、通过python批量替换语句将MD5错误的文件替换为正确的;
批量替换文件的语句如下:
import hashlib
import logging
from pathlib import Path
import shutil
src folder = r'E:\PLMFTP'
dst foleder = r'D:\Kingdee\PLMFTP
filelist = 'plmwtwj.txt'
logger = logging.getLogger()
logger.setLevel(logging.INFO)
file handler = logging.FileHandler('replace.log')
file handler.setLevel(logging.lNFO)
console handler = logging.StreamHandler()
console handler.setLevel(logging.INFO)
formatter = logging.Formatter("%(message)s')
file handler.setFormatter(formatter)
console handler.setFormatter(formatter)
logger.addHandler(file handler)
logger.addHandler(console handler)
logger.info('Step1: 读取文件列表\n')
with open(filelist, 'r') as f:
files = f.readlines()
files summary = len(files)
logger.info(f'- 共读取 {files summary} 需替换文件\n')
logger.info("\nStep2: 检查和替换文件’)
flag =1
failure flag = 0
for file in files:filename = file.strip()
logger.info(f'\n{flag};: {filename}’)
flag += 1
src path =Path(src folder)/ filename[4].upper()/ filename
if not src path.exists():
logger.error(f'-E: 源路径({src folder})内此文件不存在')
failure flag +=1
continue
dst path = Path(dst foleder)/ filename[4].upper() / filename
if not dst path.exists():
logger.error(f'-E: 目的路径({dst foleder})内文件不存在')
failure flag +=1
continue
try:
shutil.copy2(src path, dst path)
logger.info(f'-1: 拷贝成功')
except Exception as e:
failure flag +=1
logger.error(f'-E: 拷贝失败,报错: {filename}')
logger.info(f'拷贝执行完成,共 {files summary}个文件,成功 {files summary-failure flag} 个,失败 failure flag} 个。\n”)
推荐阅读