首页 > 其他分享 >SpringMVC系列之(十)文件上传

SpringMVC系列之(十)文件上传

时间:2024-02-28 09:03:31浏览次数:26  
标签:文件 系列 SpringMVC springframework fileName import org 上传

文件上传

1. 文件上传的前提

  1. form表单的ectype属性(表单请求正文的类型)取值必须是multipart/form-data,默认值是application/x-www-form-urlencoded
  2. method属性值为post
  3. 提供文件选择域<input type="file"/>

2. 文件上传的原理

ectype=application/x-www-form-urlencoded(默认值)
表单的正文内容
key=value&key=value&key=value...
注:ectype取值不是默认值后,request.getParameter()将失效

ectype=multipart/form-data
表单的正文内容
在这里插入图片描述

3. 文件上传的相关jar包及Maven坐标

在这里插入图片描述

<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>

4. SpringMVC实现传统方式文件上传

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 商务小本本
  Date: 2022/3/3
  Time: 23:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data" action="test/testFileUpload">
        <input type="file" name="upload">
        <br>
        <input type="submit" value="提交文件">
    </form>
</body>
</html>

Controller

package cn.itcast.controller;

import cn.itcast.domain.User;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
import java.util.UUID;

/**
 * @author 商务小本本
 */
@Controller
@RequestMapping("/test")
public class HelloController {

    @RequestMapping("/testFileUpload")
    public String testFileUpload(HttpServletRequest request) throws Exception {
        //设置上传到的目录
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        //判断待上传的目录是否存在,如果不存在就创建
        if (!file.exists()){
            file.mkdirs();
        }
        //创建文件项工厂,用于创建文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        //解析request,获取到所有项
        List<FileItem> items = fileUpload.parseRequest(request);
        for (FileItem item:items) {
            //判断是否为普通表单项,如果是文件项就可实现上传文件
            if (item.isFormField()){

            }else {
                String fileName = item.getName();
                //解决重名文件上传的问题,加入uuid保证文件名唯一
                String replace = UUID.randomUUID().toString().replace("-", "");
                fileName = replace + "_" + fileName;
                item.write(new File(path, fileName));
                //删除临时文件,若上传的文件超过10kb,产生临时文件,需要删除;若上传的文件不到10kb,会在内存中生成缓存文件,不需要处理。
                item.delete();
            }
        }
        return "success";
    }
}

5. SpringMVC实现文件上传

5.1 原理分析

在这里插入图片描述

5.2 配置文件解析器

<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
    <property name="maxUploadSize" value="10485760"></property>
</bean>

5.3 实现

package cn.itcast.controller;

import cn.itcast.domain.User;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
import java.util.UUID;

/**
 * @author 商务小本本
 */
@Controller
@RequestMapping("/test")
public class HelloController {

    @RequestMapping("/testFileUpload")
    public String testFileUpload(MultipartFile upload, HttpServletRequest request) throws Exception {
        //设置上传到的目录
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        File file = new File(path);
        //判断待上传的目录是否存在,如果不存在就创建
        if (!file.exists()){
            file.mkdirs();
        }
        String fileName = upload.getOriginalFilename();
        String replace = UUID.randomUUID().toString().replace("-", "");
        fileName = replace + "_" + fileName;
        upload.transferTo(new File(path, fileName));
//        //创建文件项工厂,用于创建文件项
//        DiskFileItemFactory factory = new DiskFileItemFactory();
//        ServletFileUpload fileUpload = new ServletFileUpload(factory);
//        //解析request,获取到所有项
//        List<FileItem> items = fileUpload.parseRequest(request);
//        for (FileItem item:items) {
//            //判断是否为普通表单项,如果是文件项就可实现上传文件
//            if (item.isFormField()){
//
//            }else {
//                String fileName = item.getName();
//                String replace = UUID.randomUUID().toString().replace("-", "");
//                fileName = replace + "_" + fileName;
//                item.write(new File(path, fileName));
//                //删除临时文件,若上传的文件超过10kb,产生临时文件,需要删除;若上传的文件不到10kb,会在内存中生成缓存文件,不需要处理。
//                item.delete();
//            }
//        }
        return "success";
    }
}

6. 跨服务器文件上传

6.1 应用场景

在这里插入图片描述
当应用服务器向文件服务器请求上传文件时就要用到跨服务器的文件上传
在这里插入图片描述
在这里插入图片描述

6.2 相关的jar包和Maven坐标

在这里插入图片描述

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-core</artifactId>
  <version>1.18.1</version>
</dependency>
<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>

6.3 环境部署

搭建本地测试环境时,由于一台机器上要跑两个服务器,HTTP port和JMX port需要单独配置,避免冲突
在这里插入图片描述

6.4 功能实现

package cn.itcast.controller;

import cn.itcast.domain.User;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
import java.util.UUID;

/**
 * @author 商务小本本
 */
@Controller
@RequestMapping("/test")
public class HelloController {

