为有中文需求的客户提供多渠道中文技术支持.

Mon Jun 27, 2022 3:44 am

项目里遇到这样的问题,用户在浏览器上传word文件,提交后后端保存到服务器硬盘上。word是用base64编码后传输的,正常保存会乱码,尝试用Spire的loadAndSaveToDisk方法,把base64转为二进制作为数据源,但貌似是不行的,应该怎么样才能实现这个功能?
Code: Select all
public class loadAndSaveToDisk {
//    public static void main(String[] args) {
      public void SaveBase64ToDisk(String base64FileData) throws IOException {
          System.out.println("base64文件编码:"+base64FileData);
        // Base64解码
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] byteArr = decoder.decodeBuffer(base64FileData);
        InputStream inputStream = new ByteArrayInputStream(byteArr);
        System.out.println("保存Word到本地");
//        String input = "data/Template.docx";
        //Create a new document
        Document doc = new Document();
        // Load the document fromdoc the absolute/relative path on disk.
//        doc.loadFromFile(input);
        doc.loadFromStream(inputStream,FileFormat.Doc);

        String result = "C:\\ecologyFileSave\\test\\test.doc";
        // Save the document to disk
        doc.saveToFile(result,FileFormat.Doc);
    }
}

bnuwangyumeng
 
Posts: 3
Joined: Mon Jun 27, 2022 3:38 am

Mon Jun 27, 2022 5:57 am

您好,

感谢您的咨询。

从您的代码来看,大致是没有问题的。我猜测可能的原因是您在使用 doc.loadFromStream(inputStream,FileFormat.Doc)方法时,对于第二个参数固定设置为了Doc类型。这代表您默认传入的文件数据是Doc格式。但我看您注释掉的input中,却是docx文件。因为这两个格式的文档结构并不一样,以流加载时您最好使用FileFormat.Auto来自动识别内容格式。因此您可以尝试下将此代码改为
Code: Select all
doc.loadFromStream(inputStream,FileFormat.Auto)


如果仍然无法解决您的问题,请您将此base64字符串分享给我们以便我们复现和调查您的问题。提前感谢您的协助。
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Mon Jun 27, 2022 7:36 am

Andy.Zhou wrote:您好,

感谢您的咨询。

从您的代码来看,大致是没有问题的。我猜测可能的原因是您在使用 doc.loadFromStream(inputStream,FileFormat.Doc)方法时,对于第二个参数固定设置为了Doc类型。这代表您默认传入的文件数据是Doc格式。但我看您注释掉的input中,却是docx文件。因为这两个格式的文档结构并不一样,以流加载时您最好使用FileFormat.Auto来自动识别内容格式。因此您可以尝试下将此代码改为
Code: Select all
doc.loadFromStream(inputStream,FileFormat.Auto)


如果仍然无法解决您的问题,请您将此base64字符串分享给我们以便我们复现和调查您的问题。提前感谢您的协助。

谢谢您的解答。我将文件格式改为了Auto,文件是保存到后端的硬盘上了,但内容是乱码,是否是编码的字符集要做一些处理?这应该是个常见的场景,请指导一下,前端上传的文件是“测试0627.doc”,后端保存下来的文件是"test4.doc",在附件中。目前的转换代码为:
Code: Select all
public void SaveBase64ToDisk(String base64FileData) throws IOException {
        // Base64解码
          byte[] byteArr = Base64.decodeBase64(base64FileData);
        InputStream inputStream = new ByteArrayInputStream(byteArr);
        //Create a new document
        Document doc = new Document();
        // Load the document fromdoc the absolute/relative path on disk.
        doc.loadFromStream(inputStream,FileFormat.Auto);

        String result = "C:\\ecologyFileSave\\test\\test4.doc";
        // Save the document to disk
        doc.saveToFile(result,FileFormat.Doc);
    }

bnuwangyumeng
 
Posts: 3
Joined: Mon Jun 27, 2022 3:38 am

Mon Jun 27, 2022 7:37 am

附件在这里

bnuwangyumeng
 
Posts: 3
Joined: Mon Jun 27, 2022 3:38 am

Mon Jun 27, 2022 8:17 am

您好,

我试了您的代码。但在Base64类中找不到您调用的方法decodeBase64。我这边使用的是java.util.Base64,不确定是否是此解码工具导致的问题。您那边尝试下用这个包下面的工具类进行解码呢。或者您直接打断点提取出前端传过来的base64字符串,然后写个简单测试项目用java.util.Base64和您目前使用的Base64类分别进行解码,看下是否结果有任何不同之处。方便的话,也可以将这个字符串发给我我这边也试试。
Sincerely,
Andy
E-iceblue support team
User avatar

Andy.Zhou
 
Posts: 483
Joined: Mon Mar 29, 2021 3:03 am

Return to 中文技术支持