Friday, August 6, 2010

Upload a file to remote server in Android

AIM : To upload a file data to a remote server by and check the response
Solution:
Step 1) Create a method to upload


public static int upLoad2Server(String sourceFileUri) {
String upLoadServerUri = "your remote server link";
// String [] string = sourceFileUri;
String fileName = sourceFileUri;

HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
String responseFromServer = "";

File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile()) {
Log.e("Huzza", "Source File Does not exist");
return 0;
}
try { // open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(upLoadServerUri);
conn = (HttpURLConnection) url.openConnection(); // Open a HTTP  connection to  the URL
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", fileName);
dos = new DataOutputStream(conn.getOutputStream());

dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+ fileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);

bytesAvailable = fileInputStream.available(); // create a buffer of  maximum size
Log.i("Huzza", "Initial .available : " + bytesAvailable);

bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];

// read file and write it into form...
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);
}

// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();

Log.i("Upload file to server", "HTTP Response is : " + serverResponseMessage + ": " + serverResponseCode);
// close streams
Log.i("Upload file to server", fileName + " File is written");
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
ex.printStackTrace();
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
e.printStackTrace();
}
//this block will give the response of upload link
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(conn
.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
Log.i("Huzza", "RES Message: " + line);
}
rd.close();
} catch (IOException ioex) {
Log.e("Huzza", "error: " + ioex.getMessage(), ioex);
}
return serverResponseCode;  // like 200 (Ok)

} // end upLoad2Server


2)call it with 
int reponse=upLoad2Server(""+filepath);
now response have responsecode like 200,401,500 etc..
If 200 OK..uploaded.

15 comments:

  1. Hi,

    I would like to implement an upload progress bar to the code, how can I get the real sent bytes during the while loop?

    ReplyDelete
  2. Dear sir,
    Please help me,
    i want to post image+string data to server.
    This code is running well for only upload image

    please help me how i send image with string data

    ReplyDelete
  3. This comment has been removed by the author.

    ReplyDelete
  4. I am new to android and wanna to develop an attractive game. Is there any interested game that can be developed in Android... Ya, then tell me how? or at least gv me a link plz...

    Thanks in advance...

    ReplyDelete
  5. How can i pass the filepath of a file reside in r.drawable folder

    ReplyDelete
  6. I have a error "405: Method Not Allowed"
    Any solutions..??????

    ReplyDelete
  7. please someone help me

    i am unable to upload images on server

    ReplyDelete
    Replies
    1. first understand your service dude..
      1.convert image to byte array..

      Delete
  8. Hello Ramamohan,
    Nice post.
    How the webservice is calling with android. Followig is the scenario we are looking for.

    We have a .NET web application with some web services like updateSaceDetails(string wsUser, string wsPassword, string aBulkDelimitedData).

    I have to pass those parameters into that webservice and update this into database on server. we are using HTTPS type request.

    Thanks in advance

    Regards
    Shibu

    ReplyDelete
  9. Thanks for sharing..
    Can I get the answer for: "I would like to implement an upload progress bar to the code, how can I get the real sent bytes during the while loop?"

    ReplyDelete
  10. server side code??????lol

    ReplyDelete
  11. Hi Please provide some help how to post both image file and basic details as NameValuePair from android to server using post please

    ReplyDelete
  12. Hi

    Which location file save in Server.Please Reply

    ReplyDelete
  13. Hi
    Response Coming but file is not uploaded in server. how to check it Please reply

    ReplyDelete

Android Developers Blog

Ram's shared items