用流的方式下载word文档,打开word文档后提示文件被损坏

时间:2022-05-22 06:20:10
点击一个连接时,我先用XWPFDocument 生成一个word,然后用流的方式下载该文档,提示该文件已被损坏。
但是单独去打开生成的word没有问题。

生成的word文档类似这种格式:
用流的方式下载word文档,打开word文档后提示文件被损坏

下载代码:
String filename = "";
            File file = new File(path);
            // 取得文件名。
            if (file != null) {
                filename = file.getName();
            }
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1);
            filename = "材料证明" + user.getCusId() + "." + ext;
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("UTF-8");
            String enFileName = URLEncoder.encode(filename, "utf-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + enFileName);
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-download");
            int len = 0;
            while ((len = fis.read(buffer)) > 0) {
                toClient.write(buffer, 0, len);
            }
            toClient.flush();
            toClient.close();

11 个解决方案

#1


1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看

#2


引用 楼主 FirstHelloWorld 的回复:
点击一个连接时,我先用XWPFDocument 生成一个word,然后用流的方式下载该文档,提示该文件已被损坏。
但是单独去打开生成的word没有问题。

生成的word文档类似这种格式:
用流的方式下载word文档,打开word文档后提示文件被损坏

下载代码:
String filename = "";
            File file = new File(path);
            // 取得文件名。
            if (file != null) {
                filename = file.getName();
            }
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1);
            filename = "材料证明" + user.getCusId() + "." + ext;
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("UTF-8");
            String enFileName = URLEncoder.encode(filename, "utf-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + enFileName);
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-download");
            int len = 0;
            while ((len = fis.read(buffer)) > 0) {
                toClient.write(buffer, 0, len);
            }
            toClient.flush();
            toClient.close();


是的两个文件的大小不一样,生成的比下载的小
我自己写的word文档下进行下载也是一样的效果

#3


引用 1 楼 shixitong 的回复:
1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

#4


那还是写入的不对
把这句byte[] buffer = new byte[fis.available()];
改为这样byte[] buffer = new byte[1024];试试

#5


引用 3 楼 FirstHelloWorld 的回复:
Quote: 引用 1 楼 shixitong 的回复:

1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

我以前用的就是   byte[] buffer = new byte[1024];试试 

是不是应该将文件一次性写入到流中?

#6


引用 5 楼 FirstHelloWorld 的回复:
Quote: 引用 3 楼 FirstHelloWorld 的回复:

Quote: 引用 1 楼 shixitong 的回复:

1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

我以前用的就是   byte[] buffer = new byte[1024];试试 

是不是应该将文件一次性写入到流中?

如果是byte[] buffer = new byte[1024]那么这样读的话,然后下面象你那样写的话,是分多次读和写的
如果是byte[] buffer = new byte[fis.available()];那么这个时候就可以一次性fis.read(buffer);读出来,然后写也是一次性写进去(toClient.write(buffer);)

#7


引用 6 楼 shixitong 的回复:
Quote: 引用 5 楼 FirstHelloWorld 的回复:

Quote: 引用 3 楼 FirstHelloWorld 的回复:

Quote: 引用 1 楼 shixitong 的回复:

1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

我以前用的就是   byte[] buffer = new byte[1024];试试 

是不是应该将文件一次性写入到流中?

如果是byte[] buffer = new byte[1024]那么这样读的话,然后下面象你那样写的话,是分多次读和写的
如果是byte[] buffer = new byte[fis.available()];那么这个时候就可以一次性fis.read(buffer);读出来,然后写也是一次性写进去(toClient.write(buffer);)


一次性读写也不行
问一下像这种问题一般是什么情况引起的。

#8


引用
一次性读写也不行
问一下像这种问题一般是什么情况引起的。

还是文件大小不一致?,按道理讲是没有问题的,我也特意本地测试了下,文件下载是正常的,要不把你能打开,但是下载不正常的word发给我,我本地下载看看

#9


引用 8 楼 shixitong 的回复:
引用
一次性读写也不行
问一下像这种问题一般是什么情况引起的。

还是文件大小不一致?,按道理讲是没有问题的,我也特意本地测试了下,文件下载是正常的,要不把你能打开,但是下载不正常的word发给我,我本地下载看看


还是相同的问题,另外我刚试了字符流读写的方式,也不行。
虽然现在还没解决,不过还是非常感谢!!
文件有办法发吗?csdn能上传文件?

#10


引用 9 楼 FirstHelloWorld 的回复:
Quote: 引用 8 楼 shixitong 的回复:

引用
一次性读写也不行
问一下像这种问题一般是什么情况引起的。

还是文件大小不一致?,按道理讲是没有问题的,我也特意本地测试了下,文件下载是正常的,要不把你能打开,但是下载不正常的word发给我,我本地下载看看


还是相同的问题,另外我刚试了字符流读写的方式,也不行。
虽然现在还没解决,不过还是非常感谢!!
文件有办法发吗?csdn能上传文件?


不客气,也没帮到你,你把你qq发个私信给我,我加你

#11


下载是没有问题的,问题出在生成word的方法上(XWPFDocument 生成一个word)。

#1


1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看

#2


引用 楼主 FirstHelloWorld 的回复:
点击一个连接时,我先用XWPFDocument 生成一个word,然后用流的方式下载该文档,提示该文件已被损坏。
但是单独去打开生成的word没有问题。

生成的word文档类似这种格式:
用流的方式下载word文档,打开word文档后提示文件被损坏

下载代码:
String filename = "";
            File file = new File(path);
            // 取得文件名。
            if (file != null) {
                filename = file.getName();
            }
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1);
            filename = "材料证明" + user.getCusId() + "." + ext;
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("UTF-8");
            String enFileName = URLEncoder.encode(filename, "utf-8");
            response.addHeader("Content-Disposition", "attachment;filename=" + enFileName);
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-download");
            int len = 0;
            while ((len = fis.read(buffer)) > 0) {
                toClient.write(buffer, 0, len);
            }
            toClient.flush();
            toClient.close();


