PrimeFaces FileUpload错误与二进制文件

时间:2012-12-06 09:02:50

标签: jquery file-upload encoding primefaces

我正在使用 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但我不知道它如何适用于我的情况,因为我没有将内容存储到String中,我直接在{{ 1}}对象:

UploadedFile

那么,在我的案例中,BalusC发现的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; } 中的错误是导致此问题的原因,还是其他的?而且,最重要的是,我该怎么做才能避免这个错误?

1 个答案:

答案 0 :(得分:1)

起初我看过primefaces fileupload filter with utf8 characters filter并且我认为可能是这种情况,但在分析了PrimeFaces代码后,我发现这是完全不同的事情。

该错误实际上是在 PrimeFaces 中,但却被深深隐藏。问题是它们没有正确地转义它们嵌入XML响应中的文本。我的代码是将文件转换为String,可以进行编辑,然后发送给用户。由于上传的文件是二进制文件,而PrimeFaces使没有正确的转义,因此XML被破坏了。

因为在Java中实际上没有办法说String是正确的(没有解码错误!),我必须使用我在其他项目中看过几次的代码(至少不应该这样)被置于 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