如何在 Android 中使用 Multipart?

How can I use Multipart in Android?

我想一次上传多张图片。 所以我找到了 '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。怎么了..?谢谢

您的代码可以摆脱已弃用的 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'

public static UploadResult upload(final Bitmap 位图, final 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;
}