HttpClient 实现文件上传中转
最近项目开发中遇到一个需求,出于存储统一以及服务器安全的考虑,需要把上传的文件中转到另外一个服务器进行存储,也就是APP上传图片到A服务器的接口,由A将图片信息转发到B服务器的接口,B服务器提供一个接收文件的接口进行最终存储。
调试发现A项目中Java层面调用B的接口的返回状态是200,是OK的,但是图片并没有在B服务器上存储成功。
应该是A请求B的时候重新构造POST请求没有头信息Header的缘故,结合google的结果,最终调试成功了。
不多说,上demo代码!
public Object httpClientUploadFile(ttpServletRequest request, String type) {
final String remote_url = "xxx.xx.xxx.xxx";//图片存储的地址
List
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
try {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//获取multiRequest 中所有的文件名
Iterator iter = multiRequest.getFileNames();
//只处理一个文件
if (iter.hasNext()) {
MultipartFile file = multiRequest.getFile(iter.next().toString());
if (file == null) {
return ReturnMessage.error(-1, "请选择要上传的文件。");
}
String fileName = file.getOriginalFilename().toLowerCase().trim();
if (!fileName.endsWith(".jpg") && !fileName.endsWith(".png")) {
return ReturnMessage.error(-2, "请上传JPG或PNG格式的图片。");
}
//限制大小最大为800K
if (file.getSize() >1024 * 1024 * 10) {
return ReturnMessage.error(-3, "文件大小超出限制,最大不能超过10MB。");
}
Map
HttpPost httpPost = new HttpPost(remote_url);
ContentBody files = new ByteArrayBody(file.getBytes(), fileName);
// 对请求的表单域进行填充
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("file", files);
if (params != null) {//这里处理values[](可优化)
for (String key : params.keySet()) {
String[] values = params.get(key);
for (int i = 0; i
String value = values[i];
try {
value = URLEncoder.encode(value, "UTF-8");
reqEntity.addPart(key, new StringBody(value));
} catch (UnsupportedEncodingException e) {
logTask.addMsg(this.getClass().getName(),"upload/apply","UnsupportedEncodingException:"+e.getMessage());
e.printStackTrace();
}
}
}
}
// 设置请求
httpPost.setEntity(reqEntity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
logTask.addMsg(this.getClass().getName(),"upload/apply","response:"+response.getStatusLine());
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
// 将响应内容转换为字符串
result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
logTask.addMsg(this.getClass().getName(),"upload/apply","result:"+result);
if (null == result) {
return ReturnMessage.error(-4, "上传失败:地址错误。");
}else {
JSONObject jsonObject = JSONObject.parseObject(result);
if (jsonObject.getInteger("code") != null && jsonObject.getInteger("code").equals(200)) {
//这里根据目标服务器项目的返回值自己判断
returnList.add(jsonObject.getString("msg"));
}else {
return ReturnMessage.error(-5, "上传失败:数据异常。");
}
}
return RF.instance().createReturnList(returnList);
}
}
} catch (IOException e) {
logTask.addMsg(this.getClass().getName(),"upload/apply","IOException:"+e.getMessage());
return ReturnMessage.error(-6, "上传失败:文件异常。");
} catch (Exception e) {
logTask.addMsg(this.getClass().getName(),"upload/apply","Exception:"+e.getMessage());
return ReturnMessage.error(-7, "上传失败:操作发生错误。");
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return RF.instance().createReturnList(returnList);
}
上一篇:SHA256加密方法