1

PrimeFacesFileUploadコンポーネントを使用して.propertiesファイルをサーバーに転送しています。ただし、拡張子がすべてではないので、何か他のものが投稿されたときの動作をテストしたいと思いました。サンプルのjarファイル(具体的にはapache commons codec)をアップロードしましたが、スタックトレースで例外が発生する可能性がある代わりに、ブラウザーの奇妙な動作に遭遇しました。ダイアログコンテンツが完全に折りたたまれ、利用できませんでした(IE)。

JavaScriptコンソールを開いたところ、より根本的なエラーが見つかりました。

FireFoxではjQueryエラーが発生しますが、ダイアログは折りたたまれません。

NS_ERROR_NOT_IMPLEMENTED: Component returned failure code: 0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOMLSProgressEvent.input]

ただし、 IE 9では、レンダリングエンジンからエラーが発生します。

XML5617: Ungültiges XML-Zeichen. 
form.xhtml, Zeile 3 Zeichen 3926

XML回答には、アップロードされたファイルのコンテンツが添付されるなど、バイナリコンテンツが含まれています。PrimeFacesのバグの可能性を検索すると、次のことがわかりました。utf8文字フィルターを使用したprimefaces fileuploadフィルターですが、コンテンツをStringに保存していないため、直接操作しているため、どのように適用できるかわかりません。UploadedFile物体:

public void onPropertyFileUpload(FileUploadEvent event) {
    log.info("onPropertyFileUpload");
    if (event.getFile() == null) {
        log.warn("Empty file!!!");
        return;
    }
    Properties props = new Properties();
    try {
        props.load(event.getFile().getInputstream());
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return;
    }

それで、MultipartRequest私の場合、BalusCによって発見されたバグがこの問題の原因ですか、それともこれは別のものですか?そして、最も重要なのは、このバグを回避するために何ができるでしょうか?

4

1 に答える 1

1

最初は、utf8文字フィルターを使用したprimefaces fileuploadフィルターを調べましたが、これが当てはまると思いましたが、PrimeFacesコードを分析した結果、これはまったく別のものであることがわかりました。

バグは実際にはPrimeFacesにありますが、深く隠されています。バグは、XML応答に埋め込んだテキストを正しくエスケープしないことです。私のコードはファイルを文字列に変換していました。文字列は編集に使用できるため、ユーザーに送信されました。アップロードされたファイルはバイナリであり、PrimeFacesは正しいエスケープを行わないため、XMLが壊れていました。

Javaでは文字列が正しい(デコードエラーがない!)と言う方法が実際にはないため、他のプロジェクトで数回見たコードを使用する必要があります(少なくとも入れてはいけません)。Apache commons-lang?)

/**
     * This method ensures that the output String has only
     * valid XML unicode characters as specified by the
     * XML 1.0 standard. For reference, please see
     * <a href="http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char">the
     * standard</a>. This method will return an empty
     * String if the input is null or empty.
     *
     * @param in The String whose non-valid characters we want to remove.
     * @return The in String, stripped of non-valid characters.
     */
    public String stripNonValidXMLCharacters(String in) {
        StringBuffer out = new StringBuffer(); // Used to hold the output.
        char current; // Used to reference the current character.

        if (in == null || ("".equals(in))) return ""; // vacancy test.
        for (int i = 0; i < in.length(); i++) {
            current = in.charAt(i); // NOTE: No IndexOutOfBoundsException caught here; it should not happen.
            if ((current == 0x9) ||
                (current == 0xA) ||
                (current == 0xD) ||
                ((current >= 0x20) && (current <= 0xD7FF)) ||
                ((current >= 0xE000) && (current <= 0xFFFD)) ||
                ((current >= 0x10000) && (current <= 0x10FFFF)))
                out.append(current);
        }
        return out.toString();
    }

ソリューションのソース:https ://kr.forums.oracle.com/forums/thread.jspa?threadID = 1625928

于 2012-12-11T16:14:57.130 に答える