Jersey框架:文件上传下载
企业应用中,文件管理是非常通用和重要的模块,功能包括文件上传、下载、文件管理(浏览、删除、权限等)等操作,本文针对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. 图片上传 <template><div class="component-upload-image ...
- 关于SpringMVC框架实现简单的文件上传下载(ssm)
关于ssm框架整合文件的上传和下载. 首先来看单个附件的上传和下载: 1.首先创建一个用来测试的jsp文件上传下载的页面 代码如下 <%@ page language="java&q ...
- ASP.NET中常用的文件上传下载方法
ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...
- android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...
1.PlanA文件上传&下载的使用 PlanA架构集成第五篇,文件上传下载的使用,文件上传&下载在APP里面随处可见,发朋友圈要上传图片或者短视频,换个头像要上传选择的图片,offic ...
- 【SpringMVC笔记】拦截器 + 文件上传下载
拦截器 + 文件上传下载 拦截器(interceptor) 自定义拦截器 验证用户是否登录 (认证用户) 没有拦截器 配置拦截器 文件的上传 文件输出流进行文件上传 file.Transto 进行文件 ...
- 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和字符 ...
- SB_5_瑞吉外卖_4_文件上传下载_菜品新增_菜品分页查询_菜品修改
瑞吉外卖-Day04 课程内容 文件上传下载 菜品新增 菜品分页查询 菜品修改 1. 文件上传下载 1.1 上传介绍 1.1.1 概述 文件上传,也称为upload,是指将本地图片.视频.音频等文件上 ...
- 微信小程序开发之文件上传下载应用场景(附Demo源码)
微信小程序开发之文件上传下载应用场景(附Demo源码),Demo为小相册应用,源码在附件中,本示例需要腾讯云支持. http://www.henkuai.com/forum.php?mod=viewt ...
- struts上传word和excel文件到oracle,Struts文件上传,下载,重传,预览
[Struts2]☆★之文件上传,下载,重传,预览 今日群里一兄弟问我能否给一份struts文件上传下载的例子,因为自己项目比较紧所以想在网上找 些源码给他,但是纵观全网,写的都不是太全,这让新手使用 ...
最新文章
- Linux疑难杂症解决方案100篇(一)-静态链表全解析
- 【采用】【风险管理】(第三篇)风险管理报表体系
- mdadm,用命令做RAID
- winform关闭当前form_C#中WinForm程序退出方法技巧总结
- Java私有构造函数不能阻止继承
- 怎么让qt发声_第3部分:添加网络字体-让我们的单词发声
- Qt线程间通信-信号与槽通信
- 【Android综合编程】CH2EventBus
- 新手学电脑入门教程_3Dmax难学嘛?3Dmax到底好不好学
- Java速成课程建议
- Git 2.29.2 64位安装包
- 北京林业大学计算机复试难度,2015年北京林业大学考研复试经验
- 下载网页中的视频的两种方法
- python制作恶搞_Python:恶搞,将你朋友照片做成熊猫人表情包
- Hulu新剧 |《成瘾剂量》-- 揭开美国“神药”黑幕
- python是什么类型需要_python数据类型是什么
- python日历模块_Python calendar日历模块的说明
- Vue--nextTick--作用/用法/原理
- Python安装配置: python install python安装
- 大胆预测一波:23年软件测试行业的趋势及前景