1

我正在使用PrimeFaces FileUpload组件将.properties文件传输到服务器。然而,扩展并不是一切,所以我想测试发布其他内容时的行为。我已经上传了示例 jar 文件(具体来说是 apache commons 编解码器),但是我遇到了浏览器的奇怪行为,而不是堆栈跟踪中可能出现的异常:对话框内容完全折叠并且不可用(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 错误我发现了以下内容:primefaces fileupload filter with utf8 characters filter但我不知道它如何适用于我的情况,因为我没有将内容存储到字符串中,我直接在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 文件上传过滤器,我认为可能是这种情况,但在分析了 PrimeFaces 代码后,我发现这是完全不同的东西。

该错误实际上在PrimeFaces中,但被深深地隐藏了。错误在于它们没有正确转义嵌入在 XML 响应中的文本。我的代码将文件转换为可用于编辑并因此发送给用户的字符串。因为上传的文件是二进制文件,并且 PrimeFaces没有正确转义,所以 XML 被破坏了。

因为在Java中实际上没有办法说字符串是正确的(没有解码错误!),我不得不使用我在其他项目中见过几次的代码(至少不应该把它放入阿帕奇公共语言?)

/**
     * 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 回答