为什么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下载文件相关推荐

  1. C++中利用WebService下载文件

    C#写的WebService读取文件到byte[]和读取文件内容到string,代码如下: [WebMethod] public byte[] dowloadFile() {     FileStre ...

  2. ps快捷图标在哪个文件夹_在PS中制作一个下载文件夹的图标

    在PS中制作一个下载文件夹的图标 出处:多特软件站  时间:2011-03-17  人气:1287我要提问我来说两句 核心提示:在这个教程里,我们将介绍到如何在PS中运用不同的形状和反射制作一个下载文 ...

  3. 在QT中采用多线程下载文件

    在QT中采用多线程下载文件 这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务 时,使用下载者是共享带宽的, ...

  4. 在IE中打开或下载文件

    在IE中打开或下载文件 response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8&q ...

  5. 自动从mysql下载文件到powerbi_关于在Power Query和Power BI中从网页下载文件的小提示...

    ​从网络下载数据时,通常最好是从专门为机器对机器通信而设计的API中获取数据,而不是从屏幕上实际可见的站点中获取数据.下载不仅通常更快,而且还常常获得更多非常有用的附加参数.在本文中,我将向您展示如何 ...

  6. Java GridFS MongoDB 下载文件 内容不完整

    参考MongoDB官方文档GridFS的部分下载文件. ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9"); tr ...

  7. KeyShot Pro 9 v9.0 安装教程(含下载文件)

    KeyShot Pro 9 v9.0安装教程 安装包下载: 链接:https://pan.baidu.com/s/1de3LeCF3NJEEoMGZzyDmBg 提取码:n3ra 安装步骤: 1.解压 ...

  8. 群晖Drive中钉钉下载文件缓存crdownload导致同步空文件的问题

    工作中使用群晖的Drive与同事同步文件. 发现同事在钉钉中收到的excel文件,在同事本地电脑上能正常打开,通过Drive同步到服务器上后,服务器上的该文件为用0填充的空文件,文件大小和正常文件一致 ...

  9. Windows 8中IE10无法下载文件的解决方法

    从Windows 7以升级的方式安装Windows 8后,发现使用IE10出现无法下载文件的问题.点击网页的中下载链接IE10没有任何反应. 然后单击界面右上角的"工具"--&qu ...

最新文章

  1. vue 前端框架 (三)
  2. javascript如何判断变量的数据类型
  3. springmvc二十:数据绑定
  4. Storm概念学习系列之storm-starter项目(完整版)(博主推荐)
  5. JMeter性能测试,完整入门篇(自己做测试了)
  6. Spring Boot JPA 中transaction的使用
  7. 如何找到ngrx action匹配的取数据代码 - 谈谈Spartacus Product Carousel控件数据的读取
  8. cordova 更改app版本_Cordova打包Android应用流程(MAC)
  9. js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%
  10. LeapFTP 注册码
  11. python ppt自动生成_如何自动化生成PPT缩略图?
  12. Spring Data MongoDB示例
  13. bootstrap文件不能被识别_Spring Boot 配置文件 bootstrap / application 到底有什么区别?...
  14. 看不懂旷视升级,是因为不知道中国AI正在经历的变革
  15. translclude
  16. 【其他】使win7尽量少占用C盘空间
  17. win32com 读doc,doc表格
  18. IEC104规约调试
  19. 谈谈成功,你离成功有多远?施瓦辛格励志演讲分享(配中文翻译)
  20. mysql的七种查询命令_MySQL数据库查询指令大全

热门文章

  1. 香奈儿J12陶瓷手表怎么分辨真伪
  2. 众多APP青睐邀请有礼活动,怎么才能更完善?
  3. 猪宝宝:不到万不得已别当程序员
  4. iOS APP打包上传审核和 客服咨询流程(审核被拒,账号问题等)
  5. jsp提供了的9个内置对象
  6. 显示Hello World
  7. 【C++引用超详细笔记, 引用、指针和值传递的汇编级辨析,对象、继承和引用】
  8. java多张图片合成
  9. 深力科电子/J30H10K 100A 30V 电动工具专用N沟道MOS管
  10. 【代码】PHP5 怎样制作图片验证码