一、文件上传

所需jar包

首先是commons-fileupload.jar包

其次是commons-IO.jar包

前者的使用依赖后者,两者缺一不可

实现

前台要求

在前台提交的form表单请求方式必须为:post,编码类型需设置为:multipart/form-data

后台实现


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
try {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart) {//判断前台请求form表单的编码类型是否为multipart/form-data
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);//解析请求,获取form表单所提交的每一项
for(FileItem item:items) {
if(!item.isFormField()) {//判断是否为普通form表单项,若不普通,则认为是文件,进行上传操作
String fileName = item.getName();//获取文件名
String path = "D:\\MyDevelope\\ServerFiles";//设置文件在服务器中的存储路径
File file = new File(path,fileName);
item.write(file);//将文件写入指定路径
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}

二、文件下载

文件上传所不同的是,文件下载不需要导包,但是他需要解决中文乱码问题

解决中文乱码

对于Firefox、opera、chrome,可以将content-Disposition消息头设置为:


response.addHeader("content-Disposition","attachment;filename==?UTF-8?B?"+new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))+"?=");

而对于edge,则需要将content-Disposition消息头设置为:


response.addHeader("content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));

获取客户端浏览器类型

可以使用


request.getHeader("User-Agent");

获取包含浏览器类型的消息头,接下来使用String的contains()方法即可判断客户端是否为某种类型

实现


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.addHeader("content-Type", "application/octet-stream");//设置下载的文件的MIME类型
String fileName = request.getParameter("fileName");
String path = "D:\\MyDevelope\\ServerFiles\\";//设置要下载的文件在服务器中的目录
/**
*解析浏览器类型,设置不同的“content-Disposition”消息头来解决中文乱码问题
*/
String agent = request.getHeader("User-Agent").toLowerCase();
String contentDisposition = "attachement;filename="+fileName;
System.out.println(agent);
if(agent.contains("edge")) {
System.out.println("edge");
contentDisposition = "attachment;filename="+URLEncoder.encode(fileName,"UTF-8");
}else if(agent.contains("firefox")||agent.contains("opr")||agent.contains("chrome")) {
contentDisposition = "attachment;filename==?UTF-8?B?"+new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))+"?=";
}
response.addHeader("content-Disposition",contentDisposition);
//InputStream in = getServletContext().getResourceAsStream(path+fileName);//此种方式只能下载项目根目录中的文件
/**
* 通过IO操作将文件输出给用户
*/
InputStream in = new FileInputStream(path+fileName);
ServletOutputStream out = response.getOutputStream();
byte[] bs = new byte[10];
int len = -1;
while((len=in.read(bs))!=-1) {
out.write(bs,0,bs.length);
}
out.close();
in.close();
}

Commons组件实现文件上传与下载的更多相关文章

  1. common-fileupload组件实现java文件上传和下载

    简介:文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...

  2. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  3. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  4. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  6. JavaWeb——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  8. Javaweb学习笔记——(二十二)——————文件上传、下载、Javamail

    文件上传概述      1.文件上传的作用          例如网络硬盘,就是用来上传下载文件的.          在网络浏览器中,时常需要上传照片 2.文件上传对页面的要求          上 ...

  9. JavaWeb学习 (二十八)————文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

随机推荐

  1. Jquery第一次考核

    1. 什么是JS JavaScript 缩写.一种计算机脚本语言 JavaScript是一种动态.弱类型.基于原型的语言,通过浏览器可以直接执行 2. JS三大组成部件 ECMAScript DOM ...

  2. FD limit (65535) too low for maxconn=65535/maxsock=131084.Please raise 'ulimit-n' to 131084 or more to avoid any trouble.

    在安装完Haproxy启动时报错,诸如:FD limit (65535) too low for maxconn=65535/maxsock=131084.Please raise 'ulimit-n ...

  3. 【Android】Failed to convert @drawable/picture into a drawable

    刚使用 eclipse 遇到了这个问题,图片的效果未显示出来,上网查找后发现这其实不算是问题:重启下工程或 eclipse 就行了. PS: 直接运行工程也可以,不影响效果.

  4. 七分钟理解什么是 KMP 算法

    本文是介绍 什么是 BF算法.KMP算法.BM算法 三部曲之一. KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程. 部分匹配表 .next数组 进行介绍,如果理解了这三 ...

  5. 微服务SpringCloud之Spring Cloud Config配置中心Git

    微服务以单个接口为颗粒度,一个接口可能就是一个项目,如果每个项目都包含一个配置文件,一个系统可能有几十或上百个小项目组成,那配置文件也会有好多,对后续修改维护也是比较麻烦,就和前面的服务注册一样,服务 ...

  6. JavaScript数据结构——栈的实现与应用

    在计算机编程中,栈是一种很常见的数据结构,它遵从后进先出(LIFO——Last In First Out)原则,新添加或待删除的元素保存在栈的同一端,称作栈顶,另一端称作栈底.在栈中,新元素总是靠近栈 ...

  7. Docker相关地址

    Docker社区版(CE)地址: https://hub.docker.com/search/?type=edition&offering=community Docker文档地址: http ...

  8. python调用支付宝支付接口详细示例—附带Django demo代码

    项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公钥 2.应用公钥 3.应用私钥 4.APPID 5.Django 1.11. ...

  9. 一段代码分清global和nonlocal

    废话不多说,直接代码啊~~~ a=999 b=99999 def test1(): a=888 b=88888 print('a={}'.format(a)) print('b={}'.format( ...

  10. java读取本机磁盘及遍历磁盘文件

    1. 获取本机所有盘符信息 //1. 获取本机盘符 File[] roots = File.listRoots(); for (int i = 0; i < roots.length; i++) ...