springmvc+hibernate+maven实现web上传和下载,内容显示图片

先来看看效果吧,没有可以去调前端格式,所以页面很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";
    }

}
现在完成了上传和下载的功能,但是好像图片并没有显示出来,所以我们还得改一下服务器地址

这里写图片描述

需要设置的三处,在下边我的更多文章里wen文件上传一文中有写到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值