访问一个上传图片的接口,给出了url和参数类型:
URL:xxxxxx
参数名 | 类型 | 描述 |
---|---|---|
token | String | 标记 |
file | MultipartFile | 待上传的文件 |
name | String | 文件名 |
理论中的返回值是个JSON:
参数名 | 类型 | 描述 |
---|---|---|
result | String | 错误码,1成功,其他失败 |
message | String | 描述信息 |
url | String | 文件的uri |
上传文件接口需要两种参数,MultipartFile文件类型参数和String类型参数。HTTP基础中,HTTP请求分为了消息头和消息体,头信息里面的Content-Type字段定义了消息体的请求格式,SpringMvc是按照请求头来解析消息内容的。
文件的请求头必须是multipart/form-data,而普通数据类型这里定为application/json。
构造两个ContentType,文件用文件流传输,请求头为multipart/form-data;
普通数据类型用字节流传输,请求头为application/json;
构造完放入放入一个httpEntity实例中发起请求
核心代码如下:
//把File类型转换为 MultipartFile类型
File file = new File(Path);
FileInputStream fileInputStream = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile(file.getPath(), file.getName(),APPLICATION_OCTET_STREAM.toString(), fileInputStream);
//上传图片请求
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(URL);//这里填写请求的URL
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//文件传输http请求头(multipart/form-data)
builder.addBinaryBody("file", multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA,
multipartFile.getOriginalFilename()); // 文件流
//字节传输http请求头(application/json)
ContentType contentType = ContentType.create("application/json", StandardCharsets.UTF_8);
builder.addTextBody("token", TOKEN, contentType); //字节流
builder.addTextBody("name", fileName, contentType); //字节流
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
//执行提交
HttpEntity responseEntity = response.getEntity();
String result = "";
if (responseEntity != null) {
//将响应内容转换为字符串
result = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);
}
//转换成map
Map<String, Object> map = ObjectMapperUtils.fromJson(result);
//得到下载文件的URL
String url = (String) map.get("url");
参考博客:
springboot进行httpclient接口请求,请求带文件MultipartFile和普通数据类型的解决方案