8

ファイル拡張子が「epub」のzipドキュメントにフォルダーの内容を再帰的に追加するメソッドを作成しました。これは基本的にepubとは異なります。

アーカイブの最初のドキュメントには「mimetype」という名前を付ける必要があり、タイプはapplication / epub + zipで指定する必要があり、バイトオフセット38で開始する必要があります。オフセット38でアーカイブにmimetypeを追加する方法はありますか?

私が構築した方法はほぼ機能します。ほとんどの電子書籍リーダーが読み取れるePubを構築しますが、検証は行いません。EpubCheckはこのエラーを出します:

mimetype contains wrong type (application/epub+zip expected)

これは、元のテストepubには存在しない問題ですが、再構築されたepubには表示されます。そして、解凍/再解凍されたmimetypeファイルの内容が正しいことを再確認しました。

この方法は、ここに投稿するには多すぎます。しかし、これは私がmimetypeファイルをアーカイブに追加するために使用しているものです。

out = new ZipOutputStream(new FileOutputStream(outFilename));

FileInputStream in = new FileInputStream(mimeTypePath);
out.putNextEntry(new ZipEntry("mimetype"));

int len;
while ((len = in.read(buf)) > 0) {
   out.write(buf, 0, len);
}

out.closeEntry();
in.close();
out.close();
4

1 に答える 1

10

ウィキペディアのOpenContainerFormatの説明によるとファイルmimetypeはZIPファイルの最初のエントリであり、圧縮されていない必要があります。

mimetypeサンプルコードだけに基づくと、ファイルをSTORED(非圧縮で)指定する必要があるかどうかは明確ではありません。

以下は、「mimetypeに間違ったタイプが含まれています」というエラーを乗り越えたようです。

private void writeMimeType(ZipOutputStream zip) throws IOException {
    byte[] content = "application/epub+zip".getBytes("UTF-8");
    ZipEntry entry = new ZipEntry("mimetype");
    entry.setMethod(ZipEntry.STORED);
    entry.setSize(20);
    entry.setCompressedSize(20);
    entry.setCrc(0x2CAB616F); // pre-computed
    zip.putNextEntry(entry);
    zip.write(content);
    zip.closeEntry();
}

確認済み:、、、および行を削除するsetMethod()setSize()、から「mimetypeに間違ったタイプが含まれています」というエラーが発生します。setCompressedSize()setCrc()epubcheck

于 2011-08-15T08:55:55.620 に答える