领导让我写一个转发外壳,用来转发和响应用户,对自身请求不做处理。
之前一直都是json风格的文本信息。然后告诉我需要上传图片,但是文本的格式上传就会失败。
解决思路:
1、判断请求类型是否是上传图片的请求
//判断请求是否是上传图片请求
String contentType = request.getContentType();
if (contentType.startsWith(“multipart/form-data”)) {
try {
return this.uploadImg(request);
} catch (Exception e) {
// e.printStackTrace();
OkResponseWrap okResponseWrap = new OkResponseWrap();
okResponseWrap.setCode(404);
okResponseWrap.setBody(“上传失败!”);
return okResponseWrap;
}
2、调用 uploadImg方法把数据放到请求体里面,然后封装成MultipartBody.Builder通过from表单提交数据。然后及时做出响应
/**
- 发起post请求,参数为json
- @param request
- @return
*/
private OkResponseWrap post(HttpServletRequest request) {
//获取请求路径
String requestUrl = request.getRequestURI().toString();
//判断请求是否是上传图片请求
String contentType = request.getContentType();
if (contentType.startsWith("multipart/form-data")) {
try {
return this.uploadImg(request);
} catch (Exception e) {
// e.printStackTrace();
OkResponseWrap okResponseWrap = new OkResponseWrap();
okResponseWrap.setCode(404);
okResponseWrap.setBody("上传失败!");
return okResponseWrap;
}
} else {
//获取请求体
String jsonParams = HttpHelper.getBodyString(request);
//构造请求体
//StringBuffer remoteUrl = new StringBuffer(this.transmitProperties.getRemoteUrl() + requestUrl.replaceFirst(this.transmitProperties.getHostUrl(), ""));
StringBuffer remoteUrl = judgeRequestUrl(requestUrl);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=ut-8"), jsonParams);
Request.Builder builder = new Request.Builder().url(remoteUrl.toString()).post(requestBody);
Request okRequest = this.createOkRequest(builder, request);
//发起请求
return this.getRemoteResponse(okRequest, request);
}
private OkResponseWrap uploadImg(HttpServletRequest request) throws IOException, ServletException {
//获取请求路径
String requestUrl = request.getRequestURI();
//获取请求头
Enumeration headerNames = request.getHeaderNames();
//获取请求参数
Map<String, String[]> queries = request.getParameterMap();
StringBuffer sb = this.buildRemoteUrlWithParam(requestUrl, queries);
//key-value格式根据key获取上传文件
Part file = request.getPart(“files”);
//获取value-上传图片的名字
String name = file.getSubmittedFileName();
//读取文件
byte[] imageBuf = new byte[(int) file.getSize()];
file.getInputStream().read(imageBuf);
RequestBody filebody = MultipartBody.create(MediaType.parse(“image/png”), imageBuf);
MultipartBody.Builder multiBuilder = new MultipartBody.Builder();
//这里是 封装上传图片参数
multiBuilder.addFormDataPart(“files”, name, filebody);
//参数以添加header方式将参数封装,否则上传参数为空
// 设置请求体
multiBuilder.setType(MultipartBody.FORM);
MultipartBody multiBody = multiBuilder.build();
Request okRequest = new Request.Builder().url(sb.toString()).post(multiBody).build();
OkResponseWrap remoteResponse = getRemoteResponse(okRequest, request);
return remoteResponse;
}