I want to upload a file from my android device to a server. I am using the below code for that:
File file = new File("/sdcard/Pictures/","wallpaper.png");
try {
Log.i("fileupload","checking file exists="+file.exists());
Log.i("fileupload","checking file length="+file.length());
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(file), file.length());
reqEntity.setContentType("binary/octet-stream");
httppost.addHeader("Content-Type", "multipart/form-data");
reqEntity.setChunked(true);
httppost.setEntity(reqEntity);
Log.i("Point1=","We are here");
HttpResponse response = httpclient.execute(httppost);
Log.i("Point2=","We are here");
Log.i("response=",""+response.getStatusLine());
BufferedReader bufferreader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String msg="";
String line = "";
while ((line = bufferreader.readLine()) != null) {
msg += line;
}
Log.i("msg=",""+msg);
//Do something with response...
if(response != null) {
Toast.makeText(getBaseContext(), "Upload Completed. ", Toast.LENGTH_SHORT).show();
} else { // Error, no response.
Toast.makeText(getBaseContext(), "Server Error. ", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// show error
}
The problem is I am getting a HTTP/1.1 400 Bad Request and the reason for that bad request is Missing File. Here is my logcat output:
04-09 13:56:06.870 785-866/com.tutsplus.nfcdemo I/fileupload﹕ checking file exists=true
04-09 13:56:06.870 785-866/com.tutsplus.nfcdemo I/fileupload﹕ checking file length=422334
04-09 13:56:06.872 785-866/com.tutsplus.nfcdemo I/Point1=﹕ We are here
04-09 13:56:10.068 785-866/com.tutsplus.nfcdemo I/Point2=﹕ We are here
04-09 13:56:10.068 785-866/com.tutsplus.nfcdemo I/response=﹕ HTTP/1.1 400 Bad Request
04-09 13:56:10.252 785-866/com.tutsplus.nfcdemo I/msg=﹕ {"error":2003,"message":"Missing file."}
As you can see from above output that the file exists, but I don't know why can't I upload it to my server. Also the server and url is working absolutely fine as I have already tested it using Google Chrome's "Advanced REST client" app. Here is a screenshot of that.
Just an addition to my question, I have also tried the below code I found in many previous answers,
InputStream inputStream;
try{
inputStream = new FileInputStream(new File("/sdcard/Pictures/"));
byte[] data;
try{
data = IOUtils.toByteArray(inputStream);
Log.d("File size", ""+ data.toString());
MultipartEntityBuilder entityBuilder = entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data),"wallpaper.png")
entityBuilder.addPart("File",inputStreamBody);
HttpClient httpClient = new DefaultHttpClient();
String url="my url";
HttpPost httpPost = new HttpPost(url);
HttpEntity entity = entityBuilder.build();
httpPost.setEntity(entity);
HttpResponse httpResponse = httpClient.execute(httpPost);
BufferedReader bufferreader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
String msg="";
String line = "";
while ((line = bufferreader.readLine()) != null) {
msg += line;
}
Log.i("msg=",""+msg);
// Handle response back from script.
if(httpResponse != null) {
Toast.makeText(getBaseContext(), "Upload Completed. ", Toast.LENGTH_SHORT).show();
} else { // Error, no response.
Toast.makeText(getBaseContext(), "Server Error. ", Toast.LENGTH_SHORT).show();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
But, the above code crashed for me with FileNotFoundException
04-09 16:45:32.876 7694-7750/com.tutsplus.nfcdemo W/System.err﹕ java.io.FileNotFoundException: /sdcard/Pictures: open failed: EISDIR (Is a directory)
04-09 16:45:32.877 7694-7750/com.tutsplus.nfcdemo W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456)
Someone Please help me find my error.
Thanks in advance!