Multipart HTTP Requests

4 votes · 9 comments

Wrote this snippet to learn more about HTTP Multipart Requests behaviors. Part of an OAUTH client for a REST HTTP service, headaches with Multipart Requests to get the signatures to match before.

raw ·
copy
· download
public String multipartRequest(String urlTo, String post, String filepath, String filefield) throws ParseException, IOException { HttpURLConnection connection = null; DataOutputStream outputStream = null; InputStream inputStream = null; String twoHyphens = "--"; String boundary = "*****"+Long.toString(System.currentTimeMillis())+"*****"; String lineEnd = "\r\n"; String result = ""; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1*1024*1024; String[] q = filepath.split("/"); int idx = q.length - 1; try { File file = new File(filepath); FileInputStream fileInputStream = new FileInputStream(file); URL url = new URL(urlTo); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary); outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"" + filefield + "\"; filename=\"" + q[idx] +"\"" + lineEnd); outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd); outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); outputStream.writeBytes(lineEnd); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer, 0, bufferSize); while(bytesRead > 0) { outputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } outputStream.writeBytes(lineEnd); // Upload POST Data String[] posts = post.split("&"); int max = posts.length; for(int i=0; i<max;i++) { outputStream.writeBytes(twoHyphens + boundary + lineEnd); String[] kv = posts[i].split("="); outputStream.writeBytes("Content-Disposition: form-data; name=\"" + kv[0] + "\"" + lineEnd); outputStream.writeBytes("Content-Type: text/plain"+lineEnd); outputStream.writeBytes(lineEnd); outputStream.writeBytes(kv[1]); outputStream.writeBytes(lineEnd); } outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); inputStream = connection.getInputStream(); result = this.convertStreamToString(inputStream); fileInputStream.close(); inputStream.close(); outputStream.flush(); outputStream.close(); return result; } catch(Exception e) { Log.e("MultipartRequest","Multipart Form Upload Error"); e.printStackTrace(); return "error"; } } private String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); }
Add a comment

9 Comments

Thank you, very useful!

BTW, in my app, I've added a "filetype" parameter, to be able to send other formats than only image/jpeg.

Reply · March 8, 2012, 4:07 p.m.

Only I want to say is thank you.....

Reply · March 15, 2012, 10:28 a.m.

Really Superb, Thank u

Reply · June 26, 2013, 10:13 a.m.

Hello, really cool example, that allows in PHP to fetch the File.

But i've a problem with the content-type audio/mp4, the transfered file is 59 byte smaller than the orginal on my Android Phone.

It's not possible to play the mp4 audio file with flowplayer or JW Player and also not under Windows VLC.

What could be the Problem?

It's nearly that example that i'm using.

Reply · Feb. 22, 2014, 12:22 p.m.

In this multipart request method parameters filepath,filefield means please tell me

Reply · May 21, 2014, 10:44 a.m.

In this multipart request method parameters filepath,filefield means please tell me

Reply · May 21, 2014, 10:47 a.m.

This was a life saver. Thank you

Reply · Aug. 7, 2014, 7:18 p.m.

You are the BEST! thank you!!!

Reply · Aug. 26, 2014, 8:11 p.m.

What means post and filefield?!

Reply · Oct. 29, 2014, 5:01 p.m.