1

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

我正在使用 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 行的大文件)

谢谢!

4

1 回答 1

2

你忘了填充缓冲区。利用

// ...
while ((byteRead = fis.read(buffer)) != -1) {
       os.write(buffer, 0, byteRead);
 }
// ...
于 2014-11-28T21:38:13.627 回答