将来自Primefaces的UploadedFile中的Inputstream转换为String

时间:2018-03-10 23:15:16

标签: java hibernate primefaces inputstream

我试图将Primefaces UploadedFile中的InputStream保存到String中。 原因是,我无法弄清楚如何使用hibernate来保持输入流。

以下代码:

public String saveDocumentInDatabase(final UploadedFile pFile) throws IOException{
    InputStream inputStream = pFile.getInputstream();

    byte[] buffer = new byte[8192];
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1)
    {
        baos.write(buffer, 0, bytesRead);
    }
    byte[] tmp = baos.toByteArray();
    return new String(tmp, StandardCharsets.UTF_8);
}


public StreamedContent downloadUploadedFile(final JoinExam pJoinExam){
    assertNotNull(pJoinExam.getSavedDocument());

    String tmp = pJoinExam.getSavedDocument().trim();
    java.io.InputStream inputStream = null;
    try {
        inputStream = new ByteArrayInputStream(tmp.getBytes("UTF-8"));
    } catch (UnsupportedEncodingException ex) {
        ex.printStackTrace(System.err);
    }

    return new DefaultStreamedContent(inputStream, "application/pdf",
            "Protocol" + pJoinExam.getPruefling().getMatrNr()+ ".pdf");
}

在我的JoinExam中,我有以下属性。

@Lob
@Column
private String savedDocument;

我的注意事项是将uploadedFile的inputStream保存到我的字符串savedDocument中,该字符串应该“代表”我上传的文件。 当我想下载我的“上传文件”时,我想获取我的savedDocument字符串并将其转换回inputStream。 已实现的inputStream将用于创建DefaultStreamedContent 所以我可以使用primefaces <p:fileDownload /> -Tag。

下载文件

我的问题是,输入流在转换为String时似乎丢失了一些数据,或者String在转换回输入流时似乎丢失了一些数据。 当我下载文件并尝试打开它时,会弹出一个错误,说无法打开该文件。

感谢您的任何adivce

编辑:当我上传和下载.txt文件时,它可以正常工作,但它无法使用pdf-Files。

1 个答案:

答案 0 :(得分:1)

您确定可以将PDF内容存储到@Lob String字段吗? PDF是二进制文件,通常使用@Lob byte[]字段处理。错误地说无法打开文件意味着它已损坏。