• SpringBoot RestTemplate接收文件,并将文件发送到另外一个程序进行存储


    最近有个需求,接收用户上报的证书,并且保存起来,证书大小不到1M,但该证书的保存必须在另外一个程序进行,所以想到使用springboot接收上传文件后,再通过RestTemplate将文件发送给另外一个程序来处理,假设我们定义接收从页面中上传的文件并发送给另外一个程序的服务称之为客户端,接收客户端发送的文件的服务称之为服务端

    pom依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 保存文件所需的工具类 -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>
    

    客户端

    页面

    客户端使用了freemarker显示上传界面,pom文件添加依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    

    uploadFile.ftl

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title></title>
    </head>
    <body>
        <form name="fileForm" method="post" action="/test/upload" enctype="multipart/form-data">
                name: <input type="text" name="uploader"><br/>
                file:<input type="file", name="uploadFile">  
                <input type="submit" id = "submit">  
        </form
    </body>
    </html>

    接收页面上传文件

    package com.demo.bootdemo;
    
    import java.util.Map;
    
    import javax.annotation.Resource;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.io.ByteArrayResource;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.util.LinkedMultiValueMap;
    import org.springframework.util.MultiValueMap;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.client.RestTemplate;
    import org.springframework.web.multipart.MultipartFile;
    
    @Controller
    @RequestMapping("/test")
    public class UploadFileController {
    
        private Logger logger = LoggerFactory.getLogger(UploadFileController.class);
    
        @Resource
        private RestTemplate restTemplate;
    
        @RequestMapping("toUploadPage")
        public String toUploadPage() {
            return "uploadFile";
        }
    
        @PostMapping("upload")
        @ResponseBody
        public Object upload(MultipartFile uploadFile, String uploader) {
    
            MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
            HttpHeaders header = new HttpHeaders();
            header.setContentType(MediaType.MULTIPART_FORM_DATA);
    
            HttpHeaders fileHeader = new HttpHeaders();
            fileHeader.setContentType(MediaType.parseMediaType(uploadFile.getContentType()));
            fileHeader.setContentDispositionFormData("uploadFile", uploadFile.getOriginalFilename());
    
            Map result = null;
            try {
                HttpEntity<ByteArrayResource> fileEntity = new HttpEntity<>(new ByteArrayResource(uploadFile.getBytes()),
                        fileHeader);
                multiValueMap.add("uploadFile", fileEntity);
                multiValueMap.add("uploader", uploader);
    
                String url = "http://127.0.0.1:8082/rest/createFile";
    
                HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(multiValueMap, header);
                ResponseEntity<Map> postForEntity = restTemplate.postForEntity(url, httpEntity, Map.class);
                result = postForEntity.getBody();
            } catch (Exception e) {
                logger.error("", e);
            }
    
            return result;
    
        }
    
    }

    服务器端

    接收文件

    package com.demo.bootdemo;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.commons.io.FileUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.multipart.MultipartFile;
    
    @Controller
    @RequestMapping("/rest")
    public class CreateFileController {
        private Logger logger = LoggerFactory.getLogger(CreateFileController.class);
    
        @PostMapping("createFile")
        @ResponseBody
        public Map<String, Object> createFile(MultipartFile uploadFile, String uploader) {
    
            String message = "";
            boolean success = true;
            try {
                FileUtils.copyInputStreamToFile(uploadFile.getInputStream(),
                        new File("G:\rest\" + uploadFile.getOriginalFilename()));
    
            } catch (Exception e) {
                logger.error("", e);
                message = e.getMessage();
                success = false;
            }
            Map<String, Object> result = new HashMap<>();
    
            result.put("message", message);
            result.put("success", success);
            return result;
    
        }
    }

    备注

    如果传递的文件过大,比如说超过了10M,则需要修改如下两个参数(单位Byte),但一般通过http上传的文件不要太大,如果太大,可以考虑使用ftp方式上传

    ## default 1M
    spring.servlet.multipart.max-file-size=8000000000
    ## default 10M
    spring.servlet.multipart.max-request-size=8000000000
  • 相关阅读:
    struts2 namespace
    struts2 action跳转及传参
    struts2 后缀问题
    MyEclipse 配置多个Tomcat运行
    tomcat 免安装版 内存溢出
    Tomcat安装版 内存溢出
    JSON 数据的两种遍历方式
    Struts2 返回 JSON数据
    Struts2 参数传递的两种模式
    JQuery + Ajax 传递参数
  • 原文地址:https://www.cnblogs.com/qq931399960/p/11769519.html
Copyright © 2020-2023  润新知