SpringMVC之文件的上传与下载

一:文件的上传:

1、添加需要的jar包:

  首先,如果需要在SpringMVC中进行文件的上传与下载需要添加两个jar包,将这两个jar包拷贝到项目的lib目录,如图所示:
在这里插入图片描述
点击下载 jar

提取码:i5yl

2、修改spring-mvc.xml 配置文件,定义文件上传解析器:

  即向SpringMVC配置文件spring¬mvc.xml中添加文件上传的相关配置。因为文件不可能无限大的上传,所以一定要设置文件大小的限制。而且id是固定的,可以到org.springframework.web.servlet.DispatcherServlet的源码文件下查看,CommonsMultipartResolver提供三个属性设置,可以跳转到源码开头的注释查看,配置代码如下:
在这里插入图片描述

<!-- 文件上传的配置 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	    <!-- 指定所上传文件的总大小不能超过2MB=2097152字节=1024*1024*2。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
	    <property name="maxUploadSize" value="2097152"/>
	    <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
	    <property name="defaultEncoding" value="UTF-8"/>
	</bean>

3、编写文件上传Controller方法:

  文件上的方法代码如下:
在这里插入图片描述

  在控制器中,SpringMVC 中使用 MultipartFile 对象来接收上传的文件,通过这个对象可以接收页面传递的文件的文件名和文件类型,这里,参数的名字必须与页面上file组件的name属性值一致,此时,在控制器中,已经能够正常地接收页面上传的文件了,下一步,只需要把接收的这个文件,保存到你指定的路径即可。

4、编写文件上传的from表单(jsp页面):

  编辑文件上传的表单代码如下:
在这里插入图片描述

二:文件的下载:

1、文件下载的方法代码如下:

在这里插入图片描述

2、编写文件下载的jsp页面,代码如下:

在这里插入图片描述

3、测试

(1)启动项目,访问http://127.0.0.1:8080/Demo05SpringMVC/FileDemo/toUpload.do ,选择文件,然后点击“上传文件”按钮。如图所示:
在这里插入图片描述
(2)文件上传成功信息,如图所示:
在这里插入图片描述

(3)点击文件下载链接,下载文件。如图所示:
在这里插入图片描述

(4)下载之后去看你设置的下载路径,就能看到下载的文件啦:
在这里插入图片描述

附:完整的代码:

Controller层:

package com.gx.web;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
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;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

/**
 * 先引入两个jar,然后去spring-mvc.xml配置上传信息
 * @author Administrator
 *
 */
@Controller
@RequestMapping("/FileDemo")
public class FileDemoController {

	/**
	 * 打开上传文件的表单
	 * @return
	 */
	@RequestMapping("/toUpload")
	public String toUpload(){
		return "/fileDemo/upload";
	}
	
	
	//文件上传
	@RequestMapping("/upload")
	public ModelAndView upload(@RequestParam(value="file",required=true) MultipartFile myFile) throws IOException{
			
		String strFileName="";
		//判断是否上传文件
		if (myFile.isEmpty()) {
			System.out.println("未上传文件");
		} else {
			//获取上传文件的属性
			System.out.println("文件大小"+myFile.getSize());
			System.out.println("文件类型"+myFile.getContentType());
			System.out.println("文件名称"+myFile.getName());
			System.out.println("文件原名"+myFile.getOriginalFilename());
			System.out.println("===========================================");
			
			//文件上传路径
			String upDir="F:/z/";
			
			//获取文件原名
			String fullName=myFile.getOriginalFilename();
			//获取扩展名称
			String ext=fullName.substring(fullName.lastIndexOf('.'));
			//拼接文件保存的名称
			String FileName=System.nanoTime()+ext;
			
			//保存文件
			FileUtils.writeByteArrayToFile(new File(upDir, FileName), myFile.getBytes());
			
			System.out.println("保存的文件名称为:"+FileName);
			strFileName=FileName;
		}
		//路径为/WEB-INF/jsp/fileDemo/uploadSuccess
		ModelAndView mv=new ModelAndView("/fileDemo/uploadSuccess");//由于在spring-mvc配置文件中配置了对模型视图名称的解析,所以这里路径可以简写,具体配置见下文详细代码。
		mv.addObject("fileName", strFileName);
		return mv;
	}

	
	//文件下载
	@RequestMapping("/download")  
    public ResponseEntity<byte[]> download(String fileName) throws IOException {  
    	//文件上传路径
		String upDir="F:/z/";    	   	
        //获取文件
        File file = new File(upDir,fileName);
        //设置header
        HttpHeaders headers = new HttpHeaders();    
        //application/octet-stream二进制流数据(最常见的文件下载)
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
        //通知浏览器以attachment(下载方式) 下载文件,文件名称为指定名称
        headers.setContentDispositionFormData("attachment", fileName);    
       
        //返回文件下载相关参数
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);    
    } 
	
	
}

jsp页面:


```java
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set  value="${pageContext.request.contextPath}"  scope="page"  var="ctx"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'upload.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  	 <!-- 需要指定enctype="multipart/form-data" 不然文件上传不了 -->
     <form action="${ctx}/FileDemo/upload.do" method="post" enctype="multipart/form-data">
    	选择文件:<input type="file" name="file"><!-- name值需要和控制器那边(value="file")对应 -->
    	<button type="submit">上传文件</button>    	
    </form>
  </body>
</html>


```java
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set  value="${pageContext.request.contextPath}"  scope="page"  var="ctx"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'uploadSuccess.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    上传成功<br>
    <a href="${ctx}/FileDemo/download.do?fileName=${fileName}">${fileName}</a>
  </body>
</html>

spring-mvc.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
	
	<!-- 日期转换  必须放在<mvc:annotation-driven />前面 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>

    <!-- 注解方式 -->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!-- 自动扫描且只扫描 @Controller -->
    <context:component-scan base-package="com.gx.web">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

    <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
    <!-- 跳转的时候只用写jsp的名字,不用带后缀,因为默认后缀“.jsp”,路径为“/WEB-INF/jsp” -->
    <!-- WEB-INF目录是受保护的目录,在浏览器中是无法访问的  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix" value="/WEB-INF/jsp"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
	
	<!-- 文件上传的配置 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	    <!-- 指定所上传文件的总大小不能超过2MB=2097152字节=1024*1024*2。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
	    <property name="maxUploadSize" value="2097152"/>	    
	</bean>
	
</beans>

猜你喜欢

转载自blog.csdn.net/weixin_44563573/article/details/105976300
今日推荐