【问题标题】:How can I use Multipart in Android?如何在 Android 中使用 Multipart?
【发布时间】:2016-11-29 11:58:40
【问题描述】:

我想一次上传多张图片。 所以我找到了“MultipartEntityBuilder”,但效果不佳。

这是我的来源...

public void executeMultipartPost() throws Exception {
    try {

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setCharset(Charset.forName("UTF-8"));
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);  
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        byteArray = byteArrayOutputStream.toByteArray();


        builder.addTextBody("file1", byteArray.toString());
        builder.addTextBody("file2", byteArray2.toString());

        // send
        InputStream inputStream = null;
        HttpClient httpClient = AndroidHttpClient.newInstance("Android");
        HttpPost httpPost = new HttpPost(UPLOAD_URL);
        httpPost.setEntity(builder.build());
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        inputStream = httpEntity.getContent();

        // response
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        StringBuilder stringBuilder = new StringBuilder();
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line + "\n");
        }
        inputStream.close();

        // result
        String result = stringBuilder.toString();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

调试时,'httpPost.setEntity(builder.build())' 这一行是错误的。

并且没有'Caused by~',而是Process: NoSuchFiledError in logcat...

但我认为我将图像制作为位图,然后将其发送到 FTP。怎么了..?谢谢。

【问题讨论】:

    标签: android upload multipart


    【解决方案1】:

    您的代码可以摆脱 MultipartEntity 的弃用代码并使用 MultipartEntityBuilder。然而,这里相关的具体问题是核心 Android 库与新添加的库冲突。现在也有可用的 Maven 存储库。您可以在以下文件中尝试以下代码:

    build.grade (Module:app)
    compile('org.apache.httpcomponents:httpmime:4.3.6') {
        exclude module: 'httpclient'
    }
    
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
    

    Getting NoSuchFieldError INSTANCE org/apache/http/message/BasicHeaderValueParser

    【讨论】:

    • 嗯...你的意思是版本完全不同??我将更改为 4.3.6。但我正在使用eclipse-android ...所以我需要jar。我会尝试!!谢谢。
    • 天啊...谢谢各位!!
    • 我确定这是我的荣幸。正如许多人所说,你节省了我的时间。哈哈祝你有美好的一天!
    【解决方案2】:

    public static UploadResult upload(final Bitmap bitmap, final Context context) {

        StringBuilder builder = new StringBuilder();
        UploadResult result = null;
        try {
            URL uri = new URL(context.getString(R.string.base_url) + context.getString(R.string.api_upload));
            HttpURLConnection con = (HttpURLConnection) uri.openConnection();
            con.setConnectTimeout(20000);
            con.setReadTimeout(20000);
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);
    
            con.setRequestProperty("Charset", "UTF-8");
            con.setRequestProperty("connection", "keep-alive");
            String BOUNDARY = UUID.randomUUID().toString();
            String LINE_END = "\r\n";
            String PREFIX = "--";
            con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY);
    
            OutputStream os = con.getOutputStream();
    
            String sb = PREFIX +
                    BOUNDARY +
                    LINE_END +
                    "Content-Disposition: form-data; name=\"file\"; filename=\"tmp.png\"" + LINE_END +
                    "Content-Type: application/octet-stream; charset=UTF-8" + LINE_END +
                    LINE_END;
    
            os.write(sb.getBytes());
            os.write(Util.Bitmap2Byte(bitmap));
    
            os.write(LINE_END.getBytes());
            byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
            os.write(end_data);
    
            os.flush();
            os.close();
            int code = con.getResponseCode();
            System.out.println("code:" + code);
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
    
            if (code == 200) {
                String ch;
                while (null != (ch = br.readLine())) {
                    builder.append(ch);
                }
            }
            con.disconnect();
    
            String response = builder.toString();
            if (!response.isEmpty()) {
                result = JSON.parseObject(response, UploadResult.class);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return result;
    }
    

    【讨论】:

    • 是http响应,可以改成String,如果response是json或者xml,UploadResult就是response entity
    • JSON是fastjson,也可以改成gson
    • 知道了。谢谢!我也要试试!!谢谢! :)
    • 嗯...我咩!我可以再问一件事吗??我要上传多个!!但这段代码只是一个位图。但我想一次发送超过 10 个位图.... T_T
    • 我只是多放点'os.write(Util.Bitmap2Byte(bitmap));' ??
    猜你喜欢
    • 2022-01-20
    • 2013-06-24
    • 2017-06-12
    • 1970-01-01
    • 2021-11-21
    • 2019-11-25
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多