企业应用中,文件管理是非常通用和重要的模块,功能包括文件上传、下载、文件管理(浏览、删除、权限等)等操作,本文针对Jersey框架实现文件的上传和下载。

Jersey文件特性

Jersey实现文件上传需要jersey-media-multipart库的支持,并且要在服务器启动类中注册MultiPartFeature。

特别注意:虽然jersey-media-multipart库依赖于mimepull,但在应用打包时并不会将mimepull打包到安装包中,需要显示引入。

<!--文件上传下载支持-->
<dependency><groupId>org.glassfish.jersey.media</groupId><artifactId>jersey-media-multipart</artifactId><version>${jersey2.version}</version>
</dependency>
<dependency><groupId>org.jvnet.mimepull</groupId><artifactId>mimepull</artifactId><version>1.9.5</version>
</dependency>

服务器启动类中,注册org.glassfish.jersey.media.multipart.MultiPartFeature类以开启文件特性。

//文件特性支持
sh.setInitParameter("jersey.config.server.provider.classnames","org.glassfish.jersey.media.multipart.MultiPartFeature");

文件上传

关键代码分析
(1)方法接收的参数类型是multipart/form-data,即包含文件的表单类型
@Consumes(MediaType.MULTIPART_FORM_DATA)
(2)接收客户端传输的输入流
@FormDataParam("file") InputStream inputStream
(3)接收客户端传输的输入流的元数据
@FormDataParam("file") FormDataContentDisposition disposition
完整代码

@Path("file")
public class FileRes {//文件存储路径private static final String FILE_PATH = "D:/file/upload/";//文件上传@Path("upload")@POST@Consumes(MediaType.MULTIPART_FORM_DATA)public Response upload(@FormDataParam("file") InputStream inputStream,@FormDataParam("file") FormDataContentDisposition disposition) {String fileName = UUID.randomUUID().toString();String originName;originName = disposition.getFileName();if (originName.contains("."))fileName = fileName +originName.substring(originName.lastIndexOf("."), originName.length());try {writeToFileServer(inputStream, fileName);return Response.ok(new FileMsg(fileName)).build();} catch (IOException e) {return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(new SimpleMsg(e.getMessage())).build();}}//将输入流写出到本地文件private String writeToFileServer(InputStream inputStream, String fileName) throws IOException {OutputStream outputStream = null;File file = new File(FILE_PATH);if (!file.exists())file.mkdirs();String qualifiedUploadFilePath = FILE_PATH + fileName;try {outputStream = new FileOutputStream(new File(qualifiedUploadFilePath));int read = 0;byte[] bytes = new byte[1024];while ((read = inputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, read);}outputStream.flush();} catch (IOException ioe) {ioe.printStackTrace();} finally {if (outputStream != null) outputStream.close();}return qualifiedUploadFilePath;}
}

文件下载

关键代码分析
(1)指定输出的媒体类型为OCTET_STREAM
@Produces(MediaType.APPLICATION_OCTET_STREAM)
(2)响应请求头
如果在浏览器中访问文件下载地址,如果设置的请求头为attachment; filename=,则浏览器会打开一个新窗格,并开启下载模式,如果是图片则会不友好,因为用户很多时候只是想查看图片,可以通过以下方式解决。
return Response.ok(file).header("Content-Type", "image/png").build();
完整代码

@Path("file")
public class FileRes {//文件存储路径private static final String FILE_PATH = "D:/file/upload/";@Path("download/{name}")@GET@Produces(MediaType.APPLICATION_OCTET_STREAM)public Response download(@PathParam("name") String name) {String fileName = FILE_PATH + name;File file = new File(fileName);if (!file.exists()) {return Response.status(Response.Status.NOT_FOUND).entity(new SimpleMsg("file not found")).build();}//为图片格式提供浏览模式//文件扩展名String ext = name.substring(name.lastIndexOf(".") + 1, name.length());if (StringUtils.equalsAnyIgnoreCase(ext, new String[]{"jpg", "jpeg", "png", "bmp", "gif"})) {return Response.ok(file).header("Content-Type", "image/png").build();}return Response.ok(file).header("Content-Disposition", "attachment; filename=" + fileName).build();}
}

测试

使用Postman提交文件上传请求,返回结果如图所示。

本地存储的文件如图所示。

完整代码参见:https://github.com/majxbear/jetty-rest

