Файл доступа (.mdb) поврежден во время записи сервлета клиенту

1

Первоначально это было частью второй темы, но другое использование предполагало, что я разделяю часть 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 строк)

Спасибо!

  • 0
    Попробуйте посмотреть исходный файл и поврежденный с помощью шестнадцатеричного редактора. Это может помочь вам выяснить, является ли файл только усеченным (не полностью переданным), полностью ли неверное содержимое (может быть плохое или отсутствует кодирование / декодирование в одной из конечных точек), или если только несколько байтов (возможно, верхний ASCII-байтовые значения, просто предположение) были повреждены во время передачи.
Теги:
servlets
outputstream
corrupt
jackcess

1 ответ

2
Лучший ответ

Вы забыли заполнить буфер. использование

// ...
while ((byteRead = fis.read(buffer)) != -1) {
       os.write(buffer, 0, byteRead);
 }
// ...
  • 0
    Я не могу поверить, что я был так слеп. Это действительно ответ. С другой стороны, пытаясь заставить перевод работать, я добавил опцию zip, которая также работает. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню