Android SDK के साथ मल्टीपार्ट अनुरोध पोस्ट करें


79

मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो मुझे लगा कि अपेक्षाकृत सरल होगा: एक छवि को एंड्रॉइड एसडीके के साथ सर्वर पर अपलोड करें। मुझे बहुत सारे उदाहरण कोड मिले हैं:

http://groups.google.com/group/android-developers/browse_thread/thread/f9e17bbaf50c5fc/46145fcacd450e48

http://linklens.blogspot.com/2009/06/android-multipart-upload.html

लेकिन न तो मेरे लिए काम करते हैं। जिस भ्रम में मैं भागता रहता हूं, वह यह है कि मल्टीपार्ट अनुरोध करने के लिए वास्तव में क्या आवश्यक है। Android के लिए मल्टीपार्ट अपलोड (छवि के साथ) करने का सबसे सरल तरीका क्या है ?

कोई भी मदद या सलाह बहुत सराहनीय होगी!


अब तक आपके द्वारा आजमाए गए तरीकों के साथ क्या समस्याएं हैं?
क्रिस्टोफर ओर

1
ओह, बहुत सारी समस्याएं। वर्तमान में फोटो पाने वाले से फोटो उर वापस लेने वाली फाइल में प्राप्त करने से मैं एक MultipartEntity से जुड़ सकता हूं। लेकिन मुझे यह भी पक्का नहीं है कि मल्टीपॉर्ट रिक्वेस्ट बनाने का यह सही तरीका है।
jpoz

जवाबों:


103

अपडेट 29 अप्रैल 2014:

मेरा उत्तर अब तक पुराना है और मुझे लगता है कि आप किसी प्रकार के उच्च स्तरीय पुस्तकालय जैसे कि रिट्रोफिट का उपयोग करना चाहते हैं ।


इस ब्लॉग के आधार पर मैं निम्नलिखित समाधान के साथ आया: http://blog.tacticalnuclearstrike.com/2010/01/using-multipartentity-in-android-applications/

आपको MultipartEntityचलने के लिए अतिरिक्त लाइब्रेरी डाउनलोड करनी होगी !

1) http://james.apache.org/download.cgi#Apache_Mime4J से httpcompents-client-4.1.zip डाउनलोड करें और अपने प्रोजेक्ट में अपाचे- mime4j-0.6.1.jar जोड़ें।

2) http://hc.apache.org/downloads.cgi से httpcompents-client-4.1-bin.zip डाउनलोड करें और अपने प्रोजेक्ट में httpclient-4.1.jar, httpcore-4.1.jar और httpmime-4.1.jar जोड़ें।

3) नीचे दिए गए उदाहरण कोड का उपयोग करें।

private DefaultHttpClient mHttpClient;


public ServerCommunication() {
    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    mHttpClient = new DefaultHttpClient(params);
}


public void uploadUserPhoto(File image) {

    try {

        HttpPost httppost = new HttpPost("some url");

        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
        multipartEntity.addPart("Title", new StringBody("Title"));
        multipartEntity.addPart("Nick", new StringBody("Nick"));
        multipartEntity.addPart("Email", new StringBody("Email"));
        multipartEntity.addPart("Description", new StringBody(Settings.SHARE.TEXT));
        multipartEntity.addPart("Image", new FileBody(image));
        httppost.setEntity(multipartEntity);

        mHttpClient.execute(httppost, new PhotoUploadResponseHandler());

    } catch (Exception e) {
        Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e);
    }
}

private class PhotoUploadResponseHandler implements ResponseHandler<Object> {

    @Override
    public Object handleResponse(HttpResponse response)
            throws ClientProtocolException, IOException {

        HttpEntity r_entity = response.getEntity();
        String responseString = EntityUtils.toString(r_entity);
        Log.d("UPLOAD", responseString);

        return null;
    }

}

4
मैं Android में MultipartEntity के साथ-साथ HttpMultipartClient लाइब्रेरी नहीं ढूँढ सकता। क्या आप कृपया मेरी मदद कर सकते हैं?
गुयेन मिन्ह बिनह

