黑马day15 仿网盘案例

来源:互联网 发布:edm邮件制作软件 编辑:程序博客网 时间:2024/06/05 04:58

项目介绍:

  本项目主要完成文件的上传以及下载的功能的一个综合案例.

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>


3.准备javaBean类Resource(要保证和数据库中的属性一致)

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>


5.开发load.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>  <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("请使用正确的表单类型");}// --解析requestList<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.获取下载文件的idString 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);}}


0 0
原创粉丝点击