访问 (.mdb) 在 servlet 写入客户端期间损坏的文件



这最初是另一个线程的第 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 行的大文件)

谢谢!

你忘了填充缓冲区。用

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

相关内容

  • 没有找到相关文章

最新更新