首页 > 其他分享 >day12-SpringMVC文件上传

day12-SpringMVC文件上传

时间:2023-02-17 23:23:33浏览次数:37  
标签:文件 SpringMVC dest IOException day12 import 上传 public

SpringMVC文件上传

1.基本介绍

  1. SpringMVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的。spring 用 Jacarta Commons FileUpload 技术实现了一个 MultipartResolver 的实现类:CommonsMultipartResovler

  2. SpringMVC 上下文默认没有装配 MultipartResolver ,因此默认情况下不能处理文件的上传工作。如果要使用 Spring 文件上传功能,要先在上下文(容器文件)中配置 MultipartResolver

    <!--配置文件上传解析器-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" 
          id="multipartResolver">
    </bean>
    

2.应用实例

(1)引入 SpringMVC 文件上传需要的 jar 包

image-20230217200556207

(2)创建 fileUpload.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/fileUpload"
      method="post" enctype="multipart/form-data">
    文件介绍:<input type="text" name="introduce"/><br/>
    选择文件:<input type="file" name="file"/><br/>
    <input type="submit" value="上传文件"/>
</form>
</body>
</html>

(3)web.xml 文件中配置过滤器,处理中文乱码问题(这里使用 spring 提供的过滤器)

<!--使用spring提供的过滤器处理中文-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <!--大小写都支持-->
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

(4)MyCharacterFilter.java

package com.li.web.filter;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author 李
 * @version 1.0
 * 编写过滤器处理中文乱码问题
 */
public class MyCharacterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest servletRequest, 
                         ServletResponse servletResponse, 
                         FilterChain filterChain) throws IOException, ServletException {
        //加入对编码的处理
        servletRequest.setCharacterEncoding("utf-8");
        //放行请求
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {}
}

(5)在 spring 的容器文件中,配置文件上传解析器

<!--配置文件上传解析器-->
<!--这里是按照接口名字获取bean,因此 id要写为 multipartResolver(接口)-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
      id="multipartResolver">
</bean>

(6)创建 FileUploadHandler.java

package com.li.web.fileupload;

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 javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;

/**
 * @author 李
 * @version 1.0
 * 处理文件上传的 handler
 */
@Controller
public class FileUploadHandler {
    //编写方法,处理文件上传的请求
    @RequestMapping(value = "/fileUpload")
    public String fileUpload(@RequestParam(value = "file") MultipartFile multipartFile,
                             HttpServletRequest request, String introduce) 
        throws IOException {
        //接收到提交的文件名
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("你上传的文件介绍=" + introduce);
        System.out.println("你上传的文件名=" + originalFilename);
        //得到上传的文件要保存的路径[全路径:包括文件名]
        //这里其实是out目录下的路径
        String fileFullPath =
                request.getServletContext().getRealPath("/img/" + originalFilename);
        //创建文件
        File saveToFile = new File(fileFullPath);
        //将上传文件转存到 saveToFile
        multipartFile.transferTo(saveToFile);
        return "success";
    }
}

(7)启动 tomcat,访问 fileUpload.jsp,选择文件上传

image-20230217204739917

后台输出:

image-20230217205540158

上传的文件:

这里只是模拟,真正开发中不会将文件存放在项目目录中,而是存放在主机的另外的磁盘上,每次存放文件时会将存放路径保存到数据库中。下载文件时会读取数据库数据,得到路径,寻找文件。

image-20230217204906903

postman 也可以进行文件上传:

image-20230217220956037

3.transferTO()方法

@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
    //首先判断该文件(路径)在磁盘中是不是可获取的
   if (!isAvailable()) {
      throw new IllegalStateException("File has already been moved - cannot be transferred again");
   }

    //判断上传的文件在磁盘中存不存在,如果存在就会去尝试删除该文件,如果删除失败,就会抛出异常
   if (dest.exists() && !dest.delete()) {
      throw new IOException(
            "Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");
   }

    //如果文件不存在,或者存在但删除成功了
   try {
       //将上传的文件拷贝到目标目录 dest 下
       //this.fileItem 就是你要上传文件的临时文件(tmp文件)
       //就是说 SpringMVC 上传文件也是先将上传文件保存为临时文件,然后再拷贝为目标文件
      this.fileItem.write(dest);
      LogFormatUtils.traceDebug(logger, traceOn -> {
         String action = "transferred";
         if (!this.fileItem.isInMemory()) {
            action = (isAvailable() ? "copied" : "moved");
         }
         return "Part '" + getName() + "',  filename '" + getOriginalFilename() + "'" +
               (traceOn ? ", stored " + getStorageDescription() : "") +
               ": " + action + " to [" + dest.getAbsolutePath() + "]";
      });
   }
   catch (FileUploadException ex) {
      throw new IllegalStateException(ex.getMessage(), ex);
   }
   catch (IllegalStateException | IOException ex) {
      // Pass through IllegalStateException when coming from FileItem directly,
      // or propagate an exception from I/O operations within FileItem.write
      throw ex;
   }
   catch (Exception ex) {
      throw new IOException("File transfer failed", ex);
   }
}

标签:文件,SpringMVC,dest,IOException,day12,import,上传,public
From: https://www.cnblogs.com/liyuelian/p/17131740.html

相关文章

  • SpringMVC09 - 文件的下载与上传
    文件下载ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文使用ResponseEntity实现下载文件的功能①浏览器触发下载<ath:href......
  • dokuwiki编辑器支持ppt上传
    ​ Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的......
  • SpringMVC10 - 拦截器 Interceptor
    拦截器拦截器的配置SpringMVC中的拦截器用于拦截控制器方法的执行SpringMVC中的拦截器需要实现HandlerInterceptorSpringMVC的拦截器必须在SpringMVC的配置文件中进行......
  • SpringMVC11 - 异常处理器 ExceptionResolver
    异常处理器SpringMVC默认使用DefaultHandlerExceptionResolver,因此,会跳转到出现404、405等报错页面基于XML配置的异常处理SpringMVC提供了一个处理控制器方法执行过......
  • SpringMVC12 - 基于注解配置SpringMVC
    注解配置SpringMVC使用配置类和注解代替web.xml和SpringMVC配置文件的功能创建初始化类,代替web.xml在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.Servlet......
  • SpringMVC13 - 执行流程
    SpringMVC常用组件DispatcherServlet:前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求HandlerMapping......
  • yunUI组件库解析:图片上传与排序组件yImgPro
    yunUI是笔者开源的微信小程序功能库。目前其中包含了一些复杂的功能组件。方便使用。未来它将分为组件、样式、js三者合为一体,但分别提供。本文所用代码皆来源于组件库中的......
  • 博客园本地上传markdown(自记)
    最近开始要写很多的博客,无奈之前每篇博客都要将本地的图片拖动上传一番,才能完整地发好一篇随笔。便STFW了一下,发现了好东西。记以自用。项目地址:https://github.com/do......
  • 记录uniapp-小程序文件上传问题
    1.支付宝文件上传问题 uni.uploadFile如果缺少fileType运行到微信没有问题,但是运行到支付宝会报错,需要补齐fileType2.接口返回需要注意,res.data为字符串,需要转换JSON......
  • 使用nginx代理时上传图片413
    1、错误描述2、错误原因1.上传文件时,利用localhost访问系统,不会出现这个问题;用域名访问这个系统时,出现这个问题,提示是:请求实体太大由于Nginx反向代理服务器client_max_......