23
यह सही जवाब है। यह शर्म की बात है कि यह वर्ग एंड्रॉइड एसडीके में शामिल नहीं है।
चांदनीचौसी

2
आपको Apache-mime4j-0.6.1.jar की आवश्यकता क्यों है?
जेपीएम

5
किसी को भी अब फ़ाइलों का पहला सेट के लिए देख रहे हैं अब यहाँ हैं: psg.mtu.edu/pub/apache//james/mime4j
Keeano

5
समाधान के लिए धन्यवाद। हालांकि, MultipartEntityअब पदावनत कर दिया गया है। इस पोस्ट के MultipartEntityBuilderबजाय उपयोग करने के लिए देख रहे लोगों को मार्गदर्शन कर सकते हैं : stackoverflow.com/a/19188010/1276636
सूफियान

47

जैसा MultiPartEntityकि वंचित है । तो यहाँ यह करने का नया तरीका है! और आप केवल जरूरत है httpcore.jar(latest)और httpmime.jar(latest)उन्हें अपाचे साइट से डाउनलोड करें।

try
{
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(URL);

    MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
    entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

    entityBuilder.addTextBody(USER_ID, userId);
    entityBuilder.addTextBody(NAME, name);
    entityBuilder.addTextBody(TYPE, type);
    entityBuilder.addTextBody(COMMENT, comment);
    entityBuilder.addTextBody(LATITUDE, String.valueOf(User.Latitude));
    entityBuilder.addTextBody(LONGITUDE, String.valueOf(User.Longitude));

    if(file != null)
    {
        entityBuilder.addBinaryBody(IMAGE, file);
    }

    HttpEntity entity = entityBuilder.build();
    post.setEntity(entity);
    HttpResponse response = client.execute(post);
    HttpEntity httpEntity = response.getEntity();
    result = EntityUtils.toString(httpEntity);
    Log.v("result", result);
}
catch(Exception e)
{
    e.printStackTrace();
}

1
बिल्डर का उपयोग करने के लिए +1, क्योंकि प्रत्यक्ष तात्कालिकता पदावनत है।
npace

इस जवाब ने मुझे एक टन बचा लिया। धन्यवाद!
पियर्सनआर्टफोटो

@ मुहम्मद बाबर क्या आप मुझे बता सकते हैं कि यदि मैं एकाधिक छवि का उपयोग करके अपलोड करना चाहता हूं MultipartEntityBuilder?
मेन्मा

एक लूप के अंदर और फिर entityBuilder.addBinaryBody(key, file);सुनिश्चित करें कि कुंजी अद्वितीय है।
मुहम्मद बाबर

16
संकलन 'org.apache.httpcompenders: httpmime: 4.3.4' संकलन का उपयोग करें। org.apache.httpcompords: httpcore: 4.3.2 'Android स्टूडियो निर्भरता के लिए
टायलर डेविस

15

यहाँ LIGHT WEIGHTED सॉल्यूशन है जो मेरे लिए बिना किसी बाहरी HTTPCore और इस तरह के लिबास के साथ काम करता है। मैं 64K तरीकों के मुद्दे का सामना कर रहा था ताकि HTTPCore पुस्तकालयों से बचने के लिए कोई विकल्प न बचा हो

import java.util.List;

import java.io.BufferedReader;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

/**
 * This utility class provides an abstraction layer for sending multipart HTTP
 * POST requests to a web server.
 *
 * @author www.codejava.net
 */
public class MultipartUtility {
    private final String boundary;
    private static final String LINE_FEED = "\r\n";
    private HttpURLConnection httpConn;
    private String charset;
    private OutputStream outputStream;
    private PrintWriter writer;

