标签:文件下载和文件上传
项目介绍:
本项目主要完成文件的上传以及下载的功能的一个综合案例.
1.搭建环境...
导入jar包以及开发的工具类...
jar包:
提供俩个工具类..一个是IOUtils主要提供了输出流和输入流的对接,和关闭流资源的函数
一个是提供数据源的工具类DataSourceUtils
IOUtils:
package cn.itheima.utils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class IOUtils { private IOUtils(){ } /** * 读取流中的数据写到输出流中 * @param in * @param out * @throws IOException */ public static void In2Out(InputStream in,OutputStream out) throws IOException{ int len=0; byte b[]=new byte[1024]; while((len=in.read(b))!=-1){ out.write(b, 0, len); } } /** * 关闭资源 * @param in * @param out */ public static void closeIO(InputStream in,OutputStream out){ if(in!=null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); }finally{ in=null; } } if(out!=null){ try { out.close(); } catch (IOException e) { e.printStackTrace(); }finally{ out=null; } } } }DataSourceUtils:
package cn.itheima.utils; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourceUtil { private static DataSource source = new ComboPooledDataSource(); private DataSourceUtil() { } public static DataSource getSource(){ return source; } public static Connection getConn(){ try { return source.getConnection(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } }2.准备好数据库:
create database day15;
use day15;
create table netdisk(
id int primary key auto_increment,
uuidname varchar(255),
realname varchar(255),
savepath varchar(255),
ip varchar(100),
uploadtime timestamp,
description varchar(255)
);
配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/day15?generateSimpleParameterMetadata=true</property> <property name="user">root</property> <property name="password">169500</property> </default-config> </c3p0-config>
package cn.itheima.domain; import java.io.Serializable; import java.sql.Timestamp; public class Resource implements Serializable{ private int id; private String uuidname;//上传文件的名称,文件的uuid名 private String realname;//文件上传的真实名称 private String savepath;//文件上传的位置 private Timestamp uploadtime;//文件上传的时间 private String ip;//上传文件者的ip地址 private String description;//文件的描述信息 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUuidname() { return uuidname; } public void setUuidname(String uuidname) { this.uuidname = uuidname; } public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; } public String getSavepath() { return savepath; } public void setSavepath(String savepath) { this.savepath = savepath; } public Timestamp getUploadtime() { return uploadtime; } public void setUploadtime(Timestamp uploadtime) { this.uploadtime = uploadtime; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }4.搭建项目的主页面:主要提供两个超链接:文件上传的超链接-->upload.jsp,文件下载列表的超链接-->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv=" pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <a href="${pageContext.request.contextPath }/upload.jsp">文件上传</a> <a href="${pageContext.request.contextPath }/servlet/DownLoadListServlet">文件列表</a> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv=" pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <h1>文件上传</h1> <form action="${pageContext.request.contextPath }/servlet/UploadServlet" enctype="multipart/form-data" method="post"> 描述信息:<input type="text" name="description"/><br> 文件上传:<input type="file" name="file1"/><br> <input type="submit" value="提交"/><br> </form> </body> </html>
6.开发servlet类UploadServlet(需要在WEB-INF目录下建立temp临时文件夹以及upload的上传文件所在的文件夹)
(1).上传文件的步骤
(2).将拿到的数据封装到Resource的一个对象中...这里使用的是BeanUtils..
(3).添加数据到数据库中...
(4).重定向到主页..
注意:
这里保存到数据库的路径不是全路径而是截取硬盘路径后的路径...
封装数据拿不到所有的数据,因此自己建立一个map类封装数据...
这里采用的是hashcode的文件夹存储...
package cn.itheima.web; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.sun.org.apache.commons.beanutils.BeanUtils; import cn.itheima.domain.Resource; import cn.itheima.utils.DataSourceUtil; import cn.itheima.utils.IOUtils; public class UploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map map=new HashMap(); String ip= request.getRemoteAddr(); map.put("ip", ip); try { // 1.文件上传的工厂类 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 1024 * 10); factory.setRepository(new File(this.getServletContext() .getRealPath("WEB-INF/temp"))); // 2.文件上传用到的核心类 ServletFileUpload fileUpload = new ServletFileUpload(factory); fileUpload.setFileSizeMax(1024 * 1024 * 100);// 设置单个文件的大小 fileUpload.setFileSizeMax(1024 * 1024 * 300);// 设置总的文件的大小 fileUpload.setHeaderEncoding("utf-8");// 解决中文乱码的问题 // 3.判断表单的类型 if (!fileUpload.isMultipartContent(request)) { throw new RuntimeException("请使用正确的表单类型"); } // --解析request List<FileItem> list = fileUpload.parseRequest(request); //--遍历 for(FileItem item:list){ if(item.isFormField()){//普通字段 String name = item.getFieldName(); String value = item.getString("utf-8"); map.put(name, value); }else{//文件上传字段 String realname = item.getName(); map.put("realname", realname); String uuidname=UUID.randomUUID()+"_"+realname; map.put("uuidname", uuidname); String str = Integer.toHexString(uuidname.hashCode()); String path=this.getServletContext().getRealPath("WEB-INF/upload"); String savepath = "/WEB-INF/upload"; for(char c:str.toCharArray()){ path+="/"+c; savepath+="/"+c; } map.put("savepath",savepath); //--创建文件夹 new File(path).mkdirs(); InputStream in=item.getInputStream(); OutputStream out=new FileOutputStream(new File(path,uuidname)); IOUtils.In2Out(in, out); IOUtils.closeIO(in, out); item.delete();//删除临时文件 } } //2.存到数据库中 //--封装数据 Resource r=new Resource(); BeanUtils.populate(r,map); QueryRunner runner=new QueryRunner(DataSourceUtil.getSource()); String sql="insert into netdisk values(null,?,?,?,?,null,?)"; runner.update(sql,r.getUuidname(),r.getRealname(),r.getId(),r.getSavepath(),r.getDescription()); //3.重定向回主页 response.sendRedirect(request.getContextPath()+"/index.jsp"); } catch (Exception e) { throw new RuntimeException(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }7.回归到主页...开发DownLoadListServlet
(1).数据库查询数据封装到list集合中
(2).把list放到request域中...用于在列表显示..
(3).请求转发到list.jsp
package cn.itheima.web; import java.io.IOException; import java.sql.SQLException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import cn.itheima.domain.Resource; import cn.itheima.utils.DataSourceUtil; public class DownLoadListServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.查询数据库 QueryRunner runner=new QueryRunner(DataSourceUtil.getSource()); String sql="select * from netdisk "; List list=null; try { list=runner.query(sql, new BeanListHandler<Resource>(Resource.class)); } catch (SQLException e) { e.printStackTrace(); } request.setAttribute("list", list); request.getRequestDispatcher("/list.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }8.开发list.jsp遍历list中的数据...
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv=" pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <h1>下载列表</h1> <c:forEach items="${requestScope.list }" var="li"> 文件名:${li.realname }<br> 上传者ip:${li.ip }<br> 上传时间:${li.uploadtime}<br> 文件描述:${li.description }<br> <a href="${pageContext.request.contextPath }/servlet/DownLoadServlet?id=${li.id}">下载</a><br> </c:forEach> </body> </html>
9.开发DownLoadServlet(要注意的是下载的路径要拼接..因为存放到数据库中的路径是WEB-INF/upload....)
(1).获取id
(2).通过id查询数据库...拿到javaBean
(3).按照下载的步骤写代码...
(4).重定向到下载列表页面
package cn.itheima.web; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import cn.itheima.domain.Resource; import cn.itheima.utils.DataSourceUtil; import cn.itheima.utils.IOUtils; public class DownLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取下载文件的id String id = request.getParameter("id"); Resource r=null; String sql="select * from netdisk where id=?"; QueryRunner runner=new QueryRunner(DataSourceUtil.getSource()); try { r=runner.query(sql, new BeanHandler<Resource>(Resource.class),id); response.setHeader("Content-Disposition", "attchment;filename="+URLEncoder.encode(r.getRealname(),"utf-8")); response.setContentType(this.getServletContext().getMimeType(r.getRealname())); String path=r.getSavepath(); String savepath=this.getServletContext().getRealPath(path+"/"+r.getUuidname()); InputStream in=new FileInputStream(savepath); OutputStream out=response.getOutputStream(); IOUtils.In2Out(in, out); IOUtils.closeIO(in, out); response.sendRedirect(request.getContextPath()+"/list.jsp"); } catch (SQLException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:文件下载和文件上传
原文地址:http://blog.csdn.net/u014010769/article/details/46822179