PLM电子仓迁移后打开文档提示缓冲区不能为null原创
金蝶云社区-肖亚杰
肖亚杰
4人赞赏了该文章 46次浏览 未经作者许可,禁止转载编辑于2024年08月20日 13:25:50
summary-icon摘要由AI智能服务提供

本文描述了电子仓服务器的迁移过程,包括准备新服务器、安装必要软件、数据迁移和配置。系统验证阶段发现部分文件无法打开,原因是文件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”)


赞 4