ZK7.0.3中从MongoDB下载文件
为什么80%的码农都做不了架构师?>>>
问题
在完成Spring从MongoDB中下载文件之GridFS之后,现在需要在ZK7.0.3的ViewModel中下载该文件。
思路
先从MongoDB获取到OutputStream
,以及把OutputStream
转化为ZK的Filedownload能够使用的InputStream
进行文件下载。
实现
导入Filedownload
import org.zkoss.zul.Filedownload;
ViewModel
String fileId = "5602de6e5d8bba0d6f2e45e4";
// 从Mongod中查找出一个文件,注意这里返回为com.mongodb.client.gridfs.model.GridFSFile类
GridFSFile gridFsdbFile = operations.findOne(new Query(Criteria.where("_id").is(fileId)));
if (gridFsdbFile != null) {// mongo-java-driver3.x以上的版本就变成了这种方式获取GridFSBucket bucket = GridFSBuckets.create(mongoDbFactory.getDb());ByteArrayOutputStream baos = new ByteArrayOutputStream();// 获取Mongodb中文件的缓存输出流bucket.downloadToStream(gridFsdbFile.getId(), baos);Document meteData = gridFsdbFile.getMetadata();// 将OutputStream缓存流转化为InputStream缓存流使用ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());// 下载文件if(meteData != null) {Filedownload.save(bais, meteData.get("contentType").toString(), gridFsdbFile.getFilename());} else {Filedownload.save(bais, null, gridFsdbFile.getFilename());}
}
**Note:**这里主要的问题其实转化为Java的流转化了。JavaOutputStream流转化InputStream流方式很多,主要三种:
- 使用缓存流转化
- 使用管道流转化
- 使用循环缓存流转化
缓存流:
ByteArrayOutputStream out = new ByteArrayOutputStream();
class1.putDataOnOutputStream(out);
class2.processDataFromInputStream(new ByteArrayInputStream(out.toByteArray())
);
管道流
PipedInputStream in = new PipedInputStream();
PipedOUtputStream out = new PipedOutputStream(in);
new Thread(new Runnable(){public void run(){class1.putDataOnOutputStream(out);}}
).start();
class2.processDataFromInputStream(in);
循环流
// 多线程方式
CircularByteBuffer cbb = new CircularByteBuffer();
new Thread(new Runnable(){public void run(){class1.putDataOnOutputStream(cbb.getOutputStream());}}
).start();
class2.processDataFromInputStream(cbb.getInputStream());
// 单线程方式
// buffer all data in a circular buffer of infinite size
CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.INFINITE_SIZE);
class1.putDataOnOutputStream(cbb.getOutputStream());
class2.processDataFromInputStream(cbb.getInputStream());
总结
主要是使用ZK的Filedownload进行文件下载,但是ZK的Filedownload需要InputStream支持,所以,就涉及到了OutputStream转InputStream操作。
参考: Convert a Java OutputStream to an InputStream Class Filedownload
转载于:https://my.oschina.net/fxtxz2/blog/1828917
ZK7.0.3中从MongoDB下载文件相关推荐
- C++中利用WebService下载文件
C#写的WebService读取文件到byte[]和读取文件内容到string,代码如下: [WebMethod] public byte[] dowloadFile() { FileStre ...
- ps快捷图标在哪个文件夹_在PS中制作一个下载文件夹的图标
在PS中制作一个下载文件夹的图标 出处:多特软件站 时间:2011-03-17 人气:1287我要提问我来说两句 核心提示:在这个教程里,我们将介绍到如何在PS中运用不同的形状和反射制作一个下载文 ...
- 在QT中采用多线程下载文件
在QT中采用多线程下载文件 这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的, ...
- 在IE中打开或下载文件
在IE中打开或下载文件 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8&q ...
- 自动从mysql下载文件到powerbi_关于在Power Query和Power BI中从网页下载文件的小提示...
从网络下载数据时,通常最好是从专门为机器对机器通信而设计的API中获取数据,而不是从屏幕上实际可见的站点中获取数据.下载不仅通常更快,而且还常常获得更多非常有用的附加参数.在本文中,我将向您展示如何 ...
- Java GridFS MongoDB 下载文件 内容不完整
参考MongoDB官方文档GridFS的部分下载文件. ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9"); tr ...
- KeyShot Pro 9 v9.0 安装教程(含下载文件)
KeyShot Pro 9 v9.0安装教程 安装包下载: 链接:https://pan.baidu.com/s/1de3LeCF3NJEEoMGZzyDmBg 提取码:n3ra 安装步骤: 1.解压 ...
- 群晖Drive中钉钉下载文件缓存crdownload导致同步空文件的问题
工作中使用群晖的Drive与同事同步文件. 发现同事在钉钉中收到的excel文件,在同事本地电脑上能正常打开,通过Drive同步到服务器上后,服务器上的该文件为用0填充的空文件,文件大小和正常文件一致 ...
- Windows 8中IE10无法下载文件的解决方法
从Windows 7以升级的方式安装Windows 8后,发现使用IE10出现无法下载文件的问题.点击网页的中下载链接IE10没有任何反应. 然后单击界面右上角的"工具"--&qu ...
最新文章
- vue 前端框架 (三)
- javascript如何判断变量的数据类型
- springmvc二十:数据绑定
- Storm概念学习系列之storm-starter项目(完整版)(博主推荐)
- JMeter性能测试,完整入门篇(自己做测试了)
- Spring Boot JPA 中transaction的使用
- 如何找到ngrx action匹配的取数据代码 - 谈谈Spartacus Product Carousel控件数据的读取
- cordova 更改app版本_Cordova打包Android应用流程(MAC)
- js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%
- LeapFTP 注册码
- python ppt自动生成_如何自动化生成PPT缩略图?
- Spring Data MongoDB示例
- bootstrap文件不能被识别_Spring Boot 配置文件 bootstrap / application 到底有什么区别?...
- 看不懂旷视升级,是因为不知道中国AI正在经历的变革
- translclude
- 【其他】使win7尽量少占用C盘空间
- win32com 读doc,doc表格
- IEC104规约调试
- 谈谈成功,你离成功有多远?施瓦辛格励志演讲分享(配中文翻译)
- mysql的七种查询命令_MySQL数据库查询指令大全