如何使用MultipartEntityBuilder和HttpURLConnection在android中发送图像和JSON对象数据?

时间:2015-10-09 15:19:41

标签: android

由于API级别22 android弃用了HTTP客户端和多部件构建器。我想通过使用MultipartEntityBuilder和HttpURLConnection在单个请求中在服务器上发送一些JSON对象和图像。

3 个答案:

答案 0 :(得分:1)

  

用于Android的Apache HttpClient 4.3端口旨在解决这个问题   通过提供与谷歌兼容的官方版本的情况   机器人。

     

鉴于从Android API 23开始,谷歌的HttpClient分叉已经存在   删除此项目已经停止。

     

想要在Android上继续使用Apache HttpClient的用户   建议考虑

针对Android API 22及更早版本的适用于Android的Apache HttpClient 4.3端口

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

适用于Android的Apache HttpClient软件包,由Marek Sebera在针对Android API 23及更新版本时维护

dependencies {
    compile group: 'cz.msebera.android' , name: 'httpclient', version: '4.4.1.1'
}

取自 Apache官方网站Apache HttpClient for Android

注意:您不必使用useLibrary 'org.apache.http.legacy'语句,该语句是针对未从Android提供的HttpClient类迁移的项目引入的。进一步explanation

我已使用Volley 实施了{{3>} MultipartRequest(文件上传)。

答案 1 :(得分:1)

我已使用下面的代码,使用Multipart Entity Builder和HttpOpenUrl连接成功发送了图像文件和JSON数据。

        String boundary = "*************";
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        FileBody fileBody = new FileBody(new File(image));//pass your image path to make a file
        builder.addPart("profile_image", fileBody);
        builder.addPart("data", new StringBody(jsonObject.toString(), ContentType.TEXT_PLAIN));//pass our jsonObject  here
        HttpEntity entity = builder.build();

        URL url = null;

        try {
            url = new URL("write your url here");
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(10000);
            urlConnection.setReadTimeout(10000);
            urlConnection.setDoOutput(true);
            urlConnection.setRequestMethod("POST");
            urlConnection.addRequestProperty("Content-length", entity.getContentLength() + "");
            urlConnection.addRequestProperty(entity.getContentType().getName(), entity.getContentType().getValue());
            OutputStream os = urlConnection.getOutputStream();
            entity.writeTo(urlConnection.getOutputStream());
            os.close();
            urlConnection.connect();
            InputStream inputStream = urlConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String s = "";
            StringBuilder stringBuilder = new StringBuilder("");
            while ((s = bufferedReader.readLine()) != null) {
                stringBuilder.append(s);
            }
            serverResponseMessage = stringBuilder.toString();

答案 2 :(得分:0)

与我的评论一起,由于Apache22对来自API22的librabry的弃用,建议您使用HttpUrlConnection,OkHttp ...而不是。

您应该阅读更多Apache HTTP Client Removal

有关多部分请求的OkHttp示例,请参阅its GitHub documentation here

希望这有帮助!