Created
February 11, 2014 06:06
-
-
Save mcxiaoke/8929954 to your computer and use it in GitHub Desktop.
multipart request using httpurlconnection
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
// see http://www.androidsnippets.com/multipart-http-requests |
@waqas-ansari Did you get the solution?
what parameters should i pass to post and filefield ?
Unable to post image without any error.
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);
}
SHOULD BECOME:
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);
// MISSING HERE: bufferSize could be greater than the allocated size (before entering the loop) !!!!!!!!!!!!!!!!!!
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
What if I need to upload array of file OR multiple files with same fieldName? I want to send array of 4 image files with field name "files".