是的两个文件的大小不一样,生成的比下载的小
我自己写的word文档下进行下载也是一样的效果

#3


引用 1 楼 shixitong 的回复:
1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

#4


那还是写入的不对
把这句byte[] buffer = new byte[fis.available()];
改为这样byte[] buffer = new byte[1024];试试

#5


引用 3 楼 FirstHelloWorld 的回复:
Quote: 引用 1 楼 shixitong 的回复:

1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

我以前用的就是   byte[] buffer = new byte[1024];试试 

是不是应该将文件一次性写入到流中?

#6


引用 5 楼 FirstHelloWorld 的回复:
Quote: 引用 3 楼 FirstHelloWorld 的回复:

Quote: 引用 1 楼 shixitong 的回复:

1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

我以前用的就是   byte[] buffer = new byte[1024];试试 

是不是应该将文件一次性写入到流中?

如果是byte[] buffer = new byte[1024]那么这样读的话,然后下面象你那样写的话,是分多次读和写的
如果是byte[] buffer = new byte[fis.available()];那么这个时候就可以一次性fis.read(buffer);读出来,然后写也是一次性写进去(toClient.write(buffer);)

#7


引用 6 楼 shixitong 的回复:
Quote: 引用 5 楼 FirstHelloWorld 的回复:

Quote: 引用 3 楼 FirstHelloWorld 的回复:

Quote: 引用 1 楼 shixitong 的回复:

1、比较下你下载下来的这个word和你原来的word大小是不是一样
2、你自己新建一个word,然后再下载看看


和你说的情况一样,请问这是什么问题

我以前用的就是   byte[] buffer = new byte[1024];试试 

是不是应该将文件一次性写入到流中?

如果是byte[] buffer = new byte[1024]那么这样读的话,然后下面象你那样写的话,是分多次读和写的
如果是byte[] buffer = new byte[fis.available()];那么这个时候就可以一次性fis.read(buffer);读出来,然后写也是一次性写进去(toClient.write(buffer);)


一次性读写也不行
问一下像这种问题一般是什么情况引起的。

#8


引用
一次性读写也不行
问一下像这种问题一般是什么情况引起的。

还是文件大小不一致?,按道理讲是没有问题的,我也特意本地测试了下,文件下载是正常的,要不把你能打开,但是下载不正常的word发给我,我本地下载看看

#9


引用 8 楼 shixitong 的回复:
引用
一次性读写也不行
问一下像这种问题一般是什么情况引起的。

还是文件大小不一致?,按道理讲是没有问题的,我也特意本地测试了下,文件下载是正常的,要不把你能打开,但是下载不正常的word发给我,我本地下载看看


还是相同的问题,另外我刚试了字符流读写的方式,也不行。
虽然现在还没解决,不过还是非常感谢!!
文件有办法发吗?csdn能上传文件?

#10


引用 9 楼 FirstHelloWorld 的回复:
Quote: 引用 8 楼 shixitong 的回复:

引用
一次性读写也不行
问一下像这种问题一般是什么情况引起的。

还是文件大小不一致?,按道理讲是没有问题的,我也特意本地测试了下,文件下载是正常的,要不把你能打开,但是下载不正常的word发给我,我本地下载看看


还是相同的问题,另外我刚试了字符流读写的方式,也不行。
虽然现在还没解决,不过还是非常感谢!!
文件有办法发吗?csdn能上传文件?


不客气,也没帮到你,你把你qq发个私信给我,我加你

#11


下载是没有问题的,问题出在生成word的方法上(XWPFDocument 生成一个word)。