我有一个文件作为字节 [] 链接到一个对象。该文件存储在 DB 中的 a 中Blob column type
,并通过@Lob
注解进行绑定。
问题是这个系统不管理文件类型(即:我上传了一个 pdf,但是当下载它时,它没有任何类型)
你能给我一个简单的方法来处理这类问题吗?
我的第一个想法是将类型存储在一个简单的varchar column
但我将如何更改 byte[] getter 上的流类型?
我假设您成功地将文件保存在数据库中。为了下载它并知道类型,您必须content-type
在HttpSessionResponse
对象内提供。
在JSF
中,您可以这样做:
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
response.reset();
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
之后,您必须将流传递给响应的OutputStream
.
如果您要上传不同类型的文件,最好将上传文档的确切类型存储在数据库中的某个位置。然后,对于您拥有的每种文档类型,您可以找到对应的content-type
(也称为MIME-type
或internet-media-type
)。
这是所有的列表MIME-types
。
恕我直言,您对 lob 内容使用单独的 mimeType 字段是正确的。因此,您可以在上传期间推断 mimetype 将其存储到您的 jpa 实体中。
在您的下载 servlet 中,您可以编写如下内容:
String mimetype = entity.getMimeType();
// sets response content type
if (mimetype == null) {
mimetype = "application/octet-stream";
}
response.setContentType(mimetype);
response.setContentLength((int)file.length());
String fileName = (new File(filePath)).getName();
// sets HTTP header
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");