1

これはもともと別のスレッドのパート 2 でしたが、別の使用法から、パート 2 を別のトピックに分けることが提案されたので、ここで説明します。元スレはこちら (元スレ)

Jackcess を使用して、Access 2013 を使用して開くクライアントに転送する必要がある V2010 mdb ファイルを作成しています。Jackcess 自体は機能します。V2010 は、ファイルが FAR などのサードパーティ ソフトウェアによってクライアントに FTP 送信されたときに、Access 2013 が開くことができるファイルを作成します。ただし、サーブレットを介してこのファイルをクライアントにアップロードしようとすると (このプロジェクトの目標と同様)、クライアントの Access は「認識されないデータベース形式 "...ファイル名..." と表示されます。これは使用されるコードです。アップロード用コード自体は機能し、ファイルは転送され、保存されている場合はサイズがゼロではありませんが、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 行の巨大なファイルを試しました)。

ありがとうございました!

4

1 に答える 1

2

バッファを埋めるのを忘れました。使用する

// ...
while ((byteRead = fis.read(buffer)) != -1) {
       os.write(buffer, 0, byteRead);
 }
// ...
于 2014-11-28T21:38:13.627 に答える