简单的文件上传的下载(动态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应用添加文件 ...
随机推荐
- Tomcat访问日志详细配置(转)
在server.xml里的<host>标签下加上<Valve className="org.apache.catalina.valves.AccessLogValve&qu ...
- MySQL中enum类型数据,要传入字符串
问题来源:公司业务,某张表中一个字段定义为: enum('0','1','2','3','4','5','6','7','8','9','10') NOT NULL DEFAULT '0' 某天跑脚本 ...
- C# MD5加密与校验 引用
using System; using System.Security.Cryptography; using System.Text; class Example { // Hash an inpu ...
- python系列十三:Python3 输入输出
#!/usr/bin/python #Python3 输入输出 import math'''输出格式美化Python两种输出值的方式: 表达式语句和 print() 函数.第三种方式是使用文件对象的 ...
- jQuery方法find()与children()区别
一.find() 1.1 说明 find()方法返回被选元素的后代元素,一路向下直到最后一个后代. 1.2 示例 <div> <p> <span>1</spa ...
- Nuxt使用iconfont矢量图标
Nuxt可以使用各种前端UI框架,这些框架一般都自带的有一些icon图标可供用户使用,但是一般项目开发的时候,UI框架自带的icon是不能满足实际项目需求的,这个时候我们可以自己找一些图片放到本地项目 ...
- 让linux进程后台运行、会话断开不退出
方法一:nohup ping www.ibm.com & 可改变进程的父进程号方法二:setsid ping www.ibm.com 可改变进程的父进程号方法三:(ping www.ibm.c ...
- openssl之EVP系列之7---信息摘要算法结构概述
openssl之EVP系列之7---信息摘要算法结构概述 ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成 (作者:Dragon ...
- Chrome 正在受到自动化软件控制 – 解决办法
1.在这个文件下修改一行代码就可以了,文件路径E:\Miniconda3\envs\env3\Lib\site-packages\selenium\webdriver\chrome\options.p ...
- 深入struts2.0(六)--ActionProxy类
1.1 ActionProxy接口以及实现 ActionProxy在struts框架中发挥着很关键的数据. 通过webwork和xwork交互关系图能够看出.它是action和xwork中间的 ...