Trong cách tiếp cận của tôi, tôi đã sử dụng org.apache.http.entity.mime.MultipartEntity và thêm vào tên tệp hình ảnh dưới dạng FileBody
entity.addPart("image_" + photo_count, new FileBody(
new File(failed.getFilenames()[i])));
sau đó chuyển MultiPartEntity cho HttpPost. Tôi chưa đăng mã đầy đủ vì nó có vô số nhận xét và mã không liên quan đến câu hỏi của bạn. Bằng cách chuyển hình ảnh dưới dạng FileBody, có thể lấy hình ảnh bằng mã xử lý tệp php đứng (Xem bên dưới).
if ((!empty($_FILES[$im])) && ($_FILES[$im]['error'] == 0)) {
$newname = dirname(__FILE__) . '/../photo/' . $campaign . '/' . $fn;
if (!file_exists($newname)) {
if (move_uploaded_file($_FILES[$im]['tmp_name'], $newname)) {
//$resp = "The file " . $fn . " has been uploaded";
//printf("%s", $resp);
} else {
$error = $error + 1;
}
}else{
//image file already exists
$error = $error + 1;
}
} else {
$error = $error +1;
}
Đối với mục đích của tôi, đoạn mã trên nằm trong một vòng lặp khi tôi xử lý nhiều hình ảnh
$im = 'image_' . $i;
đề cập đến tên của hình ảnh trong thực thể.
Xin lỗi vì bài viết ngắn, tôi gấp rút thời gian.
Quên đề cập đến lý do tại sao tôi không sử dụng phương pháp tiếp cận chuỗi Base64 là nó giới hạn kích thước của hình ảnh mà bạn có thể gửi. Cách tiếp cận FileBody trong thực thể là cách tiếp cận tốt nhất mà tôi tìm thấy.
Bạn có thể chuyển các chuỗi bằng cách sử dụng:
entity.addPart("address", new StringBody(failed[0].getAddress()));
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 20000); // Timeout
MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("address", new StringBody("my address example"));
entity.addPart("image_0", new FileBody(new File("filename of image")));
HttpPost post = new HttpPost("server address");
post.setEntity(entity);
HttpResponse response = client.execute(post);