Первоначально это было частью второй темы, но другое использование предполагало, что я разделяю часть 2 на свою собственную тему, поэтому мы идем. Оригинальная тема здесь (Оригинальная тема)
Я использую Jackcess для создания файла V2010 mdb, который мне нужно передать клиенту, который будет использовать Access 2013, чтобы открыть его. Сам Jackcess работает - V2010 создает файл, доступный для доступа к 2013 году, когда файл FTP'd передается клиенту сторонним программным обеспечением, таким как FAR. Однако, когда я пытаюсь загрузить этот файл клиенту через сервлет (как и цель этого проекта), Access на клиенте говорит "Unrecognized database format"... имя файла... ". Это код, используемый для загрузки. Сам код работает, файл передан, имеет ненулевой размер, если он сохранен, но Access не может его открыть.
Обратите внимание, что для типа контента я также пробовал vnd.msassess и octed-stream с такими же неудачными результатами. Кроме того, я попытался закрыть db и создать FileInputStream из имени файла, и, как в примере, попытался создать FileInputStream, вызвав mydb.getFile(). Нет разницы.
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? Это происходит каждый раз, независимо от размера (я пробовал крошечный файл с двумя столбцами /1 строкой и огромный файл с 40 столбцами и 80000 строк)
Спасибо!
Вы забыли заполнить буфер. использование
// ...
while ((byteRead = fis.read(buffer)) != -1) {
os.write(buffer, 0, byteRead);
}
// ...