    @RequestMapping("/testFileUploadServer")
    public String testFileUploadServer(MultipartFile upload) throws Exception {
        //目标文件服务器路径
        String path = "http://localhost:8090/uploadserver_war/uploads/";
        String fileName = upload.getOriginalFilename();
        String replace = UUID.randomUUID().toString().replace("-", "");
        fileName = replace + "_" + fileName;

        //创建客户端对象
        Client client = Client.create();
        //连接文件服务器
        WebResource webResource = client.resource(path + fileName);
        //上传文件
        webResource.put(upload.getBytes());

        return "success";
    }
}

6.5 可能出现的错误

  1. com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:8090/uploadserver_war/uploads/56834c683cc545afaa169a6640755a70_info.txt returned a response status of 405 Method Not Allowed
    在这里插入图片描述
    解决方法:
    如果运行环境readonly(只读),则tomcat会拒绝所有的HTTP的修改方法(如put,delete),默认为true。
    tomcat安装目录下的web.xml
    在这里插入图片描述
    参考网站:【错误处理】上传文件出错returned a response status of 405 Method Not Allowed,400

  2. com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:8090/uploadserver_war/uploads/a6f0e1ad00274947b7143fcfabb7053d_info.txt returned a response status of 409 Conflict
    在这里插入图片描述
    要上传的目标目录不存在导致的,在tomcat的部署目录创建目标目录即可

标签:文件,系列,SpringMVC,springframework,fileName,import,org,上传
From: https://www.cnblogs.com/wzzzj/p/18038910

相关文章

  • SpringMVC系列之(九)响应数据和结果视图
    响应数据和结果视图1.返回值分类这里的返回值指的是Controller中的方法的返回值。1.1String该字符串为逻辑视图名,通过视图解析器解析为物理视图地址。注:底层调用的是ModelAndView1.1.1实际开发中的应用实体类index.jsp<%--CreatedbyIntelliJIDEA.User:商务......
  • SpringMVC系列之(八)HiddentHttpMethodFilter过滤器
    HiddentHttpMethodFilter过滤器1.应用场景由于浏览器自身只支持发送get/post请求,其他请求方式并不支持,该过滤器用于模拟发送各种请求方式的请求(get/post/put/delete)Spring3.0提供2.浏览器发送PUT/DELETE请求的其他实现方式插件WebClient提供的静态方法HiddentHttpMetho......
  • SpringMVC系列之(六)自定义类型转换器
    自定义类型转换器SpringMVC在进行请求参数绑定时,自动进行了类型转换,前端传来的参数都是字符串,而控制器中的方法在接收时,可能会用到其他数据类型(如:Date、Integer、Double等),以日期类型为例,前端传的日期格式多样,SpringMVC自动转换类型的格式(2011/11/11)支持不了这么多类型,故有的日期......
  • SpringMVC系列之(五)POST请求中文乱码
    POST请求中文乱码1.配置解决中文乱码的过滤器web.xml中增加如下代码<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><para......
  • SpringMVC系列之(四)请求参数的绑定
    请求参数的绑定获取前端传过来的参数的过程,如:Servlet的getParameter方法SpringMVC中的请求参数绑定:通过反射实现,SpringMVC中的请求参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的。1.支持的数据类型基本数据类型和字符串实体类型(JavaBean)集合数据类......
  • SpringMVC系列之(三)常用注解
    常用注解1.RequestMappingRequestMapping可以放在类上和方法上,放在类上表示一级目录,或表示某一个具体的模块属性path和value属性的作用相同method决定方法的请求方式params:请求必须包含的参数headers:请求必须包含的请求头以上的属性出现多个,需要同时满足2.RequestPa......
  • SpringMVC系列之(一)入门程序
    Web层,表现层入门程序1.需求描述页面上设置一个链接,点击链接后跳转到成功页面。2.搭建环境从骨架创建项目解决创建项目过慢的问题项目创建后,完善目录结构,创建相应的目录并设置目录类型源代码目录(java)和资源目录(resources)注:我这里已经设置过了,所以就不......
  • Spring系列之(十)Spring的事务控制
    Spring的事务控制1.Spring中基于XML的声明式事务控制配置步骤配置事务管理器<beanclass="org.springframework.jdbc.datasource.DataSourceTransactionManager"id="transactionManager"><propertyname="dataSource"ref="dataSource">......
  • Spring系列之(九)Spring中的JdbcTemplate
    Spring中的JdbcTemplate持久层总图1.JdbcTemplate相关的jar包spring-jdbc-5.2.11.RELEASE.jar2.JdbcTemplate的学习路径JdbcTemplate的作用用于和数据库交互,实现对表的CRUD操作如何创建JdbcTemplate对象对象中的常用方法方法功能voidsetDataSource(DataS......
  • Spring系列之(八)Spring中的AOP
    Spring中的AOP通过配置(XML/注解)实现AOP1.AOP相关术语1.1连接点方法,Service接口中的所有方法1.2切入点方法,Service接口中被增强过的方法Tip:所有的切入点都是连接点1.3通知方法,通常,具有增强功能的方法会放到一个类中,该类中所有用于增强的方法就被称为通知分类:前置通......