HttpClient 实现文件上传中转

发表时间:2018-11-02 12:15:55点击:764

最近项目开发中遇到一个需求,出于存储统一以及服务器安全的考虑,需要把上传的文件中转到另外一个服务器进行存储,也就是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";//图片存储的地址

ListreturnList = new ArrayList<>();//返回的结果

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 params = new HashMap(request.getParameterMap());

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加密方法