最近哥们问了我一个很奇怪的问题,通过下载接口获取的文件不在本地暂存,直接通过上传接口上传至服务器。
打开万能的度娘,逛了一圈发现像RestTemplate,HttpClient大部分都是以文件形式上传的,小部分太繁琐了,太长了懒得看,直到我发现OkHttp,真香,这里分享给大家。
- maven依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>5.0.0-alpha.2</version>
</dependency>
- 上传和下载代码
@RequestMapping(value = "download")
public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
String fileName = "a.txt";
//获取输入流对象(用于读文件)
FileInputStream fis = new FileInputStream(new File("C:\\Users\\123456\\Desktop", fileName));
//获取文件后缀(.txt)
String extendFileName = fileName.substring(fileName.lastIndexOf('.'));
//动态设置响应类型,根据前台传递文件类型设置响应类型
response.setContentType(request.getSession().getServletContext().getMimeType(extendFileName));
//设置响应头,attachment表示以附件的形式下载,inline表示在线打开
response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
//获取输出流对象(用于写文件)
ServletOutputStream os = response.getOutputStream();
//下载文件,使用spring框架中的FileCopyUtils工具
FileCopyUtils.copy(fis, os);
}
@RequestMapping("/upload")
public String upload(MultipartFile file) throws IOException {
//获取文件的原始名
String filename = file.getOriginalFilename();
System.out.println(filename);
String realPath = "C:\\Users\\123456\\Desktop\\测试计划";
file.transferTo(new File(realPath, filename));
return "success";
}
- 下载连接上传
public static void main(String[] args) throws Exception {
OkHttpClient okHttpClient = new OkHttpClient();
//获取下载文件
Request request = new Request.Builder()
.get()
.url("http://localhost:8080/test/download")
.build();
Response response = okHttpClient.newCall(request).execute();
//构造上传请求体
RequestBody requestBody = new RequestBody() {
@Override
public void writeTo(@NotNull BufferedSink bufferedSink) throws IOException {
//这里可根据需要改造
bufferedSink.write(response.body().bytes());
}
@Nullable
@Override
public MediaType contentType() {
return null;
}
};
//multipart/form-data 表单文件上传 .okhttp提供了MultipartBody的类型,方便你的快速创建multipart/form-data
MultipartBody multipartBody = new MultipartBody.Builder()
.addFormDataPart("file", "b.txt", requestBody)
.build();
//上传
Request request2 = new Request.Builder()
.post(multipartBody)
.url("http://localhost:8080/test/upload")
.build();
Response response2 = okHttpClient.newCall(request2).execute();
System.out.println(response2.body().string());
}
对你有帮助的话就点个赞吧!!!