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项目)的更多相关文章

  1. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  2. SSM简单实现文件上传和下载

    一.配置spring-mvc <!-- 配置多媒体文件解析器 --> <bean id="multipartResolver" class="org.s ...

  3. linux下安装简单的文件上传与下载工具 lrzsz

    编译安装 1.从下面的网站下载 lrzsz-1.12.20.tar.gz wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2.查看里面的I ...

  4. spring mvc 简单的文件上传与下载

    上传文件有很多种方法,这里主要讲解的是spring mvc内提供的文件上传 前提使用:spring mvc 在这个之前我们需要把环境给配置好 1:springmvc的XML配置文件加上这一段就即可, ...

  5. java代码实现ftp服务器的文件上传和下载

    java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools   工具类: ...

  6. ASP.NET 文件上传于下载

    本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...

  7. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  8. JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  9. web项目的文件上传和 下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用Java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

随机推荐

  1. php简单工厂模式

    工厂类中有一个创建对象的方法,根据传入参数的不同来生成不同的对象 class Operation extends Model{ private $numberA; private $numberB; ...

  2. M²的经典语录

    1. If you failed, stop and think! You should work in the correct way. 2. If I can do all of it, why ...

  3. Yue Fei's Battle(组合计数递推)

    //求一个直径为 k 的树有多少种形态,每个点的度不超过 3 // 非常完美的分析,学到了,就是要细细推,并且写的时候要细心 还有除法取模需要用逆元 #include <iostream> ...

  4. linux中常见的文件操作命令

    由于经常在linux发布工程进行测试,所以要用到linux一些文件操作命令,再此进行总结,以便以后忘记的时候查看. 改变目录:cd 回到家目录 cd或者cd~ 查看当前目录:pwd 查看目录下的文件的 ...

  5. 如何用 JavaScript 控制 Arduino?

    Arduino 运行 C 语言,而主控端运行 JavaScript,一次要编写和维护两种程序.既然浏览器和服务器都用 JavaScript,若 Arduino 也能用 JavaScript 控制,那岂 ...

  6. badboy脚本参数化和检查点

    一.badboy脚本参数化 文本参数化 方式一:直接在Variablesl ist添加参数化变量和值,然后在Script里面找到对应需要参数化的内容-属性,进行替换,参数化名需要用${XX}引用: 方 ...

  7. Linux考试题附答案

    一.选择题 1.在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么(B)? A.NID B.PID C.UID D.CID 2.下面哪个目录存放用户密码信息(B) A./b ...

  8. web测试策略

    一.输入框 二.搜索功能 三.添加功能 四.修改功能 五.删除功能 六.注册.登陆模块 七.上传图片测试 八:文件导出 九.文件下载页面 十.查询结果列表 十一.cookie 一.输入框    1 字 ...

  9. Python数据分析与挖掘所需的Pandas常用知识

    Python数据分析与挖掘所需的Pandas常用知识 前言Pandas基于两种数据类型:series与dataframe.一个series是一个一维的数据类型,其中每一个元素都有一个标签.series ...

  10. 【AWS】AWS云计算赋能数字化转型专题研讨会圆满落幕

    大会精彩回顾:查看原文 大会使用的PPT下载地址:点击下载