アーカイブを解凍しようとすると、Java で奇妙なエラー メッセージが表示されます。奇妙なことに、まったく同じファイルを使用して 2 つの異なるサーバーでまったく同じコードを実行していて、1 つのサーバーが例外をスローし、もう 1 つのサーバーが期待どおりに動作していることです。
基本的に、zip ファイルの要求を PHP サーバーに送信する Java アプレットがあります。2 つのサーバーの違いの 1 つは、稼働中のサーバーは PHP 5.2 を実行し、壊れたサーバーは PHP 5.3 を実行することです。PHP 5.3 が ZIP ファイルを適切に送信しないのか、それとも何か...
zipファイルについては、あまり詳しくありません。したがって、どんな助けも非常に高く評価されます。
zip ファイルは 1 つの Java クラス (DownloadZipFile.java) でダウンロードされ、別のクラス (UnzipFiles.java) で解凍されます。この 2 つはコマンド ライブラリの Apache チェーンを介してリンクされます。また、Apache HTTPClient および HTTPCore ライブラリを使用して、実際の HTTP 要求を作成し、HTTP 応答をアンパックしています。
ファイルを取得して後で抽出するコードは次のとおりです。
// DownloadZipFile.java
/*
* (2) The HTTP response should be the (zip) file that we're requesting.
*/
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity( );
entityLength = entity.getContentLength( );
if(entityLength == 0) {
throw new org.apache.http.ConnectionClosedException("Disconnected! " +
"Please check your internet connection and try again.");
}
/*
* We want to copy the HTTP response (i.e., the file from the server) into a temporary
* file on the local machine.
*
* (a) ...so, first create a temporary file on the local machine.
*/
try {
zipFile = File.createTempFile("if_", ".zip", new File(System.getProperty("java.io.tmpdir")));
zipFile.deleteOnExit( );
}
catch(IOException e) { /* ... */ }
/*
* (b) Get an InputStream from the HTTP response and get an OutputStream to the temporary
* file we just created.
*/
if(entity != null) {
InputStream responsein = entity.getContent( );
OutputStream responseout = new FileOutputStream(zipFile);
}
if(!httppost.isAborted( )) {
/*
* (c) Copy the contents of the InputStream to the OutputStream.
*/
try {
IOUtils.copy(responsein, responseout);
}
catch(IOException e) { ... }
context.setZipFile(zipFile);
/* ... */
// UnzipFiles.java
public class UnzipFiles implements Command {
public final String UPDATE_PATH = "php/record_download.php?PHPSESSID=";
/* (non-Javadoc)
* @see org.apache.commons.chain.Command#execute(org.apache.commons.chain.Context)
*/
public boolean execute(Context ctx) throws Exception {
/*
* (1) We need to wrap a ZipFile object around the file we downloaded, or else we won't be able
* to unzip it.
*/
ZipFile zipFile = new ZipFile(context.getZipFile( )); // throws an exception
...
エラーは次のとおりです。
java.util.zip.ZipException: archive is not a ZIP archive
at org.apache.commons.compress.archivers.zip.ZipFile.positionAtCentralDirectory32(ZipFile.java:716)
at org.apache.commons.compress.archivers.zip.ZipFile.positionAtCentralDirectory(ZipFile.java:671)
at org.apache.commons.compress.archivers.zip.ZipFile.populateFromCentralDirectory(ZipFile.java:405)
at org.apache.commons.compress.archivers.zip.ZipFile.<init>(ZipFile.java:205)
at org.apache.commons.compress.archivers.zip.ZipFile.<init>(ZipFile.java:181)
at org.apache.commons.compress.archivers.zip.ZipFile.<init>(ZipFile.java:142)
at com.kenjackson.UnzipFiles.execute(UnzipFiles.java:45)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
at com.kenjackson.IFApplet$1.doInBackground(IFApplet.java:78)
at com.kenjackson.IFApplet$1.doInBackground(IFApplet.java:1)
at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at javax.swing.SwingWorker.run(SwingWorker.java:335)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)