经过长时间的死磕,终于解决了调用第三方接口上传file类型图片的问题,接口要求的是上传file类型的文件,用传统的方法第三方接口总是返回图片格式错误,下面是解决方案:
public static JSONObject sendPostWithFile(String requestUrl, Map<String, String> params, MultipartFile upload) {
String responseContent = null;
File file = null;
//httpclients构造post请求
// CloseableHttpClient httpClient = HttpClients.createDefault();
try {
file = FileUtil.multipartFileToFile(upload);
String path = file.getAbsolutePath();
String token = params.get("access_token");
String appid = params.get("_appid");
String dealerid = params.get("dealerid");
String key = params.get("key");
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("access_token",token)
.addFormDataPart("_appid",appid)
.addFormDataPart("dealerid",dealerid)
.addFormDataPart("key",key)
.addFormDataPart("imagefile",upload.getOriginalFilename(),
RequestBody.create(MediaType.parse("image/*"),
new File(path)))
.addFormDataPart("serialnum","1")
.build();
Request request = new Request.Builder()
.url(requestUrl)
.method("POST", body)
.addHeader("Content-Type", "multipart/form-data")
.build();
Response response = client.newCall(request).execute();
if (response.body() == null) {
logger.error("接口访问异常:"+requestUrl);
return null;
}
return JSONObject.parseObject(response.body().string());
// HttpPost httpPost = new HttpPost(requestUrl);
// //HttpMultipartMode.RFC6532参数的设定是为避免文件名为中文时乱码
// MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
// String originFileName = upload.getOriginalFilename();
// //post请求中的其他参数
// if(null != params) {
// for (Map.Entry<String, String> entry : params.entrySet()) {
// builder.addTextBody(entry.getKey(),entry.getValue());
// }
// file = FileUtil.multipartFileToFile(upload);
// builder.addBinaryBody("imagefile", file, ContentType.APPLICATION_OCTET_STREAM,originFileName);
// }
// HttpEntity entity = builder.build();
// httpPost.setEntity(entity);
// // 执行提交
// HttpResponse response = httpClient.execute(httpPost);
// //接收调用外部接口返回的内容
// HttpEntity responseEntity = response.getEntity();
// if (response.getStatusLine().getStatusCode() == 200){
// responseContent = EntityUtils.toString(response.getEntity(),"UTF-8");
// // 转换为map
// return JSON.parseObject(responseContent);
// }else {
// logger.error("接口访问异常:"+requestUrl);
// }
} catch (Exception e) {
logger.error("HttpUtil=====Start");
logger.error(e.getMessage(),e);
logger.error("HttpUtil=====End");
}finally {//处理结束后关闭httpclient的链接
// try {
// httpClient.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
if (file != null) {
boolean delete = file.delete();
if (delete) {
logger.error("删除成功!");
}
}
}
return null;
}
FileUtil工具类:
/**
* MultipartFile 转 File
*
* @param file
* @throws Exception
*/
public static File multipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
//获取流文件
private static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
关键代码的下部分是用的传统方式,具体原因是第三方的接口规定了图片流类型是image的,所以导致返回格式错误,改为image/*就好了(参考文章:https://blog.csdn.net/Hu_wenpeng/article/details/105492603)