Uploading image to server in Multipart along with JSON data in Android
I am trying to upload an image to a server along with some JSON data that is collected from a form.
The server has authenti开发者_如何学运维cation.
METHOD: post
HEADERS:
Authorization Basic d2Vic2VydmljZTpyM05hdTE3Rw==
Content-Type multipart/form-data;boundary=xxxxxxxx
BODY:
--xxxxxxxx
Content-Disposition: form-data; name="jsonFile"
Content-Type: application/json
{"model":"Premium","deviceLongitude":4.79337638,"pseudo":"nickname","deviceLatitude":45.7671507,"year":"2005","email":"email@mail.com","deviceLocale":"fr_FR","title":"my picture"}
--xxxxxxxx
Content-Disposition: form-data; name="imgName"
Content-Type: image/jpeg
//Image data array
/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAAB
AAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAB4KAD
AAQAAAABAAACgAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQH/wAARCAKAAeADAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAA
AAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF
--xxxxxxxx
The last line should be --xxxxxxxx--
, and not --xxxxxxxx
.
/**
* This utility function will upload the file to the Url
* * @param filePath - absolute path of the file to be uploaded
* @param postUrl - Remote Url where the file need to be posted
* @param contentType - content-type of the uploaded file
* @throws Exception
*/
public static void postFile(String filePath, String postUrl,
String pictureTitleStr, String pseudoTextStr)
throws Exception {
String url = postUrl;
HttpURLConnection conn = null;
final String CrLf = "\r\n";
JSONObject json = new JSONObject();
int bytesRead = 0;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "xxxxxxxx";
String EndBoundary = "";
int maxBufferSize = 1 * 1024 * 1024;
HttpResponse response = null;
// Having HttpClient to respond to both HTTP and HTTPS url connection by accepting the urls along with keystore / trust certificates
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUserAgent(params, "YourAppName/1.1");
HttpConnectionParams.setStaleCheckingEnabled(params, false);
HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);
HttpConnectionParams.setSoTimeout(params, 20 * 1000);
HttpConnectionParams.setSocketBufferSize(params, 8192);
HttpClientParams.setRedirecting(params, false);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(
params, registry);
mHttpClient = new DefaultHttpClient(ccm, params);
} catch (Exception e) {
}
String base64EncodedCredentials = Base64.encodeToString((userName + ":" + password).getBytes("US-ASCII"),
Base64.DEFAULT);
System.out.println("Encoded Credit " + base64EncodedCredentials);
json.put("pseudo", pseudoTextStr);
json.put("title", pictureTitleStr);
String jsonStr = json.toString();
// System.out.println("JSON VALUE " + jsonStr);
URL url2 = new URL(postUrl);
Bitmap bm = BitmapFactory.decodeFile(filePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 25, baos); // bm is the bitmap object
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
String str = twoHyphens + boundary + lineEnd;
String str2 = "Content-Disposition: form-data; name=\"jsonFile\"";
String str3 = "Content-Type: application/json";
String str4 = "Content-Disposition: form-data; name=\"imgName\"";
String str5 = "Content-Type: image/jpeg";
String str6 = twoHyphens + boundary + twoHyphens;
String StrTotal = str + str2 + "\r\n" + str3 + "\r\n" +"\r\n" + jsonStr + "\r\n" + str
+ str4 + "\r\n" + str5 + "\r\n"+"\r\n"+ encodedImage + "\r\n" + str6;
//System.out.print("Multipart request string is "+StrTotal);
HttpPost post = new HttpPost(postUrl);
post.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(
userName, password), "UTF-8", false));
post.addHeader("Content-Type","multipart/form-data;boundary="+boundary);
// System.out.println("Sending Post proxy request: " + post);
StringEntity se = new StringEntity(StrTotal);
se.setContentEncoding("UTF-8");
post.setEntity(se);
response = mHttpClient.execute(post);
/* Checking response */
statusCode = response.getStatusLine().getStatusCode();
System.out.println("Http Execute finish " + statusCode);
HttpEntity entity = response.getEntity();
String getResponseText = entity.toString(); // EntityUtils.toString(entity);
System.out.println(" Post Response Text from Server : "
+ getResponseText);
}
I know this post is a couple of years old, but I'd like to share my solution using MultiPartEntity from here available as part of the HttpClient download. I used version 4.2.5.
I originally used a process similar to above, which worked well until I started getting memory errors when I started supporting uploading of videos. I researched a lot of posts here and got a lot of good ideas. I used the Java Decompiler available here to look at the code in the Jar file to figure out how to put things together.
//filepath is passed in like /mnt/sdcard/DCIM/100MEDIA/VIDEO0223.mp4
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
String json = "{your_json_goes_here}";
File media = new File(filePath);
URI uri = your_uri_goes_here;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(uri);
StringBody jsonBody = new StringBody(json, "application/json", null);
FormBodyPart jsonBodyPart = new FormBodyPart("json", jsonBody);
String mimeType;
if (requestCode == Constants.ACTION_TAKE_VIDEO) {
mimeType = "video/" + extension;
} else {
// default to picture
mimeType = "image/" + extension;
}
FileBody fileBody = new FileBody(media, mimeType, "ISO-8859-1");
FormBodyPart fileBodyPart = new FormBodyPart(fileName, fileBody);
MultipartEntity mpEntity = new MultipartEntity(null, "xxBOUNDARYxx", null);
mpEntity.addPart(jsonBodyPart);
mpEntity.addPart(fileBodyPart);
post.addHeader("Content-Type", "multipart/mixed;boundary=xxBOUNDARYxx");
post.setEntity(mpEntity);
HttpResponse response = httpClient.execute(post);
InputStream data = response.getEntity().getContent();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(data));
String responseLine;
StringBuilder responseBuilder = new StringBuilder();
while ((responseLine = bufferedReader.readLine()) != null) {
responseBuilder.append(responseLine);
}
System.out.println("Response: " + responseBuilder.toString());
Do not reinvent the wheel! The Apache HttpClient have implemented your requires.
Android JSON HttpClient to send data to PHP server with HttpResponse
Goog luck!
public static boolean uploadImage(final byte[] imageData, String filename ,String message) throws Exception{
String responseString = null;
PostMethod method;
String auth_token = Preference.getAuthToken(mContext);
method = new PostMethod("http://10.0.2.20/"+ "upload_image/" +Config.getApiVersion()
+ "/" +auth_token);
org.apache.commons.httpclient.HttpClient client = new
org.apache.commons.httpclient.HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(
100000);
FilePart photo = new FilePart("icon",
new ByteArrayPartSource( filename, imageData));
photo.setContentType("image/png");
photo.setCharSet(null);
String s = new String(imageData);
Part[] parts = {
new StringPart("message_text", message),
new StringPart("template_id","1"),
photo
};
method.setRequestEntity(new
MultipartRequestEntity(parts, method.getParams()));
client.executeMethod(method);
responseString = method.getResponseBodyAsString();
method.releaseConnection();
Log.e("httpPost", "Response status: " + responseString);
if (responseString.equals("SUCCESS")) {
return true;
} else {
return false;
}
}
You can also see an Example on my blog Here
Unless this answer has already be given... I found a neat solution for this same problem. I posted it over here: https://stackoverflow.com/questions/7595939/how-to-upload-multipart-image-data-in-json-request-android/
Try this Code it's easy
public String postAsync(String url, String action, JSONObject jsonObject, String fileUri) throws JSONException {
String result = "";
try {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.STRICT);
File file = new File(fileUri);
entityBuilder.addPart("file", new FileBody(file));
entityBuilder.addTextBody(DMConstant.ACTION_JSON, action);
entityBuilder.addTextBody(DMConstant.DATA_JSON, jsonObject.toString(), ContentType.create("application/json", Consts.UTF_8));
HttpEntity entity = entityBuilder.build();
httpPost.setEntity(entity);
HttpResponse httpResponse = httpClient.execute(httpPost);
InputStream inputStream = httpResponse.getEntity().getContent();
if (inputStream != null) {
result = dmUtils.convertStreamToString(inputStream);
} else {
Log.i("Input Stream is Null", "Input Stream is Null");
}
} catch (UnsupportedEncodingException e) {
Log.e("Unsupported Encoding", e.getMessage());
} catch (ClientProtocolException e) {
Log.e("Client Protocol", e.getMessage());
} catch (IOException e) {
Log.e("IOException", e.getMessage());
}
Log.i("JSON Object as Response", result);
return result;
}
........
JSONObject urlObject = new JSONObject();
urlObject.put("userName", "user name");
urlObject.put("email_id", "äbc@gmail.com");
urlObject.put("user_pass", "123456");
postAsync(URL, "php function name", urlObject, imageFile);
This is an example to upload image and JSONArray using MultipartEntity-- lib:org.apache.http.entity.mime
List <Entity> students = getStudentList();
MultipartEntity studentList = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
for(int i=0; i<students.size();i++){
try {
studentList.addPart("studentList[][name]", new StringBody(String.valueOf(students.get(i).getName())));
studentList.addPart("studentList[][addmission_no]", new StringBody(String.valueOf(students.get(i).getAddmissionNo)));
studentList.addPart("studentList[][gender]", new StringBody(String.valueOf(students.get(i).getGender)));
File photoImg = new File(students.get(i).getImagePath());
studentList.addPart("studentList[][photo]",new FileBody(photoImg,"image/jpeg"));
}catch(Exception e){
e.getMessage();
}
}
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
post.addHeader("X-Auth-Token", mUserToken);
post.setEntity(studentList);
org.apache.http.HttpResponse response = null;
try {
response = client.execute(post);
} catch (IOException e) {
e.printStackTrace();
}
HttpEntity httpEntity = response.getEntity();
JSONObject myObject;
try {
String result = EntityUtils.toString(httpEntity);
// do your work
} catch (IOException e) {
e.printStackTrace();
}
精彩评论