0

我已将文件存储在我的数据库中(格式字节 [])以及文件的名称和格式。

现在我将我的 bytearray 转换为 InputStream。如何使用之前保存在数据库中的 InputStream 重新创建特定文件?例如,PDF 文档必须是 PDF 文档,而 txt 文件必须是 txt 文件。

我使用 jsf,这是我当前的代码:

Dto currentDto = //code to get the file from the database

final FacesContext facesContext = FacesContext.getCurrentInstance();
final ExternalContext externalContext = facesContext.getExternalContext();
final HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

InputStream inputStream = new ByteArrayInputStream(currentDto.getFileBytes());
OutputStream outputStream = response.getOutputStream();
4

1 回答 1

1

Content-Type在响应中设置标题。在将文件保存在数据库中期间,您应该确定文件的内容类型或至少确定原始文件扩展名。

假设您使用 Apache Commons IO 获取了上传文件的文件名,如下所示:

String filename = FilenameUtils.getName(uploadedFile.getName());

然后您可以按如下方式确定内容类型:

ServletContext servletContext = (ServletContext) externalContext.getContext();
String contentType = servletContext.getMimeType(filename);

将其与数据库中的文件内容一起保存,以便您可以在检索时执行以下操作:

byte[] content = currentDto.getFileBytes(); // Terrible classname, by the way.
String contentType = currentDto.getFileContentType();

最后将其发送到 HTTP 响应如下(无需将其按摩到InputStream):

response.setContentType(contentType);
response.setContentLength(content.length);
response.setHeader("Content-Disposition", "attachment");
response.getOutputStream().write(content);

或者,将文件名而不是内容类型保存在数据库中,并ServletContext#getMimeType()仅在流式传输文件下载期间执行:

response.setContentType(servletContext.getMimeType(filename));

文件名也可用于Content-Disposition标题,理智的网络浏览器(阅读:除 MSIE 之外的所有内容,它使用请求 URL 中的最后一个路径)将使用它作为另存为文件名。

response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

也可以看看:

于 2013-10-31T10:02:29.670 回答