Jersey框架:文件上传下载相关推荐

  1. 闲来无事,探究一番若依框架文件上传下载实现原理

    前端部分 若依已经封装好了图片和文件上传组件,参照官方文档使用就行 1. 图片上传 <template><div class="component-upload-image ...

  2. 关于SpringMVC框架实现简单的文件上传下载(ssm)

    关于ssm框架整合文件的上传和下载. 首先来看单个附件的上传和下载: 1.首先创建一个用来测试的jsp文件上传下载的页面  代码如下 <%@ page language="java&q ...

  3. ASP.NET中常用的文件上传下载方法

    ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...

  4. android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...

    1.PlanA文件上传&下载的使用 PlanA架构集成第五篇,文件上传下载的使用,文件上传&下载在APP里面随处可见,发朋友圈要上传图片或者短视频,换个头像要上传选择的图片,offic ...

  5. 【SpringMVC笔记】拦截器 + 文件上传下载

    拦截器 + 文件上传下载 拦截器(interceptor) 自定义拦截器 验证用户是否登录 (认证用户) 没有拦截器 配置拦截器 文件的上传 文件输出流进行文件上传 file.Transto 进行文件 ...

  6. JSON+AJAX+ThreadLocal+文件上传下载

    文章目录 JSON和AJAX文档介绍 1. JSON介绍 1.1 JSON快速入门 1.2 JSON和字符串转换 1.2.1 JSON转字符串 1.2.2 字符串转JSON 1.2.3 JSON和字符 ...

  7. SB_5_瑞吉外卖_4_文件上传下载_菜品新增_菜品分页查询_菜品修改

    瑞吉外卖-Day04 课程内容 文件上传下载 菜品新增 菜品分页查询 菜品修改 1. 文件上传下载 1.1 上传介绍 1.1.1 概述 文件上传,也称为upload,是指将本地图片.视频.音频等文件上 ...

  8. 微信小程序开发之文件上传下载应用场景(附Demo源码)

    微信小程序开发之文件上传下载应用场景(附Demo源码),Demo为小相册应用,源码在附件中,本示例需要腾讯云支持. http://www.henkuai.com/forum.php?mod=viewt ...

  9. struts上传word和excel文件到oracle,Struts文件上传,下载,重传,预览

    [Struts2]☆★之文件上传,下载,重传,预览 今日群里一兄弟问我能否给一份struts文件上传下载的例子,因为自己项目比较紧所以想在网上找 些源码给他,但是纵观全网,写的都不是太全,这让新手使用 ...

最新文章

  1. Linux疑难杂症解决方案100篇(一)-静态链表全解析
  2. 【采用】【风险管理】(第三篇)风险管理报表体系
  3. mdadm,用命令做RAID
  4. winform关闭当前form_C#中WinForm程序退出方法技巧总结
  5. Java私有构造函数不能阻止继承
  6. 怎么让qt发声_第3部分:添加网络字体-让我们的单词发声
  7. Qt线程间通信-信号与槽通信
  8. 【Android综合编程】CH2EventBus
  9. 新手学电脑入门教程_3Dmax难学嘛?3Dmax到底好不好学
  10. Java速成课程建议
  11. Git 2.29.2 64位安装包
  12. 北京林业大学计算机复试难度,2015年北京林业大学考研复试经验
  13. 下载网页中的视频的两种方法
  14. python制作恶搞_Python:恶搞,将你朋友照片做成熊猫人表情包
  15. Hulu新剧 |《成瘾剂量》-- 揭开美国“神药”黑幕
  16. python是什么类型需要_python数据类型是什么
  17. python日历模块_Python calendar日历模块的说明
  18. Vue--nextTick--作用/用法/原理
  19. Python安装配置: python install python安装
  20. 大胆预测一波:23年软件测试行业的趋势及前景

热门文章

  1. 数字电视信号源编码的主要技术及标准
  2. 加入学校计算机竞赛班申请书,大学加入部门申请书
  3. 函数声明以及函数原型
  4. 细看国产数据库,从根上知道如何学习?
  5. VTK学习笔记(二十一)vtk裁剪求截面面积
  6. 联科首个开源项目启动!未来可期,诚邀加入!
  7. 大学计算机报项目,计算机工程学院资讯报(第14周5.27-5.31)
  8. 草根浙商20条经商法则:坚持看新闻联播居首位
  9. Cocos2d-x-Lua示例项目HelloLua
  10. 深圳市京华达物流有限公司荣获“跨境电商物流服务明星企业”