柏竹 柏竹
首页
后端
前端
  • 应用推荐
关于
友链
  • 分类
  • 标签
  • 归档

柏竹

奋斗柏竹
首页
后端
前端
  • 应用推荐
关于
友链
  • 分类
  • 标签
  • 归档
  • Java基础

  • JavaWeb

  • 拓展技术

  • 框架技术

  • 数据库

  • 数据结构

  • Spring

  • SpringMVC

    • SpringMVC
    • SpringMVC 静态资源的访问
    • SpringMVC 请求接收
    • SpringMVC 重定向和转发
    • SpringMVC 异常
    • SpringMVC 拦截器
    • SpringMVC 上传&下载
      • 上传
        • 文件上传
        • 优化上传
      • 下载
    • SpringMVC RESTful API
  • SpringBoot

  • SpringClound

  • Ruoyi-Vue-Plus

  • 后端
  • SpringMVC
柏竹
2021-07-18
目录

SpringMVC 上传&下载

# SpringMVC 上传&下载

# 上传

SpringMVC框架 文件上传是基于 commons-fileupload组件 ,并且对该组件 进一步的封装。文件上传提供支持可直接 用 MultpartResolver接口 。该接口用于处理上传请求,请求包装成 可直接获取文件的数据!!

MultpartResolver接口方法:

public interface MultipartFile extends InputStreamSource {
	
    // 返回请求参数的名称
	String getName();

    // 返回客户端提交的原始文件名称
	@Nullable
	String getOriginalFilename();
	
    // 返回文件内容类型
	@Nullable
	String getContentType();
	
    // 判断被上传文件是否为空
	boolean isEmpty();

    // 文件大小 ;单位字节
	long getSize();
    
	// 以字节数组形式返回文件的内容
	byte[] getBytes() throws IOException;
	
    // 读取文件的内容
	@Override
	InputStream getInputStream() throws IOException;

	default Resource getResource() {
		return new MultipartFileResource(this);
	}
    
	// 将上传文件保存都目标目录下
	void transferTo(File dest) throws IOException, IllegalStateException;

	default void transferTo(Path dest) throws IOException, IllegalStateException {
		FileCopyUtils.copy(getInputStream(), Files.newOutputStream(dest));
	}

}

上传组件&构架

项目结构(主要部分)

  .
  |
  ├── com
  │    ├── controller
  |	   |	  └── FileController
  │    ├── interceptor
  |	   |	  └── Fileinterceptor
  |   User
  |   
  └── webapp
         └── jsp 
         	  ├── fileHandle.jsp
      		  └── ok.jsp

依赖导入

<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3.1</version>
</dependency>

# 文件上传

springmvc.xml 文件配置 MultipartResolver

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

fileHandle.jsp页面表单(上传表单编码类型必须multipart/form-data)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
	<title>文件操作</title>
</head>
<body>
	<form action="/file/upload" method="post" 	enctype="multipart/form-data">
	请选择文件:<input type="file" name="myFile" /><br/>
	<button type="submit">上传文件</button>
	</form>
</body>
</html>
<!--
表单 enctype属性 说明: 表单数据的编码方式
 - application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的 value 属性值
 - multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里
 - text/plain:该编码方式只有当表单的 action 属性为“mailto:”URL 的形式时才使用,主要适用于直接通过表单发送邮件的方式
-->

FileController类 控制器类

/**
 *  单个文件上传
 */
@RequestMapping("upload")
public String upload(@RequestParam("myFile") MultipartFile file, HttpServletRequest request) throws IOException {
    //文件路径及文件名称
    String realPath = request.getServletContext().getRealPath("uploadfiles");
    // 文件原始名称
    String fileName = file.getOriginalFilename();
    System.out.println("fileName : " + fileName);
    System.out.println("realPath : " + realPath);
    File targetFile = new File(realPath,fileName);
    if (!targetFile.exists()) {
        targetFile.mkdirs();
    }
    //真正上传到服务器指定的名称
    file.transferTo(targetFile);
    System.out.println("上传成功:"+realPath+fileName);
    return "jsp/ok";
}

# 优化上传

