[英]Uploading image to server in Multipart along with JSON data in Android
我正在嘗試將圖像上傳到服務器以及從表單收集的一些JSON數據。
服務器有身份驗證。
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
最后一行應該是--xxxxxxxx--
,而不是--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);
}
我知道這篇文章已經有幾年了,但是我想在這里使用MultiPartEntity分享我的解決方案,作為HttpClient下載的一部分。 我使用的是版本4.2.5。
我最初使用了類似於上面的過程,直到我開始支持上傳視頻時才開始出現內存錯誤。 我在這里研究了很多帖子並得到了很多好主意。 我使用這里提供的Java Decompiler來查看Jar文件中的代碼,以弄清楚如何將它們組合在一起。
//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());
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;
}
}
您還可以看到一個例子在我的博客在這里
除非已經給出了這個答案......我找到了解決同樣問題的巧妙解決方案。 我在這里發布了它: https : //stackoverflow.com/questions/7595939/how-to-upload-multipart-image-data-in-json-request-android/
試試這個代碼很容易
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);
這是使用MultipartEntity上傳圖像和JSONArray的示例 - 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.