关于ntko从后台传输文档时发生文件存取错误,暨关于response使用的注意点

本文介绍了解决NTKO编辑器中文件存取错误的问题,通过调整response的设置,包括Content-Disposition和Content-Type的顺序,最终实现了从后台接口获取二进制文档流的功能。

实现目的,主要是将 ntko editoffice.jsp intializePage(url) 下的url改成从本地地址,改成可以返回二进制文档流的后台接口地址。

令人奇怪的是不管怎么弄,ntko总是会跳出文件存取错误的窗口,数据流postman看过了没问题,路径后台显示已经访问成功了。

 

解决方案:

response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));

添加这行,代码设置response编码格式。按理说,问题就应该解决了,但我这一行代码写在了response.getOutputStream后面了,结果出现和正确代码相似99%,但问题依然在的情况。

后来发现,response光有.addHeader("Content-Disposition")还不行,还需要写在response.setContentType()前面,写在后面就会出错。那个如果是要写在后面的话是用.setHeader可以通过,原因应该是response.setContentType方法同时已经设置了header了,需要用setHeader来覆盖。这个坑有点深,我半天爬不出来。

最后代码:

控制器部分:

public void getWord (String fileNameDisk, HttpServletResponse response){
        try{
            System.out.println(fileNameDisk);
            System.out.println("=============生成word数据=================");
            byte[] data=service1.getWordBytes(fileNameDisk);
            System.out.println("=============添加到response===============");
            response.addHeader("Content-Disposition","attachment;filename="+new String(fileNameDisk.getBytes()));//这个很重要不加会出错
            response.addHeader("Content-Length",""+data.length);//这个要放在前面
            response.setContentType("multipart/form-data");
            OutputStream out=new BufferedOutputStream(response.getOutputStream());
                out.write(data);
                out.flush();
                out.close();
//            response.setCharacterEncoding("utf-8");
//            response.setContentType("application/msword;charset=UTF-8");
//            String header="attachment;filename="+fileNameDisk;
//            response.addHeader("content-disposition",header);

        }catch(IOException e){
            e.printStackTrace();
        }
    }

sevice部分

public byte[] getWordBytes(String fileNameDisk) throws IOException{
        String url=FilePathInfo.absoluteOfficeFileDir+fileNameDisk;
        File f=new File(url);
       // byte[]result=new byte[(int) f.length()];
        FileInputStream fis=new FileInputStream(url);
        InputStream is=new BufferedInputStream(fis);
        byte[]result=new byte[is.available()];
        is.read(result);//用fis 和 is结果似乎差不多
        is.close();
        return result;
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值