简单的文件上传的下载(动态web项目)
1、在页面中定义一个form表单,如下:
<!-- 文件上传 -->
<form action="${pageContext.request.contextPath}/FileServlet?oper=fileUpload" method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="username"><br><!--普通表单项,没有用-->
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
<!-- 文件下载 -->
<a href="${pageContext.request.contextPath}/RegisterServlet?oper=fileDownload">下载</a>
注意:
向服务器上传一个文件时,表单要使用post请求。
表单的默认属性enctype="application/x-www-form-urlencoded",这个属性的意思是请求体中的内容将会使用URL编码
上传文件的表单enctype需要设置为 multipart/form-data
multipart/form-data表示的是表单是一个多部件的表单
如果类型设置为它,则我们的每一个表单项都会作为一个单独的部件发送给服务器。
多个部件之间使用类似 -----------------------------7df2d08c0892 分割符来分开
当表单设置为multipart/form-data时,我们request.getParameter()将失效,我们不能再通过该方法获取请求参数。
2、在doPost方法中,(需要导入两个jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.jar)
文件上传和下载的jar包(百度云) 密码:ftbi
//使用简单的反射将参数oper映射成函数对象
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String methodName = request.getParameter("oper");
Class cla = this.getClass();
try {
Method method = cla.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.setAccessible(true);
method.invoke(this, request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);//doPost()中调用doGet()方法
}
protected void fileUpload(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1、创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建ServletFileUpload对象,通过这个对象完成文件上传功能
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setFileSizeMax(150*1024);//对单个文件大小做限制
fileUpload.setSizeMax(2*1024*1024);//对总文件大小做限制
ServletContext servletContext = request.getServletContext();//获取servletContext对象
String realPath=servletContext.getRealPath("/upload");//获取服务器的根目录(存储)
File file=new File(realPath);
if(!file.exists()){//如果目录不存在,则创建该目录
file.mkdirs();
}
try {
// 3、用这个fileUpload对象解析request请求
List<FileItem> fileList = fileUpload.parseRequest(request);
for (FileItem item : fileList) {
// 如果是普通表单项
if (item.isFormField()) {
String name = item.getFieldName();// 获取name属性
String value = item.getString("utf8");// 获取value值
// System.out.println(name + ":" + value);
} else {// 如果上传的是文件
// String contentType = item.getContentType();// 获取文件的类型
// String fieldName = item.getFieldName();// 获取文件域的name属性
long size = item.getSize();// 获取文件的大小
if(size==0){//如果没有上传文件,则继续往下执行
continue;
}
String name = item.getName();// 获取文件的名字
//在IE浏览器中获取到的是文件名的全路径,需要通过截取字符串获得文件的名字
//谷歌和火狐中获取的只是文件的名字,不需要截取
if(name.contains("\\")){
name=name.substring(name.lastIndexOf("\\")+1);
}
//为了上传同名文件时不被覆盖,需要对文件的名字进行加前缀处理
String prefix = UUID.randomUUID().toString();//UUID:机器码+时间戳
prefix = prefix.replace("-", "");
String fileName = prefix+"_"+name;
//将文件写到服务器
item.write(new File(realPath+"//"+fileName));
}
}
}catch(FileSizeLimitExceededException e) {
System.out.println("文件大小不能超过150K");
}catch(SizeLimitExceededException e) {
System.out.println("文件总大小不能超过2M");
}catch (FileUploadException e) {
e.printStackTrace();
}
}
protected void fileDownload(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
ServletContext servletContext = request.getServletContext();
String fileName = "海若有因.mp3";
String path = servletContext.getRealPath("/WEB-INF/res/"+fileName);
File file = new File(path);
//1.创建输入流
InputStream in = new FileInputStream(file);
//获取文件的MIME类型
String type = servletContext.getMimeType(path);
//设置响应头---文件类型 Content-Type为文件的MIME类型
response.setContentType(type);
//解决文件名中文乱码的问题
fileName = new String(fileName.getBytes("gbk"),"iso8859-1");//这是一种不太讲理的方式
//设置响应头---下载文件的信息 Content-Disposition为attachment; filename=文件名
//Content-Disposition告诉浏览器如何处理文件
//attachment 告诉浏览器这个文件是一个附件的形式发给你的,需要你做下载的操作
//filename 告诉浏览器下载文件的名字
response.setHeader("Content-Disposition","attachment;filename="+fileName);
//从response获取输出流,不需要手动关闭
ServletOutputStream out=response.getOutputStream();
//将输入流写到输出流
IOUtils.copy(in, out);
in.close();//关闭输入流
}
函数反射参见:用简单的反射优化代码(动态web项目)
简单的文件上传的下载(动态web项目)的更多相关文章
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- SSM简单实现文件上传和下载
一.配置spring-mvc <!-- 配置多媒体文件解析器 --> <bean id="multipartResolver" class="org.s ...
- linux下安装简单的文件上传与下载工具 lrzsz
编译安装 1.从下面的网站下载 lrzsz-1.12.20.tar.gz wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2.查看里面的I ...
- spring mvc 简单的文件上传与下载
上传文件有很多种方法,这里主要讲解的是spring mvc内提供的文件上传 前提使用:spring mvc 在这个之前我们需要把环境给配置好 1:springmvc的XML配置文件加上这一段就即可, ...
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- ASP.NET 文件上传于下载
本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...
- 【Java】JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- web项目的文件上传和 下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用Java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
随机推荐
- 注册Asp4.0到iis
- Nginx 解决WebSocket TCP 转发问题
背景: IM 即时通讯时候 , 前期我用的是IP 没什么问题,当然上线肯定要搞个域名搞搞了! 那么问题来了------>Nginx 我按照原先那样配置时候不行了, 连接不了. 解决方法: ...
- Verilog HDL实用教程笔记
Verilog HDL实用教程笔记 DRC - Design Rule Check 几何规则检查ERC - Electrical Rule Check 电学规则检查自动参数提取LVS - Logic ...
- OpenCV3计算机视觉+python(三)
使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 O ...
- Eclipse中tomcat设置
首先在Eclipse中新建一个tomcat的server,这里就不多说了. 新建完成后,双击新建的server,如下: 设置1:在Server Locations里,选择Use Tomcat inst ...
- Eclipse中执行maven命令(转载)
转载自:http://blog.csdn.net/u011939453/article/details/43017865 1.如下图,右击需要执行maven命令的工程,选择"Debug As ...
- PHP获取微信openid 简单教程
//***方法一 获取code https://open.weixin.qq.com/connect/oauth2/authorize?appid=这里是你的公众号的APPID&redirec ...
- 剑指offer 面试17题
面试17题: 题目:打印从1到最大的n位数 题:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1.2.3一直到最大的3位数999. 解题思路:需要考虑大数问题,这是题目设置的陷 ...
- Shell Step by Step
@1:Command: ctrl+z ------->切后台 fg ------->切前台 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + u :从光标 ...
- Python进阶(1)_Socket网络编程(基于tcp的socket)
网络协议参考:http://www.cnblogs.com/hedeyong/p/6889774.html 一.TCP/IP五层模型 学习socket一定要先学习互联网协议: 1.首先:本节课程的目标 ...