SpringMVC实现文件上传下载功能

目录
  • 导入需要的依赖包
  • 一、单个文件上传
  • 二、多个文件上传
  • 三、上传文件列表显示
  • 四、文件下载

今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current request is not a multipart request,看了网上很多方法,最后才找到,我在表单提交的时候使用了序列化$('#postForm').serialize(),但是这种方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的。所以一直在报错。后来就直接使用submint(),放弃使用Ajax。不过还是想记下来,以备不时之需。

接下来进入正题:在SSM框架下实现文件上传和下载

导入需要的依赖包

pom.xml

		<!-- 上传组件包 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.9</version>
		</dependency>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <!-- SpringMVC的前端控制器 -->
    <servlet>
        <servlet-name>MyDispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 设置自己定义的控制器xml文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/springMVC-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Spring MVC配置文件结束 -->  

    <!-- 拦截设置 -->
    <servlet-mapping>
        <servlet-name>MyDispatcher</servlet-name>
        <!-- 由SpringMVC拦截所有请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

spring-mvc.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
     xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">  

    <!-- 把标记了@Controller注解的类转换为bean -->
    <context:component-scan base-package="com.mucfc" />  

	<!-- 视图解析器 对模型视图名称的解析,即在模型视图名称添加前后缀-->
	<bean id="viewResolver"		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/" />
		<property name="suffix" value=".jsp"></property>
	</bean>

    <!-- 上传文件的设置 ,maxUploadSize=-1,表示无穷大。uploadTempDir为上传的临时目录 -->
   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
    	<!-- one of the properties available; the maximum file size in bytes -->
    	<!-- 1KB= 1024 byte   1MB=1024KB    1GB=1024MB-->
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10000000" />
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />
     />
</beans>

一、单个文件上传

JSP,这个页面是用来上传又用来显示上传后的图片的页面fileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>用户上传图片页面</title>
 <base href="<%=basePath%>" rel="external nofollow"  rel="external nofollow" >
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <center>
        <form action="file/onefile"
            method="post" enctype="multipart/form-data">
            <input type="file" name="file" />
            <input type="submit" value="上 传" />
        </form>
        <h5>上传结果:</h5>
        <img alt="暂无图片" src="${fileUrl}" />
    </center>
</body>
</html>

Conroller层

1、方法一

@Controller
@RequestMapping("/file")
public class FileController {  

    @RequestMapping("/toFile")
    public String toFileUpload() {
        return "fileUpload";
    }  

    @RequestMapping("/toFile2")
    public String toFileUpload2() {
        return "fileUpload2";
    }  

    /**
     * 方法一上传文件
     */
    @RequestMapping("/onefile")
    public String oneFileUpload(@RequestParam("file") MultipartFile file,HttpServletRequest request,HttpServletResponse response) {  

        // 获得原始文件名
        String fileName = file.getOriginalFilename();
        System.out.println("原始文件名:" + fileName);  

        //避免文件名重复使用uuid来避免,产生一个随机的uuid字符,并赋予一个新的文件名
        String newFileName = UUID.randomUUID() + fileName;  

        // 获得项目的路径
     	ServletContext servletContext = request.getSession().getServletContext();
        // 上传位置
       String path=servletContext.getRealPath("/upload")+"/";     //设定文件保存的目录

        File f = new File(path);
        if (!f.exists())
            f.mkdirs();
        if (!file.isEmpty()) {
            try {
                FileOutputStream fos = new FileOutputStream(path + newFileName);
                InputStream in = file.getInputStream();
                int b = 0;
                while ((b = in.read()) != -1) {
                    fos.write(b);
                }
                fos.close();
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }  

        System.out.println("上传图片到:" + path + newFileName);
        // 保存文件地址,用于JSP页面回显
        model.addAttribute("fileUrl", path + newFileName);
        return "fileUpload";
    }

运行后的效果:

原始文件名:1522330092612.jpg

上传位置:D:\tomcat-8.5.43\webapps\telecomsystem\upload

效果图:

上传前

上传后

2、方法二:使用文件流的方式来上传

/**
 * 方法二上传文件,一次一张
 */
@RequestMapping("/onefile2")
public String oneFileUpload2(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    CommonsMultipartResolver cmr = new CommonsMultipartResolver(
            request.getServletContext());  

    if (cmr.isMultipart(request)) {
        MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) (request);
        Iterator<String> files = mRequest.getFileNames();
        while (files.hasNext()) {
            MultipartFile mFile = mRequest.getFile(files.next());
            if (mFile != null) {
                String fileName = UUID.randomUUID()
                        + mFile.getOriginalFilename();
                String path = "d:/upload/" + fileName;  

                File localFile = new File(path);
                mFile.transferTo(localFile);
                request.setAttribute("fileUrl", path);
            }
        }
    }
    return "fileUpload";
}

jsp部分代码:

<center>
   <form action="file/onefile2"
        method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" value="上 传" />
    </form>
    <h5>上传结果:</h5>
    <img alt="暂无图片" src="${fileUrl}" />
</center>

方法二指定上传到了本地E盘的upload文件夹

二、多个文件上传

多个文件上传其实就是将单文件上传的方法一中修改成循环就可以了

JSP显示页面fileUpload2.jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>用户上传图片页面</title>
<base href="<%=basePath%>" rel="external nofollow"  rel="external nofollow" >
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <center>
        <form action="file/threeFile" method="post"
            enctype="multipart/form-data">
            <input type="file" name="file" /><br /> <input type="file"
                name="file" /><br /> <input type="file" name="file" /><br /> <input
                type="submit" value="上 传" />
        </form>
        <h5>上传结果:</h5>  

