如何在 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;
}
我想一次上传多张图片。 所以我找到了 '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;
}