好久没有更新博客了,今天来再次总结一下,之前有整理过关于jersey实现文件上传功能的相关知识,但是前一阵子在实习过程中写接口又要实现文件下载的功能,由于这些东西基本都是使用jersey提供的注解和接口来实现的,因此,实现起来就是有种套模板的感觉,废话不多说,我们来看看是如何实现的吧。

第一步,实现resource接口(注意上面的注解声明的返回类型):

     @POST
@Path("/export")
@Produces("application/x-msdownload")
public StreamingOutput exportIndicator(@HeaderParam("userId") int userId, EmotionDetailListPageModel emotionDetailListPageModel) {
//调用service实现业务
return CSVUtils.exportData(result); 7 }

其次,在CSVUtils里是返回的是什么内容呢?一下是该类所做的事情:将调用service得到的结果传入,返回一个实现了StreamingOutput接口的实例,实现该接口中的write方法,将java的对象写入流中,

注意在这里为了使得代码具有更好的扩展性,使用反射来获取对应对象中的数据。

  public static StreamingOutput exportData(List<EmotionDetailListModel> list) {

         return new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
Writer writer = null;
writer = new BufferedWriter(new OutputStreamWriter(output, "GB18030"));//GB18030
if (list.isEmpty()) {
throw new RuntimeException("没有要导出的数据");
}
// reflect to get file title
Field[] fAll = list.get(0).getClass().getDeclaredFields();
writer.write(generateTitle(fAll));
writer.write("\r\n"); for (EmotionDetailListModel emotionDetailListModel : list) {
try {
logger.info("write success" + parseModelToCSVStr(emotionDetailListModel));
writer.write(parseModelToCSVStr(emotionDetailListModel));
} catch (IllegalAccessException e) {
throw new RuntimeException("转换错误,错误信息:" + e);
}
writer.write("\r\n");
}
writer.flush();
}
};
}

我们可以看出,前端拿到的就是一个StreamOutput对象,当然,我们也可以将文件的名称和类型通过response传给前端,这样,下载的文件类型和名称都会是指定的名称。

   httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"" + emotionDetailListPageModel.getGameid() + "." + "csv" + "\"");
httpServletResponse.setHeader("Content-Type", "text/csv; charset=utf-8");

jersey实现文件下载的更多相关文章

  1. Jersey RESTful WebService框架学习(八)文件下载防乱码

    最近在做下载时候  不同浏览器下载的文件一直出现乱码,不知道怎么设置文件的编码,百度许久,找到一个解决办法如下 /** * 文件下载 * @param request * @return */ @GE ...

  2. ImageNet2017文件下载

    ImageNet2017文件下载 文件说明 imagenet_object_localization.tar.gz包含训练集和验证集的图像数据和地面实况,以及测试集的图像数据. 图像注释以PASCAL ...

  3. Android 浏览器 —— 使用 WebView 实现文件下载

    对当前的WebView设置下载监听 mCurrentWebView.setDownloadListener(new DownloadListener() { @Override public void ...

  4. C# 文件下载 : WinINet

    在 C# 中,除了 WebClient 我们还可以使用一组 WindowsAPI 来完成下载任务.这就是 Windows Internet,简称 WinINet.本文通过一个 demo 来介绍 Win ...

  5. ASP.net MVC 文件下载的几种方法(欢迎讨论)

    在ASP.net MVC 中有几种下载文件的方法 前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不知道,但是还挺想了解的. 第一种:最简单的超链接方法,&l ...

  6. 让IIS7.0.0.0支持 .iso .7z .torrent .apk等文件下载的设置方法

    IIS默认支持哪些MIME类型呢,我们可以这样查看:打开IIS管理器(计算机--管理--服务和应用程序--Internet信息服务(IIS)管理器:或者Win+R,输入inetmgr,Enter),在 ...

  7. Android中使用AsyncTask实现文件下载以及进度更新提示

    Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...

  8. 利用Tomcat内置的servlet实现文件下载功能

    起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ...

  9. 多个文件下载打包生成zip格式下载

    这个多个文件下载生成zip格式必须先引用一个ICSharpCode.SharpZipLib.dll. 代码如下  //将多个文件打包成压缩文件zip格式下载         protected voi ...

随机推荐

  1. JDK8 指南(译)

    翻译自 java8-tutorial 新特性 Default Methods for Interfaces(接口的默认方法) Java 8 使我们能够通过使用 default 关键字将非抽象方法实现添 ...

  2. Python进阶---面向对象的程序设计思想

    Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...

  3. Python闭包

    1.概述 闭包是在其词法上下文中引用自由变量的函数. >>> def foo(): ... m=3 ... n=5 ... def bar(): ... a=4 ... return ...

  4. MySQL运维相关工具汇总(待补充)

    1.orztop查看show full processlist http://hidba.org/?p=841 2.orzdba查看系统状态信息 http://code.taobao.org/p/or ...

  5. CSharpGL(47)你好,Framebuffer!

    CSharpGL(47)你好,Framebuffer! Framebuffer对象(FBO)是一种复杂的OpenGL对象.使用自定义的framebuffer,可以实现离屏渲染,进而实现很多高级功能,例 ...

  6. 转载:Allegro实用技巧之模块复用

    http://bbs.ednchina.com/BLOG_ARTICLE_3031842.HTM?click_from=8800032437,9950148743,2016-01-04,EDNCOL, ...

  7. 如何实现 Service 伸缩?- 每天5分钟玩转 Docker 容器技术(97)

    上一节部署了只有一个副本的 Service,不过对于 web 服务,我们通常会运行多个实例.这样可以负载均衡,同时也能提供高可用. swarm 要实现这个目标非常简单,增加 service 的副本数就 ...

  8. 如何用while循环 输出一个九九乘法表

    方法一 i = 1 while i < 10: k = 1 while k <= i: print('%d*%d=%2d '% (i,k,i*k),end='') #end='' 表示不换 ...

  9. javascript执行机制

    文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的 ...

  10. 原型模式(Prototype)

    原型模式(Prototype) 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对 ...