Retrofit 2.x图文混传,Servlet后台处理图片上传方法

前端处理

客户端采用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 {

    }
}

猜你喜欢

转载自blog.csdn.net/mingc0758/article/details/80202013
今日推荐