读取BLOB字段会因为文件字段太大导致connect连接超时关闭而不能读全的情况的解决方案
方案一:
通过委托模式(类似这种),在Controller层的请求方法中实现事务层上的读取blob并转化成流
上代码:
控制层
/**
* BLOB下载
*/
@RequestMapping
public String downloadBlob(HttpServletRequest request,
final HttpServletResponse response, String param, String fileName)
throws Exception {
String[] params = param.split(";");
// 数据集ID
String dataset_id = params[0];
// 字段名
String columnName = params[1];
// 唯一键值
UniqueKey uk = UniqueKey.parseUniqueKey(params[2]);
if (fileName == null) {
// 文件名为空的时候以主键值作为文件名
fileName = uk.firstEntry().getValue().toString();
}
final String destFileName = fileName;
DataSetMeta dataSetMeta = datasetService
.retrieveDataSetMeta(dataset_id);
DBDataAccessorWithBlob accessor = new DBDataAccessorWithBlob(
dataSetMeta);
accessor.handleBlob(columnName, uk, new BlobHandler() {
// 处理BLOB对象,以流的形式写入response实现下载
public void handle(Blob blob) throws Exception {
InputStream inputStream = blob.getBinaryStream();
// 设置response类型、文件名、大小等。
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
String downLoad = new String(destFileName.getBytes("GBK"),
"ISO-8859-1");
response.setHeader("Content-disposition",
"attachment;filename=\"" + downLoad + &#