【发布时间】:2012-02-12 01:26:47
【问题描述】:
我必须从数据库中检索 LONGBLOB 字段中的二进制文件。该字段存储各种文件格式,例如 txt、doc、xdoc、pdf 等。我基本上需要能够将二进制格式转换为实际的文件格式,以便我的用户下载这些文件。
有没有人知道如何做到这一点?
【问题讨论】:
我必须从数据库中检索 LONGBLOB 字段中的二进制文件。该字段存储各种文件格式,例如 txt、doc、xdoc、pdf 等。我基本上需要能够将二进制格式转换为实际的文件格式,以便我的用户下载这些文件。
有没有人知道如何做到这一点?
【问题讨论】:
正如其他人所说,最好有另一个字段来存储格式。您可以通过复制扩展名(即文件名中最后一个“.”之后的所有内容)来做到这一点。最好的方法可能是获取文件的 mime 类型:see this for example。
然后,您可以将 mime 类型存储在数据库的字段中。这几乎总能奏效,而文件的扩展名可能会产生误导(或模糊)。
【讨论】:
添加一个file_format字段,表示LONGBLOB中存储的文件的文件格式,然后就可以根据相关的文件格式进行二进制转换了。
或者,保留文件格式的前几个字节,后面是文件的实际内容。
【讨论】:
我认为你应该有另一个字段来保存文档类型并告诉应该转换哪种类型。使用 I/O InputStream 读取/写入文件。
我建议将客户端文件上传到某个地方,将链接到这些文件的路径保存到数据库中。那应该更快。
【讨论】:
正如其他人所建议的那样。在数据库中创建另一列(FILETYPE_COL_NAME),它将告诉您在 BOLB(BLOB_COL_NAME) 字段中存储哪种类型的文件,然后在 try/catch 块中扩展以下代码
String fileType = rs.getString("FILETYPE_COL_NAME");
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("filepath."+fileType )));
ResultSet rs = statement.executeQuery("Select * from tablename");
BufferedInputStream bis = new BufferedInputStream(rs.getBinaryStream("BLOB_COL_NAME"));
byte[] buffer = new byte[1024];
int byteread = 0;
while((byteread = bis.read(buffer)) != -1){
dos.write(buffer, 0, byteread);
}
dos.flush();
dos.close();
bis.close();
【讨论】: