SpringMVC基础--上传问文件到服务器

提前配置好spring的前端控制器及视图解析器。

传统的java文件上传

依赖的jar包

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

提交文件的表单
将提交方式改为post,并且将enctype类型改为multipart/form-data

<h1>传统方式上传文件</h1>
<form action="user/uploadFile" method="post" enctype="multipart/form-data">
     选择文件:<input type="file" name="upload"><br>
     <input type="submit" value="上传文件">
</form>

控制器处理请求并上传文件

@RequestMapping("/uploadFile")
    public String testUploadFile(HttpServletRequest request) throws Exception {
    
    
        System.out.println("开始上传文件");
        // 获取要上传文件的目录
        String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
        // 创建File对象,一会向该路径下传送文件
        File file = new File(realPath);
        // 判断路径是否存在,如果不存在创建该目录
        if (!file.exists()) {
    
    
            file.mkdirs();
        }
        // 创建磁盘文件项工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        // 解析request对象
        List<FileItem> list = fileUpload.parseRequest(request);
        // 遍历
        for (FileItem fileItem: list) {
    
    
            // 判断文件项是普通字段还是上传的文件
            if (fileItem.isFormField()) {
    
    

            } else {
    
    
                // 上传文件项
                String filename = fileItem.getName();
                // 上传文件
                fileItem.write(new File(file,filename));
                // 删除临时文件
                fileItem.delete();
            }
        }
        return "success";
    }

使用tomcat运行,最终将文件上传到了tomcatWebapp文件下的该项目的工作目录。

SpringMVC方式的上传文件

springmvc可以配置文件解析器,来替代传统的创建文件项工厂、
遍历解析request对象过程,这些springmvc的文件解析器会帮我们做。
第一步配置文件解析器

<!-- 配置文件解析器,要求id名称必须是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<!-- 设置文件最大内存 -->
        <property name="maxUploadSize" value="10485760"></property>
    </bean>

提交文件的表单

    <h1>SpringMVC方式上传文件</h1>
    <form action="user/uploadFile2" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br>
        <input type="submit" value="上传文件">
    </form>

控制器处理请求并提交文件

    @RequestMapping("/uploadFile2")
    public String testUploadFileMvc(HttpServletRequest request, MultipartFile upload) throws Exception {
    
    
        // 获取要上传文件的目录
        String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
        // 创建File对象,一会向该路径下传送文件
        File file = new File(realPath);
        // 判断路径是否存在,如果不存在创建该目录
        if (!file.exists()) {
    
    
            file.mkdirs();
        }
        // 获取上传文件名称
        String  filename = upload.getOriginalFilename();
        // 防止重名文件覆盖,重新生成文件名称唯一化
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        filename = uuid+"_"+filename;
        // 上传文件,上传过后会自动给我们删除文件缓存。
        upload.transferTo(new File(file,filename));
        return "success";
    }

跨服上传文件到服务器

前面做的都是上传到本地的服务器,现在再建一个项目设置tomcat为8081端口,相当于用8080端口运行的项目,将文件传送到8081端口。8081服务器不需要设置什么,创建个Meaven项目选怎webapp皆可以了。
引入maven坐标

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

表单

    <h1>SpringMVC方式上传到图片服务器</h1>
    <form action="user/uploadFile3" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br>
        <input type="submit" value="上传文件">
    </form>

控制器处理请求并上传到8081服务器

@RequestMapping("/uploadFile3")
    public String testUploadFileService(MultipartFile upload) throws Exception {
    
    
        System.out.println("向服务器上传文件");
        // 定义图片服务器的请求路径
        String path = "http://localhost:8081/uploadService_war_exploded/";

        // 获取上传文件名称
        String  filename = upload.getOriginalFilename();
        // 防止重名文件覆盖,重新生成文件名称唯一化
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        filename = uuid+"_"+filename;
        // 向图片服务器上传文件
        // 创建客户端对象
        Client client = Client.create();
        // 连接图片服务器
        WebResource resource = client.resource(path + filename);
        // 上传文件
        System.out.println("准备上");
        resource.put(upload.getBytes());
        return "success";
    }

如果报错405,需要将tomcat目录下conf/web.xml,设置只读false,在指定位置加上下面一段配置。

	<init-param>
			<param-name>readonly</param-name>
			<param-value>false</param-value>
		</init-param>

这个文件会发送到项目目录target目录下。

猜你喜欢

转载自blog.csdn.net/qq_44660367/article/details/108943109
今日推荐