        <c:forEach items="${fileList}" var="imagename">
                <img alt="暂无图片" src="${imagename}" /> 

        </c:forEach>
    </center>
</body>
</html>

Controller层

/**
 * 一次上传多张图片
 */
@RequestMapping("/threeFile")
public String threeFileUpload(
        @RequestParam("file") CommonsMultipartFile files[],
        HttpServletRequest request, ModelMap model) {  

    List<String> list = new ArrayList<String>();
    // 获得项目的路径
    ServletContext sc = request.getSession().getServletContext();
    // 上传位置
    String path = sc.getRealPath("/img") + "/"; // 设定文件保存的目录
    File f = new File(path);
    if (!f.exists())
        f.mkdirs();  

    for (int i = 0; i < files.length; i++) {
        // 获得原始文件名
        String fileName = files[i].getOriginalFilename();
        System.out.println("原始文件名:" + fileName);
        // 新文件名
        String newFileName = UUID.randomUUID() + fileName;
        if (!files[i].isEmpty()) {
            try {
                FileOutputStream fos = new FileOutputStream(path
                        + newFileName);
                InputStream in = files[i].getInputStream();
                int b = 0;
                while ((b = in.read()) != -1) {
                    fos.write(b);
                }
                fos.close();
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("上传图片到:" + path + newFileName);
        list.add(path + newFileName);  

    }
    // 保存文件地址,用于JSP页面回显
    model.addAttribute("fileList", list);
    return "fileUpload2";
}

三、上传文件列表显示

jsp文件listFile.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
  <head>
    <title>下载文件显示页面</title>
  </head>
  <body>
      <!-- 遍历Map集合 -->
    <c:forEach var="me" items="${fileNameMap}">
        <c:url value="/file/downFile" var="downurl">
            <c:param name="filename" value="${me.key}"></c:param>
        </c:url>
        ${me.value}<a href="${downurl}" rel="external nofollow" >下载</a>  

    </c:forEach>
  </body>
</html>

Controller层

/**
 * 列出所有的图片
 */
@RequestMapping("/listFile")
public String listFile(HttpServletRequest request,
        HttpServletResponse response) {
    // 获取上传文件的目录
    ServletContext sc = request.getSession().getServletContext();
    // 上传位置
    String uploadFilePath = sc.getRealPath("/img") + "/"; // 设定文件保存的目录
    // 存储要下载的文件名
    Map<String, String> fileNameMap = new HashMap<String, String>();
    // 递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中
    listfile(new File(uploadFilePath), fileNameMap);// File既可以代表一个文件也可以代表一个目录
    // 将Map集合发送到listfile.jsp页面进行显示
    request.setAttribute("fileNameMap", fileNameMap);
    return "listFile";
}

四、文件下载

Controller层

@RequestMapping("/downFile")
public void downFile(HttpServletRequest request,
        HttpServletResponse response) {
    System.out.println("1");
    // 得到要下载的文件名
    String fileName = request.getParameter("filename");
    System.out.println("2");
    try {
        fileName = new String(fileName.getBytes("iso8859-1"), "UTF-8");
        System.out.println("3");
        // 获取上传文件的目录
        ServletContext sc = request.getSession().getServletContext();
        System.out.println("4");
        // 上传位置
        String fileSaveRootPath = sc.getRealPath("/img");   

        System.out.println(fileSaveRootPath + "\\" + fileName);
        // 得到要下载的文件
        File file = new File(fileSaveRootPath + "\\" + fileName);  

        // 如果文件不存在
        if (!file.exists()) {
            request.setAttribute("message", "您要下载的资源已被删除!!");
            System.out.println("您要下载的资源已被删除!!");
            return;
        }
        // 处理文件名
        String realname = fileName.substring(fileName.indexOf("_") + 1);
        // 设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition", "attachment;filename="
                + URLEncoder.encode(realname, "UTF-8"));
        // 读取要下载的文件,保存到文件输入流
        FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);
        // 创建输出流
        OutputStream out = response.getOutputStream();
        // 创建缓冲区
        byte buffer[] = new byte[1024];
        int len = 0;
        // 循环将输入流中的内容读取到缓冲区当中
        while ((len = in.read(buffer)) > 0) {
            // 输出缓冲区的内容到浏览器,实现文件下载
            out.write(buffer, 0, len);
        }
        // 关闭文件输入流
        in.close();
        // 关闭输出流
        out.close();
    } catch (Exception e) {
    }
}

注:这里是通过文件流的方式来下载图片的。

以上就是SpringMVC实现文件上传下载功能的详细内容,更多关于SpringMVC文件上传下载的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringMVC实现文件的上传和下载实例代码

