web-dev-qa-db-ja.com

AndroidのJSONデータとともにマルチパートのサーバーに画像をアップロードする

フォームから収集された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 protected]","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
12
ReachmeDroid
/**
 * 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);



}
4
ReachmeDroid

最後の行は、--xxxxxxxx--ではなく--xxxxxxxxである必要があります。

4
Bert

この投稿が数年前のものであることは知っていますが、httpClientダウンロードの一部として利用可能な ここ からMultiPartEntityを使用してソリューションを共有したいと思います。バージョン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());
3
Paul B
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;
    }
} 

私のブログでも例を見ることができます ここ

2
Mukesh Y

車輪の再発明をしないでください! ApacheHttpClientはあなたの要求を実装しました。

データを送信するAndroid JSONHttpClient PHP HttpResponseを使用するサーバー

グーグル運!

2
Bert

これは、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();
    }
0
Imeshke

このコードを試してみるのは簡単です

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", "ä[email protected]");
                        urlObject.put("user_pass", "123456");


postAsync(URL, "php function name", urlObject, imageFile); 
0
Nur Gazi

この答えがすでに与えられていない限り...私はこの同じ問題のきちんとした解決策を見つけました。ここに投稿しました: https://stackoverflow.com/questions/7595939/how-to-upload-multipart-image-data-in-json-request-Android/

0
michel.iamit