0

Chromeで動作する署名付きファイルアップローダーアプレットがありますが、IEで実行するとハングするようです。IEでは、ファイル(またはファイルのセット)を一度は正常にアップロードできますが、次に別のファイルをアップロードしようとすると、ブラウザーがフリーズし、ブラウザーを閉じる必要があります。HttpUrlConnectionオブジェクトの出力ストリームを取得しようとすると発生しているようです。これが私のコードです:

public void upload(URL url, URL returnUrl, List<FileIconPanel> files) {
    HttpURLConnection conn = null;

    try {
        conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setChunkedStreamingMode(1024);
        HttpURLConnection.setFollowRedirects(false);
        conn.setRequestProperty("content-type", "application/zip");
        conn.setRequestMethod("POST");

        //This zip output stream will server as our stream to the server and will zip each file while 
        // it sends it to the server.
        ZipOutputStream out = new ZipOutputStream(conn.getOutputStream());
        for (int i = 0; i < files.size(); i++) {
            //For each file we will create a new entry in the ZIP archive and stream the file into that entry.

            File f = (File) files.get(i).getFile();
            ZipEntry entry = new ZipEntry(f.getName());
            out.putNextEntry(entry);
            InputStream in = new FileInputStream(f);
            int read;
            byte[] buf = new byte[1024];

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

            out.closeEntry();
        }

        //Once we are done writing out our stream we will finish building the archive and close the stream.
        out.finish();
        out.close();

        // Now that we have set all the connection parameters and prepared all
        //  the data we are ready to connect to the server.
        conn.connect();

        // read & parse the response
        InputStream is = conn.getInputStream();
        StringBuilder response = new StringBuilder();
        byte[] respBuffer = new byte[4096];
        while (is.read(respBuffer) >= 0) {
            response.append(new String(respBuffer).trim());
        }
        is.close();
    } catch (IOException ioE) {
        ioE.printStackTrace();
        logger.info("An unexpected exception has occurred. Contact your system administrator");
    } catch (Exception e) {
        e.printStackTrace();
        logger.info("An unexpected exception has occurred. Contact your system administrator");
    } finally {
        //Once we are done we want to make sure to disconnect from the server.
        if (conn != null) conn.disconnect();
    }
}

ログファイルで、次の行がフリーズしていることがわかります。

ZipOutputStream out = new ZipOutputStream(conn.getOutputStream());

2回目にファイルをアップロードしようとしました。このコードは、Java 6のIEでも機能します。最新のコードに更新してから、この問題が発生しました。

アプレットを再度使用する前に必ず閉じておく必要がある、開いたままにしているものはありますか?過去2日間、これに対して頭を殴っています。誰かが助けてくれることを願っています...

4

1 に答える 1

0

何が起こっているのかはわかりますが、問題の原因の詳細は正確にはわかりません。少なくとも回避策を見つけました...アプレットを表示するためにjqueryダイアログボックスを使用していました。私はその場でこれを行っていたので、ダイアログボックスを開くたびに、アプレットが再度構築されていました。ダイアログボックスが閉じられるたびにアプレットを含む div 要素を実際に削除していたので、奇妙なことに、古いアプレットインスタンスも確実に破棄されると考えていました。Chrome は、それを破棄して新しいもの (またはそのようなもの) を作成するのに十分賢いようですが、IE には問題があります。

于 2012-12-26T17:10:50.037 に答える