金格技术论坛

注册

 

发新话题 回复该主题

【资料】减少文档损坏问题的几个处理方案 [复制链接]

1#
银光图片
问题描述:使用金格iWebOffice系列的控件,有时会出现文档流转之后就无法再正常打开的情况。具体的表现为打开文档时提示要选择文件格式,选择之后打开的文档里全是乱码。(如下图)
您所在的用户组无法下载或查看附件


问题分析:这类问题经过大量测试和日志记录分析后,我们判断文件损坏可能和文件在服务器上的保存有关联,也就是文件在服务器上保存时损坏了,可能是保存到磁盘时出现问题导致或者保存到数据库时出现问题导致。总之,最后可以确定的是文件在保存到服务器之后损坏了,所以之后再也无法打开。因此,解决问题的思路是:1、要尽量避免损坏的文档替换掉之前存放在服务器上的正常文档;2、最好有方法可以判断文件是否损坏。

解决方案一:【服务器端保存后效验文件】
步骤1、iWebOffice控件从X.8.6.18之后,在保存文档时会对带提交的文件数据进行一次MD5摘要,并把摘要信息一起发送到服务器。在服务器端可以用String mMD5 = MsgObj.GetMsgByName("MD5");方式获取。
步骤2、服务器端保存完文件之后,对已经保存的文件进行一次MD5摘要(用户可以自己实现,以获得最好的执行效率),之后将客户端传来的MD5内容和服务器端完成的MD5内容进行对比,如果一致则说明保存出的文件没有问题。

解决方案二:【服务器端效验后保存文件】
步骤1、在服务器端保存文件时,不直接替换原有文件,而是先保存一份临时文件。
步骤2A、对已经保存的文件获取一次文件大小(用户可以自己实现,以获得最好的执行效率),然后和从后台类的MsgFileSize()方法中提供的文件大小进行对比,如果大小一致,则说明文件正常。此方法效率较高,但有时磁盘保存异常时文件可能已经获得真实的大小,但是文件数据并未完全写入,也可能出现文件损坏而检测不到的情况,因此推荐用步骤2B。
步骤2B、使用方案一的方式效验文件。此方案在保存大文件时效率稍低,但可靠性最佳。
步骤3、完成效验后,删除服务器上老的文件,将临时文件名称改为老的文件名称实现替换。如果是新建文件,则改名为新建文件名称,不需要删除老的文件。
  1. // 下面是方案二,步骤2A的实现示例
  2. mFilePath = mFilePath + File.separator + mFileName;
  3. if (MsgObj.MsgFileSave(mFilePath + ".bak")){ //保存文档内容到文件夹中(不直接替换),产生一份新文件
  4.   File f = new File(mFilePath + ".bak");  //读取刚才保存的文件
  5.   if (f.exists() && f.isFile()){  
  6.     System.out.println("本次保存出的文件大小:"+String.valueOf(f.length()));
  7.     if(mFileSize==f.length()  && mFileSize>1024){  //判断保存出的文件的大小是否和待保存的一致?如果一致则替换
  8.       File fo = new File(mFilePath);  // 用于操作老文件
  9.       if (fo.exists() && fo.isFile()){
  10.         fo.delete();  //删除老文件
  11.         f.renameTo(fo);  //新保存的文件更名为老文件
  12.         MsgObj.SetMsgByName("STATUS", "保存成功!");//设置状态信息
  13.         MsgObj.MsgError("");//清除错误信息
  14.       }
  15.       else{//如果是新建文档的情况,就没有老文件
  16.         f.renameTo(fo);  //新保存的文件更名为老文件
  17.         MsgObj.SetMsgByName("STATUS", "保存成功!");//设置状态信息
  18.         MsgObj.MsgError("");//清除错误信息
  19.       }                      
  20.     }else{
  21.       MsgObj.MsgError("保存失败!");//设置错误信息
  22.     }
  23.   }else{
  24.     MsgObj.MsgError("保存失败!");//设置错误信息
  25.   }                                                    
  26. }
  27. else {
  28.   MsgObj.MsgError("保存失败!");//设置错误信息
  29. }
复制代码
最后编辑陈湘凌 最后编辑于 2017-01-17 09:47:51
分享 转发
我的骄傲,是能和这么多优秀的同事们一起共事。大家一起工作、一起学习、一起努力,为我们的客户排忧解难、创造价值。
TOP
发新话题 回复该主题