    /**
     * This constructor initializes a new HTTP POST request with content type
     * is set to multipart/form-data
     *
     * @param requestURL
     * @param charset
     * @throws IOException
     */
    public MultipartUtility(String requestURL, String charset)
            throws IOException {
        this.charset = charset;

        // creates a unique boundary based on time stamp
        boundary = "===" + System.currentTimeMillis() + "===";

        URL url = new URL(requestURL);
        httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true); // indicates POST method
        httpConn.setDoInput(true);
        httpConn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);
        httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
        httpConn.setRequestProperty("Test", "Bonjour");
        outputStream = httpConn.getOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                true);
    }

    /**
     * Adds a form field to the request
     *
     * @param name  field name
     * @param value field value
     */
    public void addFormField(String name, String value) {
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                .append(LINE_FEED);
        writer.append("Content-Type: text/plain; charset=" + charset).append(
                LINE_FEED);
        writer.append(LINE_FEED);
        writer.append(value).append(LINE_FEED);
        writer.flush();
    }

    /**
     * Adds a upload file section to the request
     *
     * @param fieldName  name attribute in <input type="file" name="..." />
     * @param uploadFile a File to be uploaded
     * @throws IOException
     */
    public void addFilePart(String fieldName, File uploadFile)
            throws IOException {
        String fileName = uploadFile.getName();
        writer.append("--" + boundary).append(LINE_FEED);
        writer.append(
                "Content-Disposition: form-data; name=\"" + fieldName
                        + "\"; filename=\"" + fileName + "\"")
                .append(LINE_FEED);
        writer.append(
                "Content-Type: "
                        + URLConnection.guessContentTypeFromName(fileName))
                .append(LINE_FEED);
        writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
        writer.append(LINE_FEED);
        writer.flush();

        FileInputStream inputStream = new FileInputStream(uploadFile);
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
        inputStream.close();

        writer.append(LINE_FEED);
        writer.flush();
    }

    /**
     * Adds a header field to the request.
     *
     * @param name  - name of the header field
     * @param value - value of the header field
     */
    public void addHeaderField(String name, String value) {
        writer.append(name + ": " + value).append(LINE_FEED);
        writer.flush();
    }

    /**
     * Completes the request and receives response from the server.
     *
     * @return a list of Strings as response in case the server returned
     * status OK, otherwise an exception is thrown.
     * @throws IOException
     */
    public List<String> finish() throws IOException {
        List<String> response = new ArrayList<String>();

        writer.append(LINE_FEED).flush();
        writer.append("--" + boundary + "--").append(LINE_FEED);
        writer.close();

        // checks server's status code first
        int status = httpConn.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    httpConn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.add(line);
            }
            reader.close();
            httpConn.disconnect();
        } else {
            throw new IOException("Server returned non-OK status: " + status);
        }

        return response;
    }
}

प्रयोग

