这最初是另一个主题的第2部分,但另一个用途建议我将第2部分分成它自己的主题,所以我们走了。原始帖子在这里(Original Thread)
我正在使用Jackcess创建一个V2010 mdb文件,我需要将该文件传输到将使用Access 2013打开它的客户端。 Jackcess本身可行 - V2010创建了一个文件,当文件通过第三方软件(例如FAR)传输到客户端时,Access 2013可以打开该文件。但是,当我尝试通过servlet将此文件上传到客户端时(这是该项目的目标),客户端上的Access说"无法识别的数据库格式" ...文件名...& #34 ;.这是用于上传的代码。代码本身有效,文件被传输,如果它被保存则具有非零大小 - 但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行的大文件)
谢谢!
答案 0 :(得分:2)
你忘了填充缓冲区。 使用
// ...
while ((byteRead = fis.read(buffer)) != -1) {
os.write(buffer, 0, byteRead);
}
// ...