Friday 31 January 2014

How to upload a file on server

Here we see how to upload a file on server.

In order to upload a file on server we need a server , but here we create a local server either by installing wamp or xampp. To access localhost from android emulator use address http://10.0.2.2/.

Note: Put tuts4mobile_upload.png (find it in project ) into your 
android emulator. 

Create a project with the following details :
  • ProjectName: UploadFile
  • PackageName: sat.tuts4mobile.uploadfile
  • ActivityName: UploadActivity  
In the UploadActivity.java , copy and paste the following code:
package sat.tuts4mobile.uploadfile;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class UploadActivity extends Activity {

String imageUrl;
String uploadUrl;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);

imageUrl = "/mnt/sdcard/tuts4mobile_upload.png";
uploadUrl = "http://10.0.2.2/upoadandroid/upload.php";

findViewById(R.id.buttonUpload).setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String responce = new ServerRequest().uploadFile(uploadUrl, imageUrl);
Toast.makeText(UploadActivity.this, responce,Toast.LENGTH_SHORT).show();
}
});

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.upload, menu);
return true;
}

}

Create a new class name ServerRequest.java , and copy paste the following code:
package sat.tuts4mobile.uploadfile;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.util.Log;

public class ServerRequest {
public String uploadFile(String upLoadServerUri, String sourceFileUri) {
StringBuffer response = null;
int serverResponseCode = 0;
String fileName = sourceFileUri;
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(sourceFileUri);
{
try {
FileInputStream fileInputStream = new FileInputStream(
sourceFile);
URL url = new URL(upLoadServerUri);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setChunkedStreamingMode(1024);
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=\"file\";filename=\""
+ fileName + "\"" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
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("uploadFile", "HTTP Response is : "
+ serverResponseMessage + ": " + serverResponseCode);
if (serverResponseCode == 200)
 {
System.out.println("Done Send to Server !!!");
InputStream is = conn.getInputStream();
BufferedReader rd = new BufferedReader(
new InputStreamReader(is));
String line;
response = new StringBuffer();
while ((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
}
// close the streams //
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
Log.e("Upload file to server Exception",
"Exception : " + e.getMessage(), e);
}
return response.toString();
} // End else block
}
}

In the activity_upload.xml  file ,copy and paste the following code :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".UploadActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Note: Before upload make sure that you put (tuts4mobile_upload.png) file in the sdcard of emulator. You find ( tuts4mobile_upload.png ) file in the project folder." />

    <Button
        android:id="@+id/buttonUpload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Click to upload" />

</RelativeLayout>

In the AndroidManifest.xml file , copy and paste the following code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sat.tuts4mobile.uploadfile"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="sat.tuts4mobile.uploadfile.UploadActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
   
    <uses-permission android:name="android.permission.INTERNET"/>

</manifest>

After doing this , create a folder name “uploadandroid”  in your local server directory .
If you are using  xampp  then in “htdocs” or for wamp in “www”.
Now create a file in “uploadandroid”  folder with name “upload.php” and paste the following code:
<?php
                                $tmpfile=$_FILES["file"]["tmp_name"];
                                $size=$_FILES["file"]["size"];
                                $filename=basename($_FILES["file"]["name"]);                              
                                $type=$_FILES["file"]["type"];
                                $destination="uploads";
                                $file_upload=move_uploaded_file ( $tmpfile  ,$destination."/".$filename );
                                if($file_upload)
               {  
                 echo "Upload Successfully !!!";
                }
?>

And also create a folder name “uploads”.
Now run the application , it shows the following screen shots: