Android HTTP multipart/form-data 请求协议信息实现图片上传

问题:
Android应用中,遇到填写用户信息、发表评论等操作,不可避免会遇到“form表单操作”(类似web form操作)上传图片的功能。
在这种情况下,使用Android的HTTPConnection/ ApacheHTTP 通过POST 和GET的方式就实现不了。
解决方法:

Android客户端通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传。

一、文件头类型

            Map<String, String> head = new HashMap<>();
            head.put("Content-Type", "multipart/form-data");

二、将图片评论等放到文件列表中

以下只是举例将多张图片放到文件中

List<File> fileList=new ArrayList<File>();
for(int i=0;i<imgAdapter.getData().size();i++){
    String curPhotoName=System.currentTimeMillis()+"";
    File file=new File(imgAdapter.getData().get(i));
    fileList.add(comPressedFile(file));
    pictureNumber++;
    }

三、http请求

    public  static void post_file( final String url, final Map<String, String> head, final Map<String, Object> param, List<File> files, String name, okhttp3.Callback callback) {
        OkHttpClient client = new OkHttpClient();
        // form 表单形式上传
        MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);

        if (files != null) {
            for(int i=0;i<files.size();i++){
                // MediaType.parse() 里面是上传的文件类型。
                RequestBody body = RequestBody.create(MediaType.parse("image/jpg"),  files.get(i));
                String filename = files.get(i).getName();
                // 参数分别为, 请求key ,文件名称 , RequestBody
                requestBody.addFormDataPart(name,  files.get(i).getName(), body);
            }
        }

        if (param != null) {
            // map 里面是请求中所需要的 key 和 value
            for (Map.Entry entry : param.entrySet()) {
                requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue()));
            }
        }
        final Request.Builder builder = new Request.Builder().url(url);
        if (head != null) {
            // map 里面是请求中所需要的 key 和 value
            for (Map.Entry entry : head.entrySet()) {
                builder.addHeader(valueOf(entry.getKey()), valueOf(entry.getValue()));
            }
        }
        Request request = builder.url(url).post(requestBody.build()).tag(MyApplication.getApp().getApplicationContext()).build();

        // readTimeout("请求超时时间" , 时间单位);
        client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(callback);
    }

猜你喜欢

转载自blog.csdn.net/qq_27155755/article/details/89642210