本文文件上传使用是RestTemplate,之前也使用过HttpURLConnection上传过,不过这种方式比较繁琐,所有最后综合使用RestTemplate。
本文案例。
项目环境:springboot+maven+mybatis
客户端代码:
import com.alibaba.fastjson.JSON;import mons.codec.digest.DigestUtils;import org.springframework.core.io.FileSystemResource;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.client.SimpleClientHttpRequestFactory;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class fileUpload {/*** 发送post请求远程服务器* @param serviceUrl:远程服务器接口地址* @param filePath:文件存在地址* @param fileName:文件名称* @param json:参数* @return*/public static String restTemplateTransferFilePost(String serviceUrl,String filePath,String fileName,JSON json) throws IOException {/* //大文件时SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();//这是为tru时最大为10485760字节,文件过大会抛出java.io.IOException: Error writing to server,大文件设置为falserequestFactory.setBufferRequestBody(false);RestTemplate restTemplate = new RestTemplate(requestFactory);*///小文件时RestTemplate restTemplate = new RestTemplate();//设置请求头HttpHeaders headers = new HttpHeaders();MediaType type = MediaType.parseMediaType("multipart/form-data");headers.setContentType(type);String path=filePath+"/"+fileName;String fileMd5= DigestUtils.md5Hex(new FileInputStream(new File(path)));// 建立需要上传的资源对象FileSystemResource fileSystemResource = new FileSystemResource(path);//设置请求体,注意是LinkedMultiValueMapMultiValueMap<String, Object> form = new LinkedMultiValueMap<>();// 指定上传文件所对应的字段及资源form.add("file", fileSystemResource);form.add("filename",fileName);form.add("parameterJson",json);form.add("fileMd5",fileMd5);//用HttpEntity封装整个请求报文HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);String s = restTemplate.postForObject(serviceUrl, files, String.class);return s;}
服务器代码:
服务端是自己写来测试的,代码没有精简,也可以使用MultipartFile来接收
@RequestMapping("/receive")public String receive(HttpServletRequest request, HttpServletResponse response) throws Exception {//获取参数String parameterJson=request.getParameter("parameterJson");// 判断enctype属性是否为multipart/form-databoolean isMultipart = ServletFileUpload.isMultipartContent(request);if (!isMultipart) {throw new IllegalArgumentException("上传内容不是有效的multipart/form-data类型.");}String targetPath="";try {//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());//检查form中是否有enctype="multipart/form-data"if (multipartResolver.isMultipart(request)) {//将request变成多部分requestMultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;//获取multiRequest 中所有的文件名Iterator iter = multiRequest.getFileNames();while (iter.hasNext()) {//一次遍历所有文件MultipartFile file = multiRequest.getFile(iter.next().toString());if (file != null) {SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");String time = df.format(new Date());//文件上传地址:JCPTConstants.FILE_SERVER_ABS_ROOT_PATH这个是保存地址,改成自己的保存地址String path = JCPTConstants.FILE_SERVER_ABS_ROOT_PATH + time + file.getOriginalFilename();//上传file.transferTo(new File(path));//我是用是nginx,JCPTConstants.File_Server_IP+JCPTConstants.File_Server_ROOT此地址是Nginx地址,改成自己的地址targetPath=JCPTConstants.File_Server_IP+JCPTConstants.File_Server_ROOT+time + file.getOriginalFilename();response.setCharacterEncoding("UTF-8");response.getWriter().println(200);}}}}catch (Exception e){throw new IllegalArgumentException("上传失败");}return null;}
我这里使用springboot,如果是接收大文件,则需要在启动类上加上以下代码
/*** 文件上传配置* @return*/@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();//单个文件最大factory.setMaxFileSize("10240000KB"); //KB,MB/// 设置总上传数据总大小factory.setMaxRequestSize("102400000KB");return factory.createMultipartConfig();}
参考地址:
Spring Boot——多文件上传大小超限问题解决
spring的RestTemplate使用指南