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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM