黑马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>
<%@ 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);}}
- 黑马day15 仿网盘案例
- 黑马day15 文件下载
- 黑马程序员-day15-泛型
- 黑马程序员_java基础day15
- 黑马程序员-Java API-day15
- 黑马程序员-day15集合框架
- 黑马day15 文件上传入门
- day15
- day15
- day15
- day15
- day15
- day15
- Day15
- day15
- Day15
- Day15
- day15
- android自定义控件之extends某控件时,不同构造方法的调用情况分析。
- iOS 开发中 SIGPIPE信号的分析跟处理
- 使用JNI的struts2项目在tomcat遇到的问题
- 抢红包数据库整理
- 学点PS-no.1
- 黑马day15 仿网盘案例
- 某公司java面试经历
- 几个非常好的C++技术博客
- 单例类
- IP首部校验和(ICMP报文的校验和)的计算方法
- 密码行业标准目录
- 神经网络特征可视化
- leetoj two sum
- Shark 0.9.1安装遇到的问题及解决办法