好久没有更新博客了,今天来再次总结一下,之前有整理过关于jersey实现文件上传功能的相关知识,但是前一阵子在实习过程中写接口又要实现文件下载的功能,由于这些东西基本都是使用jersey提供的注解和接口来实现的,因此,实现起来就是有种套模板的感觉,废话不多说,我们来看看是如何实现的吧。
第一步,实现resource接口(注意上面的注解声明的返回类型):
1 @POST
2 @Path("/export")
3 @Produces("application/x-msdownload")
4 public StreamingOutput exportIndicator(@HeaderParam("userId") int userId, EmotionDetailListPageModel emotionDetailListPageModel) {
5 //调用service实现业务
6 return CSVUtils.exportData(result); 7 }
其次,在CSVUtils里是返回的是什么内容呢?一下是该类所做的事情:将调用service得到的结果传入,返回一个实现了StreamingOutput接口的实例,实现该接口中的write方法,将java的对象写入流中,
注意在这里为了使得代码具有更好的扩展性,使用反射来获取对应对象中的数据。
1 public static StreamingOutput exportData(List<EmotionDetailListModel> list) {
2
3 return new StreamingOutput() {
4 @Override
5 public void write(OutputStream output) throws IOException, WebApplicationException {
6 Writer writer = null;
7 writer = new BufferedWriter(new OutputStreamWriter(output, "GB18030"));//GB18030
8 if (list.isEmpty()) {
9 throw new RuntimeException("没有要导出的数据");
10 }
11 // reflect to get file title
12 Field[] fAll = list.get(0).getClass().getDeclaredFields();
13 writer.write(generateTitle(fAll));
14 writer.write("\r\n");
15
16 for (EmotionDetailListModel emotionDetailListModel : list) {
17 try {
18 logger.info("write success" + parseModelToCSVStr(emotionDetailListModel));
19 writer.write(parseModelToCSVStr(emotionDetailListModel));
20 } catch (IllegalAccessException e) {
21 throw new RuntimeException("转换错误,错误信息:" + e);
22 }
23 writer.write("\r\n");
24 }
25 writer.flush();
26 }
27 };
28 }
我们可以看出,前端拿到的就是一个StreamOutput对象,当然,我们也可以将文件的名称和类型通过response传给前端,这样,下载的文件类型和名称都会是指定的名称。
1 httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"" + emotionDetailListPageModel.getGameid() + "." + "csv" + "\"");
2 httpServletResponse.setHeader("Content-Type", "text/csv; charset=utf-8");