通过RestTemplate
上传文件
1.上传文件File
碰到一个需求,在代码中通过HTTP方式做一个验证的请求,请求的参数包含了文件类型。想想其实很简单,直接使用定义好的MultiValueMap
,把文件参数传入即可。
我们知道,restTemplate 默认定义了几个通用的消息转换器,见org.springframework.web.client.RestTemplate#RestTemplate()
,那么文件应该对应哪种资源呢?
看了上面这个方法之后,可以很快联想到是ResourceHttpMessageConverter
,从类签名也可以看出来:
Implementation of {@link HttpMessageConverter} that can read/write {@link Resource Resources}
and supports byte range requests.
这个转换器主要是用来读写各种类型的字节请求的。
既然是Resource
,那么我们来看一下它的实现类有哪些:
以上是AbstractResource
的实现类,有各种各样的实现类,从名称上来说应该比较有用的应该是:InputStreamResource
和FileSystemResource
,还有ByteArrayResource
和 UrlResource
等。
1.1 使用FileSystemResource
上传文件
这种方式使用起来比较简单,直接把文件转换成对应的形式即可。
MultiValueMap<String, Object> resultMap = new LinkedMultiValueMap<>();
Resource resource = new FileSystemResource(file);
param.put("file", resource);
网上使用RestTemplate
上传文件大多数是这种方式,简单,方便,不用做过多的转换,直接传递参数即可。
但是为什么会写这篇博客来记录呢?因为,有一个不喜欢的地方就是,它需要传递一个文件。而我得到是文件源是一个流,我需要在本地创建一个临时文件,然后把InputStream
写入到文件中去。使用完之后,还需要把文件删除。
那么既然这么麻烦,有没有更好的方式呢?
1.2 使用InputStreamResource
上传文件
这个类的构造函数可以直接传入流文件。那么就直接试试吧!
MultiValueMap<String, Object> resultMap = new LinkedMultiValueMap<>();
Resource resource = new InputStreamResource(inputStream);
param.put("fi