java - Access (.mdb) 文件在 servlet 写入客户端期间损坏

标签 java servlets outputstream corrupt jackcess

这原本是另一个线程的第 2 部分,但另一种用途建议我将第 2 部分分成它自己的主题,所以我们开始吧。原始线程在这里(Original Thread)

我正在使用 Jackcess 创建一个 V2010 mdb 文件,我需要将该文件传输到将使用 Access 2013 打开它的客户端。 Jackcess 本身可以工作 - V2010 创建一个文件,当该文件通过第三方软件(例如 FAR)通过 FTP 传输到客户端时,Access 2013 可以打开该文件。但是,当我尝试通过 servlet 将此文件上传到客户端时(正如该项目的目标),客户端上的 Access 显示“无法识别的数据库格式“...文件名...”。这是使用的代码用于上传。代码本身可以工作,文件已传输,如果保存,则具有非零大小 - 但 Access 无法打开它。

注意,对于内容类型,我还尝试了 vnd.msassess 和 octed-stream,但结果相同。另外,我尝试关闭数据库并从文件名创建 FileInputStream,并且如示例中所示,尝试通过调用 mydb.getFile() 创建 FileInputStream。没有区别。

response.setContentType("application/vnd.ms-access");
String fileName = "SomeFileName.mdb"; 
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
Database mydb = generateMDBFile();
FileInputStream fis = new FileInputStream(mydb.getFile());
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
try {
     int byteRead = 0;
     while ((byteRead = fis.read()) != -1) {
           os.write(buffer, 0, byteRead);
     }
     os.flush();
 } catch (Exception excp) {
     excp.printStackTrace();
 } finally {
     os.close();
     fis.close();
 }

为什么此代码会损坏 mdb 文件?这种情况每次都会发生,无论大小如何(我尝试了一个 2 列/1 行的小文件,以及一个 40 列和 80000 行的巨大文件)

谢谢!

最佳答案

您忘记填充缓冲区。 使用

// ...
while ((byteRead = fis.read(buffer)) != -1) {
       os.write(buffer, 0, byteRead);
 }
// ...

关于java - Access (.mdb) 文件在 servlet 写入客户端期间损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27196153/

相关文章:

java - 当元素被 setKeepTogether(true) 分割时,如何在新页面附加文本 "Continuation of ..."

Java BufferedOutputStream 与 OutputStream

Java在Mac上,如evt.iscontroldown evt.iscommanddown 全部?

JavaFX + Hibernate(JPA) 持久化 + Derby DB

java - Tomcat - 将旧上下文根重定向到新上下文根

java - 我的 JSP 未使用 servlet 中的刷新 header 从数据库获取更新值

asp.net-mvc - 为什么此代码返回 "Specified method is not supported."

java - 单击按钮时,我的代码应该创建一个 .txt 文件 - 但事实并非如此。为什么?

java - 在maven项目中使用AspectJ注释: weaving is not working

java - 为什么在 Servlet 规范中公开了魔法属性?