先来看看效果吧,没有可以去调前端格式,所以页面很low,不中看,但中用。
大概流程:
—>1.upload.jsp用form表单提交到
—>2.UploadController中的upload(servlet)
—>3.重定向到ListFileController的list(servlet)用hibernate的HQL把查询结果
—>4.存到域对象然后list.jsp做回显
—>5.点击下载按钮
—>6.DownloadController中的download从本地虚拟服务器下载到本地磁盘
没有调整图片大小,不过真好看是不是?
代码:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qfedu</groupId>
<artifactId>uploadanddownload</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.9.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.24</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
</project>
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里是springmvc的核心配置文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<!-- mvc其实spring的一个模块,所以他的配置文件的标签和spring是类似的 -->
<!-- 设置扫描组件的包: -->
<context:component-scan base-package="com.qfedu" />
<!-- 配置映射解析器:如何将控制器返回的结果字符串,转换为一个物理的视图文件 -->
<!-- springmvc会自动帮助我们做页面的转发,我们需要告知jsp文件所存在的位置 -->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- jsp文件存放在web-inf下,目的是为了强制用户必须先经过控制器,然后转发的jsp 因为在web-inf下的资源只能通过转发的方式访问到资源 -->
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- /WEB-INF/views/ login .jsp -->
<!-- 添加对文件上传功能的需求 ,只需要添加xml,我们就可以在项目中使用此功能 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1024000"></property>
</bean>
</beans>
hibernate.cfg.xml可以在包上右键出来
改一下主键生成策略记得。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/1713uploadanddownload</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping resource="com/qfedu/pojo/UploadInfo.hbm.xml" />
</session-factory>
</hibernate-configuration>
UploadInfo.java
package com.qfedu.pojo;
//
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// 佛祖保佑 永无BUG
//
//
//
public class UploadInfo {
private int id;
private String username;
private String path;
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
UploadInfo.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-10-27 17:58:43 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.qfedu.pojo.UploadInfo" table="UPLOADINFO">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="username" type="java.lang.String">
<column name="USERNAME" />
</property>
<property name="path" type="java.lang.String">
<column name="PATH" />
</property>
<property name="url" type="java.lang.String">
<column name="URL" />
</property>
</class>
</hibernate-mapping>
Utils.java封装了SessionFactory
package com.qfedu.commons;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class Utils {
// 因为hibernate中创建一个SessionFactory对象比较负责,并且创建SessionFactory对象比较耗时
// 所以我们把复杂的代码进行封装,今后在使用SessionFactory对象直接调用即可
public static SessionFactory getFactroy() {
// configure方法会读取cfg.xml文件
Configuration configuration = new Configuration().configure();
ServiceRegistryBuilder builder = new ServiceRegistryBuilder();
// 应用读取到的配置信息
builder.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = builder.buildServiceRegistry();
// 最终获取到SessionFactory对象
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
return factory;
}
}
该配的都配了,该建的也都建了,下边是jsp
upload.jsp最后项目访问的路径
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<!-- 多文件上传
1使用h5新特性multiple="multiple"
2同一个表单中多个同名input
以上两种后台中都是使用MulipartFile[]来接收
如果上传多个文件之间没有互相的联系,我们可以单独的分开命名name属性,并且在后台单独接收
-->
上传者:<input type="text" name="username" /> <input type="file" name="file"
multiple="multiple" /> <input type="submit" />
</form>
</body>
</html>
藏在list.jsp在web-info下的views文件夹下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
<c:forEach items="${data}" var="uploadinfo">
<tr>
<td>${uploadinfo.username}</td>
<td><a href="download?path=${uploadinfo.path}">下载<img
src="${uploadinfo.url}" border="1">
</a></td>
</tr>
</c:forEach>
</ul>
</body>
</html>
下边是Controller啦!!!
DownloadController.java
package com.qfedu;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// 佛祖保佑 永无BUG
//
//
//
@Controller
public class DownloadController {
// void表示不执行springmvc的视图解析器
@RequestMapping("/download")
public void download(HttpServletResponse resp, String path) throws IOException {
File file = new File("F:/xixihaha/" + path);
// 文件下载
// 设置response的头部中键的名字叫"content-type'的值
// 其实就是告诉浏览器返回浏览器的是什么数据的类型,浏览器做好准备用对应的方式去处理数据,比如下载,显示为图片,解析html
// 比如text/html表示html。
// application/octet-stream表示所有可执行文件,具体详见我的另一篇文章,@responce.setContentType参数配置
resp.setContentType("application/octet-stream");
// 还需要告诉浏览器此次被下载的文件的名字
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
resp.setCharacterEncoding("UTF-8");
ServletOutputStream out = resp.getOutputStream();
// 文件转成文件输入流
InputStream in = new FileInputStream(file);
// 文件流对象转成字节流,我们可以通过使用commons-io下面的IOUtils提供的方法快速的转换
out.write(IOUtils.toByteArray(in));
in.close();
out.close();
}
// springmvc特有的文件下载方式
// ResponseEntity是一个对响应数据,响应头,响应码进行封装的一个是实体类
// 需要指定一个泛型,泛型就是数据本身的类型,此处我们是一个文件下载,所以就是btye[]
@RequestMapping("/download2")
public ResponseEntity<byte[]> download2() throws IOException {
// 在springmvc响应由 数据本身,头部,响应码三部分组成
// 我们分别组装三部分数据,设置到ResponseEntity中进行返回
// 1组装返回数据
File file = new File("Z:/windos/一.jpg");
byte[] files = FileUtils.readFileToByteArray(file);
// 组装头部
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", URLEncoder.encode(file.getName(), "UTF-8"));
return new ResponseEntity<byte[]>(files, headers, HttpStatus.OK);
}
// 文件上传,可以选择文件,上传者的名字。保存到数据库中
// 上传成功显示列表,上传的所有记录,显示上传者的名字,上传时间,附带连接,点击下载此文件。
// 要求使用springmvc+hibernate(不用使用spring整合),保存到数据时文件名字或者连接
}
ListFileController.java
package com.qfedu;
import java.util.List;
import java.util.Map;
import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.qfedu.commons.Utils;
import com.qfedu.pojo.UploadInfo;
//
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// 佛祖保佑 永无BUG
//
//
//
@Controller
public class ListFileController {
@RequestMapping("/list")
public String getAllFile(Map<String, Object> map) {
Session s = Utils.getFactroy().openSession();
List<UploadInfo> list = s.createQuery("from UploadInfo").list();
map.put("data", list);
return "list";
}
}
UploadController.java
package com.qfedu;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.hibernate.Session;
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// 佛祖保佑 永无BUG
//
//
//
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import com.qfedu.commons.Utils;
import com.qfedu.pojo.UploadInfo;
@Controller
public class UploadController {
// 文件上传完成之后的目的是为了可以被用户再次访问到
// 我们需要提供列表显示所有上传文件,我们需要每次都记录文件上传这个作用
// 我们需要持久化保存,创建一张表保存信息,包括:上传人名字,上传时间,文件大小,我们可以在表中保存文件的路径(或者文件的名字,通过表示可以访问到文件即可)
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile multipartFile, String username)
throws IllegalStateException, IOException {
String filename = multipartFile.getOriginalFilename();
System.out.println(filename);
// 保存文件名字需要唯一,不然会出现后上传的同名文件覆盖之前同名文件
// 比如UUID
File file = new File("F:/xixihaha/" + filename);
multipartFile.transferTo(file);
// 执行数据库操作
// 这里初始化hibernate,进行数据库操作
UploadInfo up = new UploadInfo();
up.setUsername(username);
up.setPath(filename);
up.setUrl("http://localhost:8080/img02/"+filename);
Session s = Utils.getFactroy().openSession();
s.beginTransaction();
s.save(up);
s.getTransaction().commit();
s.close();
// 重定向
return "redirect:list";
}
}