最近有个需求,接收用户上报的证书,并且保存起来,证书大小不到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

SpringBoot RestTemplate接收文件,并将文件发送到另外一个程序进行存储的更多相关文章

  1. springBoot上传文件时MultipartFile报空问题解决方法

    springBoot上传文件时MultipartFile报空问题解决方法 1.问题描述: 之前用spring MVC,转成spring boot之后发现上传不能用.网上参考说是spring boot已 ...

  2. C#网络编程(接收文件) - Part.5

    这篇文章将完成 Part.4 中剩余的部分,它们本来是一篇完整的文章,但是因为上一篇比较长,合并起来页数太多,浏览起来可能会比较不方便,我就将它拆为两篇了,本文便是它的后半部分.我们继续进行上一篇没有 ...

  3. SpringBoot项目实现文件上传和邮件发送

    前言 本篇文章主要介绍的是SpringBoot项目实现文件上传和邮件发送的功能. SpringBoot 文件上传 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要 ...

  4. 应用SecureCRT(发送接收文件)

    使用 SecureCRT 和 cz. sz,可以从 Linux 服务器上下载/上传文件. Linux 上要安装 lszrz 包 (1)编译安装root 账号登陆后,依次执行以下命令 cd /tmp w ...

  5. 【Android Developers Training】 42. 从另一台设备接收文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. SpringBoot上传文件到本服务器 目录与jar包同级

    前言 看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了. 当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源.但是当你 ...

  7. springboot上传文件 & 不配置虚拟路径访问服务器图片 & springboot配置日期的格式化方式 & Springboot配置日期转换器

    1.    Springboot上传文件 springboot的文件上传不用配置拦截器,其上传方法与SpringMVC一样 @RequestMapping("/uploadPicture&q ...

  8. 在Django中接收文件并存储

    首先是一个views函数的例子 def get_user_profiles(request): if request.method == 'POST': myFile = request.FILES. ...

  9. python requests上传文件 tornado 接收文件

    requests 上传文件 import requests def images(): url = 'http://127.0.0.1:8889/upload/image' files = {'fil ...

随机推荐

  1. C# 普通的辅助类

    在数字前面补0 /// <summary> /// 在数字前面添加0 /// </summary> /// <param name="num"> ...

  2. http服务详解(1)

    前言:要熟练掌握一个服务,首先需要非常了解这个服务的工作过程. 跨网络的主机间通讯 在建立通信连接的每一端,进程间的传输要有两个标志: IP地址和端口号,合称为套接字地址 socket address ...

  3. (转载)关于FLASH寿命的读写方法

    NOR(或非)和NAND(与非)是市场上两种主要的Flash闪存,sNORFLASH 和CPU之间不需要其他电路控制,NOR flash可以芯片内执行程序,而NAND FLASH 和CPU 的接口必须 ...

  4. Linux命令——umask、setuid、setgid、sticky bit、chmod、chown

    umask 权限遮罩码,用于控制文件,文件夹的默认权限 文件默认权限:    666-umask 文件夹默认权限: 777-umask 管理员root:                  umask= ...

  5. 1.Hbase简介

    1. Hbase简介 1.1. 什么是hbase(面向列) HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模 结构化存储集群 ...

  6. split()函数实现

    #split函数实现: ss='** *axx* *bv** *ctt** **dff***' result=[] def split_1(ss,a,times=len(ss)): i=0 n=0 w ...

  7. tensorflow几个常见错误

    错误一:二分类,标签y ValueError: Cannot feed value of shape (128,1) for Tensor u'input_y_2:0', which has shap ...

  8. c++对象模型和RTTI(runtime type information)

    在前面已经探讨过了虚继承对类的大小的影响,这次来加上虚函数和虚继承对类的大小的影响. 先来回顾一下之前例子的代码: #include <iostream> using namespace ...

  9. 什么是调整后的R方

    当给模型增加自变量时,复决定系数也随之逐步增大,当自变量足够多时总会得到模型拟合良好,而实际却可能并非如此.于是考虑对R2进行调整,记为Ra2,称调整后复决定系数.R2=SSR/SST=1-SSE/S ...

  10. P3183 [HAOI2016]食物链[拓扑/记忆化搜索]

    题目来源:洛谷 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a ...