FileController类 控制器类

意图:实际开发中,一般都要将文件重新命名存储(避免相同名称)

/**
 * 上传文件
 * @param file 请求中接收的上传文件
 * @return 跳转页
 */
@RequestMapping("upload")
public String upload(@RequestParam("myFile") MultipartFile file, HttpServletRequest request) throws IOException {
    //获取文件原始名称 (包含后缀)
    String originalFilename = file.getOriginalFilename();
    //randomUUID()生成随机数;replace()替换指定字符
    //存储服务器的名称 = 随机字符串 + 原文件后缀
    String fileName = UUID.randomUUID().toString().replace("-","") + originalFilename.substring(originalFilename.lastIndexOf("."));
    
    //存储路径
    String realPath = request.getServletContext().getRealPath("/uploadFile")+"\\";
    
    //存储路径 路径 + 文件名称
    file.transferTo(new File(realPath+fileName));
    System.out.println("上传成功:"+realPath+fileName);
    return "jsp/ok";
}

springmvc.xml配置文件

意图:限制文件的大小

<!--    上传文件-->
<bean id="multipartResolver"
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--限制文件大小(单位:字节)1024*1024*5 KB : 5MB = -->
    <property name="maxUploadSize" value="5242880"/>
    <property name="defaultEncoding" value="utf-8"/>
</bean>

Fileinterceptor拦截器类

意图:限制文件后缀形式

应用前提需配置拦截器 springmvc.xml

<mvc:interceptors>
    ····
    <!--指定干活的拦截器(判断上传文件类型)-->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.interceptor.Fileinterceptor" id="fileinterceptor"></bean>
    </mvc:interceptor>

</mvc:interceptors>
public class Fileinterceptor implements HandlerInterceptor {
    
    /**
     * 在文件上传之前判定文件是否合法
     * @param request
     * @param response
     * @param handler
     * @return 是否允许请求通行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler) throws Exception {
        boolean flag = true;
        
        if (request instanceof MultipartHttpServletRequest) {
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            //获取请求返回的 多个文件
            Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();
            //遍历文件
            Iterator<String> iterator = fileMap.keySet().iterator();
            while(iterator.hasNext()){
                String key = iterator.next();
                MultipartFile file = multipartHttpServletRequest.getFile(key);
                //查看 原始文件名
                String originalFilename = file.getOriginalFilename();
                String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
                //判断后缀许可
                if (!substring.equalsIgnoreCase(".png") && !substring.equalsIgnoreCase(".jpg")) {
                    //不符合条件的
                    request.getRequestDispatcher("/jsp/fileTypeError.jsp").forward(request,response);
                    flag = false;
                }
            }
        }
        return flag;
    }
}

# 下载

前端下载请求

<form action="/file/download" method="post" enctype="multipart/form-data">
    <button type="submit">下载</button>
</form>

FileController类 控制器类

/**
 * 下载文件
 * @return 字节形式传输
 */
@RequestMapping("download")
public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException {
    //指定文件名
    String fileName = "5593fe61c683494a91849c0346b2b528.jpg";
    //指定 文件名及文件路径(下载文件的路径)
    String path = request.getServletContext().getRealPath("/uploadFile")+"/"+fileName;
    //创建响应 的头信息对象
    HttpHeaders httpHeaders = new HttpHeaders();
    //标记的流方式作出响应
    httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    //以附件形式响应给用户
    httpHeaders.setContentDispositionFormData("attachment", URLEncoder.encode(fileName,"utf-8"));
    File file = new File(path);
    ResponseEntity<byte[]> resp = new ResponseEntity<>(FileUtils.readFileToByteArray(file),httpHeaders, HttpStatus.CREATED);
    return resp;
}
#SpringMVC#Java
上次更新: 2023/03/12, 00:43:49

← SpringMVC 拦截器 SpringMVC RESTful API→

最近更新
01
HTTPS自动续签
10-21
02
博客搭建-简化版(脚本)
10-20
03
ruoyi-vue-plus-部署篇
07-13
更多文章>
Theme by Vdoing | Copyright © 2019-2024 | 桂ICP备2022009417号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式