使用文件上传功能我们要借助form表单,固定设置:
表单中的请求方式一定是post、参数enctype是:multipart/form-data
还需要借助两个依赖:commons-fileupload、commons-io

一、实现本地上传

引入依赖:

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
		<!-- commons-fileupload依赖于commons-io,会自动导入commons-io-->

spring-mvc.xml文件中配置上传解析器,也可以设置一些相关参数(比如上传文件的最大大小···)

<context:component-scan base-package="com.bdit.controller"/>
	<!--    配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大大小-->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

准备Controller

@Controller
public class FileUploadController {

    @RequestMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile multipartFile, HttpServletRequest request){
        //准备一个随机生成的文件名
        String uuid = UUID.randomUUID().toString();
        //获取上传过来的资源的文件名
        String fileName  = multipartFile.getOriginalFilename();
        //准备上传资源的保存路径(该文件夹不能为空,为空就不会被编译)
        String savePath = request.getServletContext().getRealPath("/upload/");
        System.out.println(savePath);
        //准备一个File对象,将保存路径和名字给它
        File file = new File(savePath,uuid+fileName);
        try {
            //实现上传
            multipartFile.transferTo(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "ok!";
    }
}

我们使用到了MultipartFile对象中的两个方法:
1、 getOriginalFilename()获得上传文件的原名
2、 transferTo(file)将上传文件保存到一个文件路径中去

准备前端页面

<form action="upload" enctype="multipart/form-data" method="post">
    <!-- 注意:这里的name一定要和upload方法中传的参数名相同-->
    <input type="file" name="multipartFile">
    <input type="submit" value="提交">
  </form>

启动项目,在页面上提交文件,从项目的target目录下就可以找到的我们上传的文件

二、实现跨服上传

和保存在本地不同,现在我们需要两个服务器,一个用来处理请求,另一个作为文件服务器,保存我们上传的文件

引入依赖:

<!-- 跨服上传-->
        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.19.4</version>
        </dependency> 
        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.19.4</version>
        </dependency>
    </dependencies>

为Controller再添加一个跨服上传的方法:

@RequestMapping("/upload2")
    @ResponseBody
    public String upload2(MultipartFile multipartFile){
        String uuid = UUID.randomUUID().toString();
        String fileName  = multipartFile.getOriginalFilename();
        //获取后缀名
        fileName = fileName.substring(fileName.lastIndexOf("."));
        //准备保存文件的服务器地址
        String serverUrl = "http://localhost:8081/springmvc_day03_uploadhouse/upload/";
		//创建一个客户端对象
        Client client = Client.create();
        //客户端与文件服务器连接
        WebResource resource = client.resource(serverUrl+uuid+fileName);
        try {
            resource.put(String.class,multipartFile.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "ok!";
    }

修改form表单提交地址

<form action="upload2" enctype="multipart/form-data" method="post">
    <input type="file" name="multipartFile">
    <input type="submit" value="提交">
  </form>

这个时候我们就需要准备另一个web服务器,作为文件服务器

准备第二个tomcat,这时候需要修改第二个tomcat的端口号,conf目录下server.xml文件中修改为8081

<Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

tomcat默认是不支持跨服上传的,添加配置:conf目录下web.xml文件DefaultServlet的servlet标签中添加:

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <!-- 添加的内容**********************-->
		<init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
        <!-- *******************************-->
        <load-on-startup>1</load-on-startup>
    </servlet>

现在第二个tomcat已经准备好了,只需要我们使用IDEA将项目配置到这个服务器上就可以了

springmvc 文件上传和参数 springmvc文件上传配置_java

这个用来保存我们文件的服务器不需要写任何东西,准备一个保存文件的地址即可(里面放上一个文件,因为为空不会被编译)

springmvc 文件上传和参数 springmvc文件上传配置_tomcat_02

启动项目,输入http://localhost:8081/springmvc_day03_uploadhouse/upload/a.txt可以直接访问的到我们的a.txt就行,文件服务器就准备完毕了。

启动主项目服务器,上传文件,成功后查看文件服务器target目录:

springmvc 文件上传和参数 springmvc文件上传配置_tomcat_03