前端处理
客户端采用Retrofit进行图文上传,包括JSON格式的String类型和File类型的图片文件
- 接口定义
interface Need {
/**
* 添加需求记录
* @param writeOff
* @return
*/
@POST("Need/addWriteOff")
@Multipart
Observable<ResultBean> submitWriteOffRecord(@Part("writeOff") RequestBody writeOff, @Part MultipartBody.Part signFile);
}
- 参数生成
//JSON字符串
RequestBody part1 = RequestBody.create(MediaType.parse("text/plain;charset=UTF-8"), new Gson().toJson(writeOff));
//签名文件
MultipartBody.Part part2 = MultipartBody.Part.createFormData("file", "signFile", RequestBody.create(MediaType.parse("image/*"), signFile));
- 执行
public static Disposable submitWriteOffRecord(WriteOff writeOff, File signFile, final Callback<String> callback) {
//JSON字符串
RequestBody part1 = RequestBody.create(MediaType.parse("text/plain;charset=UTF-8"), new Gson().toJson(writeOff));
//签名文件
MultipartBody.Part part2 = MultipartBody.Part.createFormData("file", "signFile", RequestBody.create(MediaType.parse("image/*"), signFile));
Observable<ResultBean> observable = RetrofitUtil.getRetrofit().create(Need.class).submitWriteOffRecord(part1, part2);
return observable.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<ResultBean>() {
@Override
public void accept(ResultBean resultBean) throws Exception {
if (resultBean.getCode() == 1) {
callback.onCallback(resultBean.getMsg());
} else {
callback.onError(resultBean.getMsg());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
callback.onError(throwable.getMessage());
}
});
}
- 抓包效果
POST http://192.168.1.103:8080/Need/addWriteOff HTTP/1.1
Content-Type: multipart/form-data; boundary=451bfa39-85f0-4459-83bc-efc6e49f2315
Content-Length: 5422
Host: 192.168.1.103:8080
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.6.0
--451bfa39-85f0-4459-83bc-efc6e49f2315
Content-Disposition: form-data; name="writeOff"
Content-Transfer-Encoding: binary
Content-Type: text/plain;charset=UTF-8
Content-Length: 139
{"amount":1,"id":0,"needId":188,"reasonText":"把all咯哦的路上","submitTime":"2018-05-05 00:23","submitUser":"陈铭","type":"退货"}
--451bfa39-85f0-4459-83bc-efc6e49f2315
Content-Disposition: form-data; name="file"; filename="signFile"
Content-Type: image/*
Content-Length: 4897
<图片的字节流>
后台处理
后台需要使用SmartUpload.jar包,读取JSON字符串并解析,保存图片文件到本地
public class AddWriteOffServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//设置utf8编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setHeader("content-type","text/html;charset=UTF-8");
try {
//初始化
SmartUpload smartUpload = new SmartUpload();
smartUpload.initialize(this.getServletConfig(), request, response);
smartUpload.upload("utf-8");
//获取writeOff数据的json字符串
String json = smartUpload.getRequest().getParameter("writeOff");
System.out.println("json:" + json);
//将json转成对象
WriteOff writeOff = new Gson().fromJson(json, WriteOff.class);
//获取文件信息并保存
Files files = smartUpload.getFiles();
for (int i = 0; i < files.getCount(); i++) {
com.jspsmart.upload.File file = files.getFile(i);
System.out.println("fileName:" + file.getFileName());
System.out.println("fieldName:" + file.getFieldName());
System.out.println("上传文件大小:" + Util.fileSizeConver(file.getSize()));
//获取随机字符串
String name = UUID.randomUUID().toString();
//保存路径
String savePath = this.getServletContext().getRealPath(Constant.UPLOAD_PATH) + "/" + name + ".jpg";
//保存
file.saveAs(savePath);
System.out.println("保存成功:" + savePath);
writeOff.setSignPic(savePath);
}
boolean result = NeedDataHelper.insertWriteOff(writeOff.getNeedId(), writeOff);
if (result) {
ResultBean resultBean = new ResultBean(1, "ok");
response.getWriter().write(JSONObject.fromObject(resultBean).toString());
} else {
ResultBean resultBean = new ResultBean(-1, "插入数据库失败!");
response.getWriter().write(JSONObject.fromObject(resultBean).toString());
}
} catch (SmartUploadException e) {
e.printStackTrace();
System.out.println("保存失败!");
ResultBean resultBean = new ResultBean(-1, e.getMessage());
response.getWriter().write(JSONObject.fromObject(resultBean).toString());
}
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}
}