    前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

  • SpringMVC实现文件上传和下载的工具类

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中. 开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成类. 我的工具类具体代码如下: package com.baosight.utils; import java.io.BufferedInputStream; import java.io.File; import java.io.FileNotFoundException; import java

  • SpringMVC实现文件上传与下载

    本文实例为大家分享了SpringMVC实现文件上传与下载的具体代码,供大家参考,具体内容如下 0.环境准备 1.maven依赖 <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.7.0</version> <scope&

  • SpringMVC实现文件上传下载的全过程

    目录 前言 一.通用配置 二.实现文件下载,上传功能 总结 前言 文件的上传和下载都是基于io复制,只不过 文件上传是浏览器向服务器发送报文 文件下载是服务器向浏览器发送报文 提示:以下是本篇文章正文内容,下面案例可供参考 一.通用配置 pom.xml <dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifact

  • springMVC实现文件上传和下载

    本文实例为大家分享了springMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下 1准备工作 web.xml文件导入DispatcherServlet,CharacterEncodingFilter <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet

  • SpringMVC实现文件上传和下载功能

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 文件上传 第一步,加入jar包: commons-fileupload-1.3.1.jar commons-io-2.4.jar 第二步,在SpringMVC配置文件中配置CommonsMultipartResovler <bean id="multipartResolver" class="org.springframework.web.multipart.commons.Commo

  • SpringMVC实现文件上传下载功能

    目录 导入需要的依赖包 一.单个文件上传 二.多个文件上传 三.上传文件列表显示 四.文件下载 今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current request is not a multipart request,看了网上很多方法,最后才找到,我在表单提交的时候使用了序列化$('#postForm').serialize(),但是这种方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的.所以一直在报错.后来就直接使用submint(),放弃使用

  • Spring Boot + thymeleaf 实现文件上传下载功能

    最近同事问我有没有有关于技术的电子书,我打开电脑上的小书库,但是邮件发给他太大了,公司又禁止用文件夹共享,于是花半天时间写了个小的文件上传程序,部署在自己的Linux机器上. 提供功能: 1 .文件上传 2.文件列表展示以及下载 原有的上传那块很丑,写了点js代码优化了下,最后界面显示如下图: 先给出成果,下面就一步步演示怎么实现. 1.新建项目 首先当然是新建一个spring-boot工程,你可以选择在网站初始化一个项目或者使用IDE的Spring Initialier功能,都可以新建一个项目

  • java中struts2实现文件上传下载功能实例解析

    本文实例讲述了java中struts2实现文件上传下载功能实现方法.分享给大家供大家参考.具体分析如下: 1.文件上传 首先是jsp页面的代码 在jsp页面中定义一个上传标签 复制代码 代码如下: <tr>      <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>      <td bgcolor="#FFFFFF">

  • SpringBoot实现文件上传下载功能小结

    最近做的一个项目涉及到文件上传与下载.前端上传采用百度webUploader插件.有关该插件的使用方法还在研究中,日后整理再记录.本文主要介绍SpringBoot后台对文件上传与下载的处理. 单文件上传 // 单文件上传 @RequestMapping(value = "/upload") @ResponseBody public String upload(@RequestParam("file") MultipartFile file) { try { if (

  • FasfDFS整合Java实现文件上传下载功能实例详解

    在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</arti

  • Struts2 控制文件上传下载功能实例代码

    之前介绍servlet3.0新特性的时候有提到过servlet API提供了一个part类来实现对文件的上传和保存,Struts其实是在其基础上做了进一步的封装,更加简单易用.至于文件下载,Struts贯彻AOP 思想,在下载之前提供对用户权限控制的API. 下面我们将详细介绍上传和下载的相关内容. 一.Struts文件上传机制 想要实现文件上传功能,页面的表单的method属性必须被指定为post,还有enctype属性必须为multipart/form-data,该值表示上传的内容将会以二进

  • 基于Java文件输入输出流实现文件上传下载功能

    本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制"流"的形式,服务端(servlet)通过  getInputStream() 获取流信息, 运用java I/O 流的基础操作将流写入到一个服务端临时创建的文件temp中,然后再次利用文件基本操作,读取并截取临时文件内容,根据其中信息创建相应的文件,将读取出来的具体信息写入,下载时,根据提交的文件名称,找到服务器端相应的文件,然后根据输

  • vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)

    vue-cli+axios实现附件上传下载记录: 上传: 这里用formData格式传递参数:请求成功后后台返回上传文件的对应信息. 重点是下载: ############## downloadfile(res) { var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'}); //applicati

  • c# 实现文件上传下载功能的实例代码

    NuGet 安装SqlSugar 1.Model文件下新建 DbContext 类 public class DbContext { public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=localhost;uid=root;pwd=woshishui;database=test", DbType = DbType.MySql, InitKeyTy

随机推荐