2014-11-28 3 views
1

이것은 원래 다른 스레드의 파트 2 였지만 다른 사용법은 파트 2를 자체 항목으로 분리한다고 제안 했으므로 여기로갑니다. 원본 스레드가 있습니다 (Original Thread)서블릿을 클라이언트에 쓰는 동안 액세스 (.mdb) 파일이 손상되었습니다.

Jackcess를 사용하여 Access 2013을 사용하는 클라이언트로 전송해야하는 V2010 mdb 파일을 만듭니다. Jackcess 자체 작동 - V2010은 파일이 FAR과 같은 타사 소프트웨어에 의해 클라이언트에 FTP로 전송 될 때 Access 2013에서 열 수있는 파일을 만듭니다. 그러나이 파일을이 프로젝트의 목표와 같이 서블릿을 통해 클라이언트에 업로드하려고하면 클라이언트의 Access에서 "인식 할 수없는 데이터베이스 형식"... 파일 이름 ... "이라고 표시됩니다.이 코드는 사용 된 코드입니다 업로드 할 때 코드 자체가 작동하고 파일이 전송되었지만 크기가 저장되어 있으면 액세스 할 수 없습니다.

콘텐츠 유형에 대해 vnd.msassess와 octed-stream도 시도해 보았습니다. 결과는. 또한, 나는이 예제와 같이 DB를 폐쇄하고 파일 이름에서 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

원본 파일과 헥스 편집기로 손상된 하나보고보십시오. 이것은 파일이 잘린 (완전히 전송되지 않음) 경우, 내용이 완전히 잘못되었을 때 (엔드 포인트 중 하나에서 인코딩/디코딩이 잘못되거나 누락 된 경우), 또는 일부 바이트 (상위 바이트 일 수도 있음) 아스키 바이트 값, 추측)은 전송 중에 손상되었습니다. – cello

답변

2

버퍼를 채우는 것을 잊었습니다. 사용

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

나는 눈이 멀었다는 것을 믿을 수 없다. 그것은 실제로, 대답입니다. 밝은면에서 전송을 시도하면서 작동하는 zip 옵션을 추가했습니다. 다시 한 번 감사드립니다! – elanamig

관련 문제