private void uploadMedia() {
        try {

            String charset = "UTF-8";
            File uploadFile1 = new File("/sdcard/myvideo.mp4");
            String requestURL = Data.BASE_URL+Data.URL_UPLOAD_REACTION_TEST;

            MultipartUtility multipart = new MultipartUtility(requestURL, charset);

//            multipart.addHeaderField("User-Agent", "CodeJava");
//            multipart.addHeaderField("Test-Header", "Header-Value");

            multipart.addFormField("friend_id", "Cool Pictures");
            multipart.addFormField("userid", "Java,upload,Spring");

            multipart.addFilePart("uploadedfile", uploadFile1);

            List<String> response = multipart.finish();

            Log.v("rht", "SERVER REPLIED:");

            for (String line : response) {
                Log.v("rht", "Line : "+line);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

अपलोड स्वीकार करने के लिए PHP कोड

<?php

    $friend_id = $_REQUEST['friend_id'];
    $userid = $_REQUEST['userid'];

    echo 'friend_id : '.$friend_id. ' userid '.$userid;

    move_uploaded_file($_FILES['uploadedfile']['tmp_name'], "./uploads/".$_FILES["uploadedfile"]["name"]);

?>

इस सीमा के लिए मेरे कोड ने 400 खराब अनुरोध सीमा = "===" + System.currentTimeMillis () + "+3"; फिर मैंने सीमा को सीमा के रूप में बदल दिया = "---" + System.currentTimeMillis (); तब बैक-एंड पर अनुरोध को ठीक से पार्स किया गया था।
प्रशांत

यह इतना जटिल क्यों है ...? कोई सवाल नहीं। बस गुस्सा आ रहा है कि इस माहौल में ऐसा करने में इतना समय लगता है।
Neo42

मैंने इसका उपयोग सफलता के साथ किया, लेकिन addFilePart () में अंतिम परिशिष्ट (LINEFEED) को हटाना पड़ा। धन्यवाद।
डेविड वुड

6

अधिक आसान, हल्का (32k), और कई और अधिक प्रदर्शन:

Android अतुल्यकालिक Http क्लाइंट लाइब्रेरी: http://loopj.com/android-async-http/

कार्यान्वयन:

वॉली के साथ Android में एक "मल्टीपार्ट / फॉर्म-डेटा" POST कैसे भेजें


लोज asynchttpclient lib कमाल है। लेकिन अगर आप एक साथ कई फाइलें अपलोड करना चाहते हैं तो यह विफल रहता है: एस
सेबस्टियन ब्रेइट

@Perroloco, बड़ी / एकाधिक फ़ाइलों के साथ सफल होने के लिए आपको टाइमआउट राशि बढ़ानी पड़ सकती है। डिफ़ॉल्ट टाइमआउट राशि बहुत कम हो सकती है। क्या आपने एक लंबी समयावधि के साथ यह कोशिश की है? क्योंकि मैं एक बार में लूपज के साथ कई फाइलें भेजने में सफल रहा हूं ...
क्रिस

thanx @Chris, मैंने इसे आज़माया लेकिन यह अभी भी विफल रहा है .. मैंने कई अनुरोधों को करके इसे प्रबंधित किया।
सेबेस्टियन ब्रेइट

1
लूपज के पास प्रगति दिखाने का कोई विकल्प नहीं है लेकिन फाइल बहुत अच्छी है
vuhung3990

धन्यवाद @Hpsatum पिछले 6 घंटे की समाप्ति से खोज, यह अच्छी तरह से काम करता है !!
इफ्तिखार उर्रहमान खान

3

इसे इस्तेमाल करे:

    public void SendMultipartFile() {
    Log.d(TAG, "UPLOAD: SendMultipartFile");
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost( <url> );

    File file = new File("/sdcard/spider.jpg");

    Log.d(TAG, "UPLOAD: setting up multipart entity");

    MultipartEntity mpEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    Log.d(TAG, "UPLOAD: file length = " + file.length());
    Log.d(TAG, "UPLOAD: file exist = " + file.exists());

    try {
        mpEntity.addPart("datafile", new FileBody(file, "application/octet"));
        mpEntity.addPart("id", new StringBody("1"));
    } catch (UnsupportedEncodingException e1) {
        Log.d(TAG, "UPLOAD: UnsupportedEncodingException");
        e1.printStackTrace();
    }

    httppost.setEntity(mpEntity);
    Log.d(TAG, "UPLOAD: executing request: " + httppost.getRequestLine());
    Log.d(TAG, "UPLOAD: request: " + httppost.getEntity().getContentType().toString());


    HttpResponse response;
    try {
        Log.d(TAG, "UPLOAD: about to execute");
        response = httpclient.execute(httppost);
        Log.d(TAG, "UPLOAD: executed");
        HttpEntity resEntity = response.getEntity();
        Log.d(TAG, "UPLOAD: respose code: " + response.getStatusLine().toString());
        if (resEntity != null) {
            Log.d(TAG, "UPLOAD: " + EntityUtils.toString(resEntity));
        }
        if (resEntity != null) {
            resEntity.consumeContent();
        }
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1
इसके लिए पिछले उदाहरण की तरह 3rd पार्टी लिब की जरूरत है
लस्सी किन्नुनेन

संकलित करें 'org.apache.httpcompenders: httpmime: 4.3.4' संकलन 'org.apache.httpcompenders: httpcore: 4.3.2' Android स्टूडियो निर्भरता के लिए
टायलर डेविस

3

मैं लूपज को बहुत सलाह देता हूं।

मैंने कई बार विभिन्न फ़ाइलों को एक साथ अपलोड करने के लिए सफलतापूर्वक उपयोग किया है, जिसमें विभिन्न माइम प्रकार शामिल हैं। बस यह करें:

File myVideo = new File("/path/to/myvideo.mp4");
File myPic = new File("/path/to/mypic.jpg");
RequestParams params = new RequestParams();
try {
  params.put("profile_picture", myPic);
  params.put("my_video", myVideo);
} catch(FileNotFoundException e) {}

बड़ी या कई फ़ाइलों के लिए आपको टाइमआउट राशि बढ़ानी पड़ सकती है, अन्यथा डिफ़ॉल्ट टाइमआउट का उपयोग किया जाता है जो बहुत कम हो सकता है:

client.setTimeout(500000) //make this the appropriate timeout in milliseconds

कृपया लूपज के पूर्ण विवरण के लिए इस लिंक को देखें और इसका उपयोग कैसे करें, अब तक सबसे आसान async http लाइब्रेरी मैं आया हूं:

http://loopj.com/android-async-http/ http://loopj.com/android-async-http/doc/com/loopj/android/http/AsyncHttpClient.html


1

अपनी सभी httpclient, httpmime निर्भरता निकालें और इस निर्भरता को जोड़ें compile 'commons-httpclient:commons-httpclient:3.1'। इस निर्भरता ने MultipartRequestEntity में बनाया है ताकि आप आसानी से एक या अधिक फाइलें सर्वर पर अपलोड कर सकें

public class FileUploadUrlConnection extends AsyncTask<String, String, String> {
private Context context;
private String url;
private List<File> files;

public FileUploadUrlConnection(Context context, String url, List<File> files) {
    this.context = context;
    this.url = url;
    this.files = files;
}

@Override
protected String doInBackground(String... params) {

    HttpClient client = new HttpClient();
    PostMethod post = new PostMethod(url);
    HttpClientParams connectionParams = new HttpClientParams();

    post.setRequestHeader(// Your header goes here );

    try {
        Part[] parts = new Part[files.size()];
        for (int i=0; i<files.size(); i++) {
            Part part = new FilePart(files.get(i).getName(), files.get(i));
            parts[i] = part;
        }

        MultipartRequestEntity entity = new MultipartRequestEntity(parts, connectionParams);

        post.setRequestEntity(entity);

        int statusCode = client.executeMethod(post);
        String response = post.getResponseBodyAsString();

        Log.v("Multipart "," "+response);
        if(statusCode == 200) {
            return response;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 
 return null;
}

आप अनुरोध और प्रतिक्रिया टाइमआउट भी जोड़ सकते हैं

client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);

1
public class Multipart{
    private final Map<String, String> headrs;
    private String url;
    private HttpURLConnection con;
    private OutputStream os;

    private String delimiter = "--";
    private String boundary = "TRR" + Long.toString(System.currentTimeMillis()) + "TRR";

    public Multipart (String url, Map<String, String> headers) {
        this.url = url;
        this.headrs = headers;
    }

    public void connectForMultipart() throws Exception {
        con = (HttpURLConnection) (new URL(url)).openConnection();
        con.setRequestMethod("POST");
        con.setDoInput(true);
        con.setDoOutput(true);
        con.setRequestProperty("Connection", "Keep-Alive");
        for (Map.Entry<String, String> entry : headrs.entrySet()) {
            con.setRequestProperty(entry.getKey(), entry.getValue());
        }
        con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        con.connect();
        os = con.getOutputStream();
    }

    public void addFormPart(String paramName, String value) throws Exception {
        writeParamData(paramName, value);
    }

    public void addFilePart(String paramName, String fileName, byte[] data) throws Exception {
        os.write((delimiter + boundary + "\r\n").getBytes());
        os.write(("Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + fileName + "\"\r\n").getBytes());
        os.write(("Content-Type: application/octet-stream\r\n").getBytes());
        os.write(("Content-Transfer-Encoding: binary\r\n").getBytes());
        os.write("\r\n".getBytes());

        os.write(data);

        os.write("\r\n".getBytes());
    }

    public void finishMultipart() throws Exception {
        os.write((delimiter + boundary + delimiter + "\r\n").getBytes());
    }


    public String getResponse() throws Exception {
        InputStream is = con.getInputStream();
        byte[] b1 = new byte[1024];
        StringBuffer buffer = new StringBuffer();

        while (is.read(b1) != -1)
            buffer.append(new String(b1));

        con.disconnect();

        return buffer.toString();
    }


    private void writeParamData(String paramName, String value) throws Exception {


        os.write((delimiter + boundary + "\r\n").getBytes());
        os.write("Content-Type: text/plain\r\n".getBytes());//;charset=utf-8
        os.write(("Content-Disposition: form-data; name=\"" + paramName + "\"\r\n").getBytes());
        ;
        os.write(("\r\n" + value + "\r\n").getBytes());


    }
}

फिर नीचे कॉल करें

Multipart multipart = new Multipart(url__, map);
            multipart .connectForMultipart();
multipart .addFormPart(entry.getKey(), entry.getValue());
multipart .addFilePart(KeyName, "FileName", imagedata);
multipart .finishMultipart();

0

मैं आयन लाइब्रेरी पुनः प्राप्त कर सकता हूं, जिसमें 3 निर्भरताएं हैं और आप इन तीन साइटों पर सभी तीन जार फाइलें पा सकते हैं:
https://github.com/koush/ion#jars (आयन और androidasync)

https://code.google.com/p/google-gson/downloads/list (gson)

try {
   Ion.with(this, "http://www.urlthatyouwant.com/post/page")
   .setMultipartParameter("field1", "This is field number 1")
   .setMultipartParameter("field2", "Field 2 is shorter")
   .setMultipartFile("imagefile",
        new File(Environment.getExternalStorageDirectory()+"/testfile.jpg"))
   .asString()
   .setCallback(new FutureCallback<String>() {
        @Override
        public void onCompleted(Exception e, String result) {
             System.out.println(result);
        }});
   } catch(Exception e) {
     // Do something about exceptions
        System.out.println("exception: " + e);
   }

यह async चलेगा और कॉलबैक को UI थ्रेड में निष्पादित किया जाएगा एक बार प्रतिक्रिया प्राप्त होने के बाद मैं दृढ़ता से पुनः प्राप्त करता हूं कि आप फ़ॉगर जानकारी के लिए https://github.com/koush/ion पर जाएं


0

यदि आप AOSP लाइब्रेरी का उपयोग कर रहे हैं, तो यहां एक सरल तरीका है Volley

Request<T>निम्नानुसार कक्षा का विस्तार करें-

public class MultipartRequest extends Request<String> {
    private static final String FILE_PART_NAME = "file";
    private final Response.Listener<String> mListener;
    private final Map<String, File> mFilePart;
    private final Map<String, String> mStringPart;
    MultipartEntityBuilder entity = MultipartEntityBuilder.create();
    HttpEntity httpentity;

    public MultipartRequest(String url, Response.ErrorListener errorListener,
                            Response.Listener<String> listener, Map<String, File> file,
                            Map<String, String> mStringPart) {
        super(Method.POST, url, errorListener);
        mListener = listener;
        mFilePart = file;
        this.mStringPart = mStringPart;
        entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        buildMultipartEntity();
    }

    public void addStringBody(String param, String value) {
        mStringPart.put(param, value);
    }

    private void buildMultipartEntity() {
        for (Map.Entry<String, File> entry : mFilePart.entrySet()) {
            // entity.addPart(entry.getKey(), new FileBody(entry.getValue(), ContentType.create("image/jpeg"), entry.getKey()));
            try {
                entity.addBinaryBody(entry.getKey(), Utils.toByteArray(new FileInputStream(entry.getValue())), ContentType.create("image/jpeg"), entry.getKey() + ".JPG");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        for (Map.Entry<String, String> entry : mStringPart.entrySet()) {
            if (entry.getKey() != null && entry.getValue() != null) {
                entity.addTextBody(entry.getKey(), entry.getValue());
            }
        }
    }

    @Override
    public String getBodyContentType() {
        return httpentity.getContentType().getValue();
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            httpentity = entity.build();
            httpentity.writeTo(bos);
        } catch (IOException e) {
            VolleyLog.e("IOException writing to ByteArrayOutputStream");
        }
        return bos.toByteArray();
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        Log.d("Response", new String(response.data));
        return Response.success(new String(response.data), getCacheEntry());
    }

    @Override
    protected void deliverResponse(String response) {
        mListener.onResponse(response);
    }
}

आप अनुरोध बना सकते हैं और जैसे जोड़ सकते हैं-

Map<String, String> params = new HashMap<>();
        params.put("name", name.getText().toString());
        params.put("email", email.getText().toString());
        params.put("user_id", appPreferences.getInt( Utils.PROPERTY_USER_ID, -1) + "");
        params.put("password", password.getText().toString());
        params.put("imageName", pictureName);
        Map<String, File> files = new HashMap<>();
        files.put("photo", new File(Utils.LOCAL_RESOURCE_PATH + pictureName));
        MultipartRequest multipartRequest = new MultipartRequest(Utils.BASE_URL + "editprofile/" + appPreferences.getInt(Utils.PROPERTY_USER_ID, -1), new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub
                Log.d("Error: ", error.toString());
                FugaDialog.showErrorDialog(ProfileActivity.this);
            }
        }, new Response.Listener<String>() {
            @Override
            public void onResponse(String jsonResponse) {
                JSONObject response = null;
                try {
                    Log.d("jsonResponse: ", jsonResponse);
                    response = new JSONObject(jsonResponse);

                } catch (JSONException e) {
                    e.printStackTrace();
                }
                try {
                    if (response != null && response.has("statusmessage") && response.getBoolean("statusmessage")) {
                        updateLocalRecord();

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                FugaDialog.dismiss();
            }

        }, files, params);
        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(multipartRequest);

0

पश्चाताप के लिए, मैंने उल्लेख किया गया okhttp नहीं देखा। संबंधित पोस्ट।

मूल रूप से आप एक MultipartBody.Builder का उपयोग करके शरीर का निर्माण करते हैं, और फिर एक अनुरोध में इसे पोस्ट करते हैं।

कोटलिन में उदाहरण:

    val body = MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart(
                "file", 
                file.getName(),
                RequestBody.create(MediaType.parse("image/png"), file)
            )
            .addFormDataPart("timestamp", Date().time.toString())
            .build()

    val request = Request.Builder()
            .url(url)
            .post(body)
            .build()

    httpClient.newCall(request).enqueue(object : okhttp3.Callback {
        override fun onFailure(call: Call?, e: IOException?) {
            ...
        }

        override fun onResponse(call: Call?, response: Response?) {
            ...
        }
    })

0

आप GentleRequest का उपयोग कर सकते हैं, जो http अनुरोध करने के लिए हल्का लाइब्रेरी है (DISCLAIMER: मैं लेखक हूं):

Connections connections = new HttpConnections();
Binary binary = new PacketsBinary(new 
BufferedInputStream(new FileInputStream(file)), 
   file.length());
//Content-Type is set to multipart/form-data; boundary= 
//{generated by multipart object}
MultipartForm multipart = new HttpMultipartForm(
    new HttpFormPart("user", "aplication/json", 
       new JSONObject().toString().getBytes()),
    new HttpFormPart("java", "java.png", "image/png", 
       binary.content()));
Response response = connections.response(new 
    PostRequest(url, multipart));
if (response.hasSuccessCode()) {
    byte[] raw = response.body().value();
    String string = response.body().stringValue();
    JSONOBject json = response.body().jsonValue();
 } else {

 }

इसे बेझिझक देखें : https://github.com/Iprogrammerr/Gentle-Request

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.