package com.example.hystrix.controller;
import org.springframework.core.io.FileSystemResource;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.io.File;public classDemo{public voiduploadTest() {
String url= "http://localhost:8080/upload"; //上传的地址
String filePath = "D:/test/test.mp4";
RestTemplate rest= newRestTemplate();
FileSystemResource resource= new FileSystemResource(newFile(filePath));
MultiValueMap param = new LinkedMultiValueMap<>();
param.add("file", resource); //MultipartFile的名称
String restResult = rest.postForObject(url, param, String.class);
System.out.println(restResult);
}
}
另一种方式,代码片段:
MultiValueMap param = new LinkedMultiValueMap<>();
FileSystemResource resource= new FileSystemResource(newFile(filePath));
param.add("file", resource);
HttpHeaders headers= newHttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity> requestEntity = new HttpEntity<>(param, headers);
RestTemplate rest= newRestTemplate();
String restResult= rest.postForObject(url, requestEntity, String.class);
---------------------------------------------
发现一个问题,/download这个POST接口,@QueryParam这个注解虽然是post请求但是不会以body里的内容传参,而是用parameter传参,也就是get请求的传参方式
使用RestTemplate.postForObject无法调用,报错:Only resource methods using @FormParam will work as expected
@POST
@Path("/download")
@Produces(MediaType.APPLICATION_OCTET_STREAM)public Response download(@QueryParam("attachmentId") String attachmentId, @Context HttpServletResponse response) {
}
所以我改用httpclient,调用POST成功
/***@paramurl
* 下载路径
*@paramdownloadDir
* 下载存放目录*/
public static voiddownloadFile(String url, String downloadDir) {
File file= newFile(downloadDir);if (!file.exists()) { //如果文件不存在则下载
CloseableHttpClient httpclient =HttpClients.createDefault();try{
HttpPost httpPost= newHttpPost(url);
httpPost.addHeader("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);
CloseableHttpResponse response=httpclient.execute(httpPost);try{if (HttpStatus.SC_OK ==response.getStatusLine().getStatusCode()) {
HttpEntity entity=response.getEntity();if (entity != null) {
InputStream in=entity.getContent();
OutputStream out= newFileOutputStream(file);int size = 0;int lent = 0;byte[] buf = new byte[1024];while ((size = in.read(buf)) != -1) {
lent+=size;
out.write(buf,0, size);
}
in.close();
out.close();
}
EntityUtils.consume(entity);
}else{
logger.error("文件下载失败" +url);
}
}finally{
response.close();
}
}catch(Exception e) {
e.printStackTrace();
}finally{try{
httpclient.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}