使用HttpClient上传文件
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.12</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.12</version> </dependency>
方式一:
public static String sendPostFile(String url, String fileName , Map<String,String> headers) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create(); //设置参数 File file = new File(fileName); multipartEntityBuilder.addBinaryBody("file",file); multipartEntityBuilder.addTextBody("comment", "this is comment"); HttpEntity httpEntity = multipartEntityBuilder.build(); httpPost.setEntity(httpEntity); RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000).build(); httpPost.setConfig(requestConfig); // 请求头 if (headers != null && headers.size() > 0) { Iterator<String> iterator = headers.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); String value = (String) headers.get(key); if (key != null && !"".equals(value)) { httpPost.setHeader(key, value); } } } CloseableHttpResponse execute = httpclient.execute(httpPost); int statusCode = execute.getStatusLine().getStatusCode(); if (statusCode == 200) { HttpEntity entity = execute.getEntity(); String string = EntityUtils.toString(entity); return string; } } catch (IOException e) { e.printStackTrace(); } return null; }
方式二:
public static String sendPostFile3(String url, String fileName , Map<String,String> headers) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); // 参数 FileBody file = new FileBody(new File(fileName)); StringBody comment = new StringBody("This is comment", ContentType.TEXT_PLAIN); HttpEntity httpEntity = MultipartEntityBuilder.create() .addPart("file",file) .addPart("comment",comment) .build(); httpPost.setEntity(httpEntity); RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000).build(); httpPost.setConfig(requestConfig); // 设置请求头信息 if (headers != null && headers.size() > 0) { Iterator<String> iterator = headers.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); String value = (String) headers.get(key); if (key != null && !"".equals(value)) { httpPost.setHeader(key, value); } } } CloseableHttpResponse execute = httpclient.execute(httpPost); int statusCode = execute.getStatusLine().getStatusCode(); if (statusCode == 200) { HttpEntity entity = execute.getEntity(); String string = EntityUtils.toString(entity); return string; } } catch (IOException e) { e.printStackTrace(); } return null; }
数据接收:
import java.io.File; import java.io.FileOutputStream; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; @Controller public class UploadTest { /** 发送请求时指定了名称,file和 comment,可以使用MultipartFile 接收 也可以使用注解指定名称,如@RequestParam(name="file") MultipartFile uploadFile */ @ResponseBody @RequestMapping("/upload") public String upload(MultipartFile file , String comment) { try { System.out.println("fileLength : " + file.getSize()); System.out.println("fileName : " + file.getOriginalFilename()); System.out.println("comment : " + comment); file.transferTo(new File("D://" + file.getOriginalFilename())); } catch (Exception e) { e.printStackTrace(); } return "ok"; } }
如果上传时没有指定名称,如下操作:
public static String sendPostFile(String url, String fileName , Map<String,String> headers) { try { CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); File file = new File(fileName); FileEntity fileEntity = new FileEntity(file); httpPost.setEntity(fileEntity); /** * 设置请求头信息 */ if (headers != null && headers.size() > 0) { Iterator<String> iterator = headers.keySet().iterator(); while (iterator.hasNext()) { String key = iterator.next(); String value = (String) headers.get(key); if (key != null && !"".equals(value)) { httpPost.setHeader(key, value); } } } CloseableHttpResponse execute = httpclient.execute(httpPost); int statusCode = execute.getStatusLine().getStatusCode(); if (statusCode == SUCCESS) { HttpEntity entity = execute.getEntity(); String string = EntityUtils.toString(entity); return string; } } catch (IOException e) { e.printStackTrace(); } return null; }
接收的时候就无法使用MultipartFile对象接收,只用使用数据流方式接收,文件名可以通过header传递,此种方式很不方便
import java.io.File; import java.io.FileOutputStream; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; @Controller public class UploadTest { @ResponseBody @RequestMapping("/upload") public String upload(HttpServletRequest request ) { try { int contentLength = request.getContentLength(); System.out.println("contentLength : " + contentLength); File file2 = new File("D://" + request.getHeader("name")) ; FileOutputStream os = new FileOutputStream(file2) ; ServletInputStream inputStream = request.getInputStream(); byte[] bytes = new byte[1024]; int len = 0; while ((len = inputStream.read(bytes)) > 0) { os.write(bytes, 0, len); os.flush(); } os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } return "ok"; } }