restful api上传文件(基础)-springboot
基于restful api格式的文件上传(只是上传到本地):
package com.nxz.controller; import com.nxz.entity.FileInfo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import java.io.File;
import java.io.IOException;
import java.util.Date; @RestController
@RequestMapping("/file")
public class FileController {
@PostMapping
public FileInfo update(MultipartFile file) throws IOException { System.out.println(file.getName());
System.out.println(file.getOriginalFilename());
System.out.println(file.getSize()); String holder = "G:\\0001-myproject\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller"; File localFile = new File(holder, new Date().getTime() + ".txt"); file.transferTo(localFile); return new FileInfo(localFile.getAbsolutePath());
} }
测试用例:
//伪造的mvc环境
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void before() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void whenUploadSuccess() throws Exception {
String file = mockMvc.perform(MockMvcRequestBuilders.fileUpload("/file")
.file(new MockMultipartFile("file", "test.txt", "multipart/form-data", "hello".getBytes("UTF-8"))))
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn().getResponse().getContentAsString();
System.out.println(file);
}
测试用例执行完之后输出文件绝对路径:
{"path":"G:\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller\\1556463660034.txt"}
下载:
@GetMapping("/{id}")
public void downLoad(@PathVariable String id,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
String holder = "G:\\0001-myproject\\mysecurity\\mysecurity-demo\\src\\main\\java\\com\\nxz\\controller";
try (
InputStream inputStream = new FileInputStream(new File(holder, id + ".txt"));
OutputStream outputStream = response.getOutputStream();
) {
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename=test.txt");//重新定义下载后名称
//将文件输入流复制到输出刘超过年 commons-io依赖
IOUtils.copy(inputStream, outputStream);
outputStream.flush();
}
}
访问:http://localhost:8080/user/1

springboot中上传文件:
java中和文件上传的类又两个:CommonsMultipartResolver,另一个就是StandardServletMultipartResolver,其中commonsMultipartResolver需要commons-fileupload支持,二StandardServletMultipartReslover是servlet3.0默认支持的,tomcat7以上版本就开始支持servlet7.0,springboot22.0之后支持的tomcat版本在7之后,因此是支持StandardServletMultipartReslover的
首先 springboot只要配置好pom(有spring-boot-starter-web依赖),就能自动支持文件上传(包括单文件和多文件),那么springboot中文件上传是怎样起作用的
1、pom依赖,下边这些依赖中,和配置文件上传有关的就是spring-boot-autoconfig依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> ---->>> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency> ---->>>> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
2、那么看下spring-boot-autoconfig jar包中的spring.factories文件中的内容,这个文件中全都是和springboot自动配置相关的类的全文件名,其中和文件上传有关的是
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
3、进入这个类中(具体个各种autoconfiguration自动加载类是什么时候加载的,需要看springboot的启动来注解和启动类)
@Configuration
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class,
MultipartConfigElement.class }) //这个注解表示存在servlet、StandardServletMultipartResolver、multipartConfigElement文件时才加载该类
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)//配置文件的前缀
@ConditionalOnWebApplication(type = Type.SERVLET)//servlet
@EnableConfigurationProperties(MultipartProperties.class)//配置文件类
public class MultipartAutoConfiguration { private final MultipartProperties multipartProperties; public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
this.multipartProperties = multipartProperties;
} @Bean
@ConditionalOnMissingBean({ MultipartConfigElement.class,
CommonsMultipartResolver.class })//当没有commonsMultipartResolver文件时,初始化该bean
public MultipartConfigElement multipartConfigElement() {
return this.multipartProperties.createMultipartConfig();
} @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();//springboot默认的文件上传的类
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
} }
restful api上传文件(基础)-springboot的更多相关文章
- 演示如何通过 web api 上传文件MVC40
演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...
- php 下 html5 XHR2 + FormData + File API 上传文件
FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...
- 使用GitHub API上传文件及GitHub做图床
本文介绍GitHub API基础及上传文件到仓库API,并应用API将GitHub作为图床 GitHub API官方页面 GitHub API版本 当前版本为v3,官方推荐在请求头中显示添加版本标识. ...
- C# Web Api 上传文件
一. 使用默认方法上传文件: 1.Action: /// <summary> /// 上传文件 使用上传后的默认文件名称 /// 默认名称是BodyPart_XXXXXX,BodyPart ...
- 1.5 WEB API 上传文件
1.前提,设置跨域 2.在控制器头添加允许跨域 /// <summary> /// 文件管理口控制器 /// </summary> [EnableCors("*&qu ...
- HttpClient 测试web API上传文件实例
1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...
- 前端AngularJS后端ASP.NET Web API上传文件
本篇体验使用AngularJS向后端ASP.NET API控制器上传文件. 首先服务端: public class FilesController : ApiController { //usi ...
- .Net C#向远程服务器Api上传文件
Api服务代码一: /// <summary> /// 服务器接收接口 /// </summary> [HttpPost] [Route("ReceiveFile&q ...
随机推荐
- python 输入输出,file, os模块
Python 输入和输出 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout ...
- dapper利用DynamicParameters构建动态参数查询
public static int GetTotalLogin(string username,DateTime start, DateTime end) { using (var _connecti ...
- 使用火蜘蛛采集器Firespider采集天猫商品数据并上传到微店
有很多朋友都需要把天猫的商品迁移到微店上去.可在天猫上的商品数据非常复杂,淘宝开放接口禁止向外提供数据,一般的采集器对ajax数据采集的支持又不太好. 还有现在有了火蜘蛛采集器,经过一定的配置,终于把 ...
- Swift语法快速索引
在WWDC的演示中就可以看出来Swift这个更接近于脚本的语言可以用更少的代码量完成和OC同样的功能.但是对于像我一样在战争中学习战争的同学们来说,天天抱着笨Swift Programming Lan ...
- (转载)get和 post方法的不同
HTTP的Get/Post请求区别归纳 1. get是从服务器上获取数据,post是向服务器传送数据.g et 和 post只是一种传递数据的方式,get也可以把数据传到服务器,他们的本质都是发送请求 ...
- APUE(8)---进程控制(1)
一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...
- java爬虫入门
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- gulp-usemin 插件使用
关于什么是gulp,它和grunt有什么区别等问题,这里不做任何介绍.本文主要介绍如何使用gulp-usemin这款插件,同时也会简单介绍本文中用到的一些插件. 什么是gulp-usemin 用来将H ...
- 9、Semantic-UI之标题
9.1 定义基础的标题样式 在Semantic-UI中定义了5种标题样式,h1~h5. 示例:基础样式定义 <h1 class="ui header">一级标题&l ...
- 6、Semantic-UI之动画按钮样式
6.1 动画按钮样式 在Semantic-UI中提供了三种动画样按钮式表,分别为: 左右移动 上下移动 淡入淡出 在实际开发中,很少使用这种动画按钮,根据实际情况使用,强制使用到页面中反而不太适合 ...