0

アーカイブを解凍しようとすると、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)
4

0 に答える 0