Skip to content Skip to sidebar Skip to footer

Posting A Multipart Request With Image In Android?

I am trying to post a JSON representation of my object and an optional image to my Spring backend. However, I am having major trouble posting a request with an image. I have manage

Solution 1:

The code illustrates how to send a file (here it is pdf). Go through it, it will be helpful for you to debug your code.

int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
FileInputStream fileInputStream = new FileInputStream(file);

dos.writeBytes(twoHyphens + boundary + lineEnd); 
dos.writeBytes("Content-Disposition: form-data; name=\"attachment_0\";filename=\"" + file.getName() + "\"" + lineEnd);
dos.writeBytes("Content-Type: text/pdf" + lineEnd);
dos.writeBytes("Content-Length: " + file.length() + lineEnd);    
dos.writeBytes(lineEnd);        
bytesAvailable = fileInputStream.available(); 
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);  

while (bytesRead > 0) 
{             
    dos.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
}   

dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
fileInputStream.close();
}

//for sending a parameter, see below, key is the key of the webservice parameter.

dos.writeBytes("Content-Disposition: form-data; name=\""+key+"\"" + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(requestData.get(key).toString() + lineEnd);

Solution 2:

Below is my implementation of a MULTIPART form data upload using HttpURLConnection class. This class employs a Dynamic usage so that multiple request can be invoked at a time with different sets of data. NB: I'm breaking the json part into individual text forms inorder to maintain consistency with my server. You may modify it to match your servers requirement.

publicclassWebConnector {
Stringboundary="-------------" + System.currentTimeMillis();
privatestaticfinalStringLINE_FEED="\r\n";
privatestaticfinalStringTWO_HYPHENS="--";


private StringBuilder url;
private String protocol;
private HashMap<String, String> params;
private JSONObject postData;
private List<String> fileList;
privateintcount=0;
private DataOutputStream dos;

publicWebConnector(StringBuilder url, String protocol,
                    HashMap<String, String> params, JSONObject postData) {
    super();
    this.url = url;
    this.protocol = protocol;
    this.params = params;
    this.postData = postData;
    createServiceUrl();
}

publicWebConnector(StringBuilder url, String protocol,
                    HashMap<String, String> params, JSONObject postData, List<String> fileList) {
    super();
    this.url = url;
    this.protocol = protocol;
    this.params = params;
    this.postData = postData;
    this.fileList = fileList;
    createServiceUrl();
}

public String connectToMULTIPART_POST_service(String postName) {


    System.out.println(">>>>>>>>>url : " + url);

    StringBuilderstringBuilder=newStringBuilder();

    StringstrResponse="";
    InputStreaminputStream=null;
    HttpURLConnectionurlConnection=null;

    try {
        urlConnection = (HttpURLConnection) newURL(url.toString()).openConnection();
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestProperty("Connection", "close");
        urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 ( compatible ) ");
        urlConnection.setRequestProperty("Authorization", "Bearer " + Config.getConfigInstance().getAccessToken());
        urlConnection.setRequestProperty("Content-type", "multipart/form-data; boundary=" + boundary);

        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);
        urlConnection.setChunkedStreamingMode(1024);
        urlConnection.setRequestMethod("POST");
        dos = newDataOutputStream(urlConnection.getOutputStream());

        Iterator<String> keys = postData.keys();
        while (keys.hasNext()) {
            try {
                Stringid= String.valueOf(keys.next());
                addFormField(id, "" + postData.get(id));
                System.out.println(id + " : " + postData.get(id));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        try {
            dos.writeBytes(LINE_FEED);
            dos.flush();
            dos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (fileList != null && fileList.size() > 0 && !fileList.isEmpty()) {
            for (inti=0; i < fileList.size(); i++) {

                Filefile=newFile(fileList.get(i));
                if (file != null) ;
                addFilePart("photos[" + i + "][image]", file);
            }
        }
        // forming th java.net.URL object

        build();
        urlConnection.connect();
        intstatusCode=0;
        try {
            urlConnection.connect();
            statusCode = urlConnection.getResponseCode();
        } catch (EOFException e1) {
            if (count < 5) {
                urlConnection.disconnect();
                count++;
                Stringtemp= connectToMULTIPART_POST_service(postName);
                if (temp != null && !temp.equals("")) {
                    return temp;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 200 represents HTTP OKif (statusCode == HttpURLConnection.HTTP_OK) {
            inputStream = newBufferedInputStream(urlConnection.getInputStream());
            strResponse = readStream(inputStream);
        } else {
            System.out.println(urlConnection.getResponseMessage());
            inputStream = newBufferedInputStream(urlConnection.getInputStream());
            strResponse = readStream(inputStream);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != inputStream)
                inputStream.close();
        } catch (IOException e) {
        }
    }
    return strResponse;
}

publicvoidaddFormField(String fieldName, String value) {
    try {
        dos.writeBytes(TWO_HYPHENS + boundary + LINE_FEED);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"" + LINE_FEED + LINE_FEED/*+ value + LINE_FEED*/);
        /*dos.writeBytes("Content-Type: text/plain; charset=UTF-8" + LINE_FEED);*/
        dos.writeBytes(value + LINE_FEED);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

publicvoidaddFilePart(String fieldName, File uploadFile) {
    try {
        dos.writeBytes(TWO_HYPHENS + boundary + LINE_FEED);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\";filename=\"" + uploadFile.getName() + "\"" + LINE_FEED);
        dos.writeBytes(LINE_FEED);

        FileInputStreamfStream=newFileInputStream(uploadFile);
        intbufferSize=1024;
        byte[] buffer = newbyte[bufferSize];
        intlength= -1;

        while ((length = fStream.read(buffer)) != -1) {
            dos.write(buffer, 0, length);
        }
        dos.writeBytes(LINE_FEED);
        dos.writeBytes(TWO_HYPHENS + boundary + TWO_HYPHENS + LINE_FEED);
    /* close streams */
        fStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

publicvoidaddHeaderField(String name, String value) {
    try {
        dos.writeBytes(name + ": " + value + LINE_FEED);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

publicvoidbuild() {
    try {
        dos.writeBytes(LINE_FEED);
        dos.flush();
        dos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

privatestatic String readStream(InputStream in) {
    StringBuildersb=newStringBuilder();
    try {
        BufferedReaderreader=newBufferedReader(newInputStreamReader(in));
        StringnextLine="";
        while ((nextLine = reader.readLine()) != null) {
            sb.append(nextLine);
        }
    /* Close Stream */if (null != in) {
            in.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return sb.toString();
}

privatevoidcreateServiceUrl() {
    if (null == params) {
        return;
    }
    final Iterator<Map.Entry<String, String>> it = params.entrySet().iterator();
    booleanisParam=false;
    while (it.hasNext()) {
        final Map.Entry<String, String> mapEnt = (Map.Entry<String, String>) it.next();
        url.append(mapEnt.getKey());
        url.append("=");
        try {
            url.append(URLEncoder.encode(mapEnt.getValue(), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        url.append(WSConstants.AMPERSAND);
        isParam = true;
    }
    if (isParam) {
        url.deleteCharAt(url.length() - 1);
    }
}

}

Post a Comment for "Posting A Multipart Request With Image In Android?"