Our this tutorial Android Upload PDF File to Server is very advance tutorial for android developers because we have uploading PDF file directly to online website hosting server by using PHP script. After sending the file straight to sever we would receive that file using POST method and store that file on a folder created on domain server. We would also store the complete uploaded PDF path URL into MySQL database. So it could be accessed for some further usages.
Contents in this project Android Upload PDF File to Server Using PHP MySQL :
- Watch the live demo video.
- Start a new android application development project in Studio.
- Create Database with Table on server.
- Create PDF storage folder on server.
- Create PHP Script to receive PDF file coming from application.
- Adding net.gotev:uploadservice:2.1 library in your project.
- Adding Internet and READ_EXTERNAL_STORAGE permission to AndroidManifest.xml file.
- Create Two buttons and one EditText in layout file.
- Start Coding.
List of Java files in this project :
- MainActivity.java .
- FilePath.java .
List of Layout file in this project :
- activity_main.xml .
List of PHP file in this project :
- file_upload.php .
1. Watch the live demo video :
2. Start a new android application development project in Studio.
3. Create Database with Table on server :
Create Database on your hosting or local sever and inside that database create a table named as ” PdfTable “. Inside that table create three columns id, PdfURL, PdfName . Screenshot of table is given below.
4. Create PDF storage folder on server :
My testing domain name is androidblog.esy.es . I am creating a folder inside my domain hosting storage and inside that folder my PDF uploading folder present. My PDF uploading folder path is http://androidblog.esy.es/AndroidJSon/PdfUploadFolder/ . So just create same folder with same name on your server.
5. Create PHP Script to receive PDF file coming from application :
Next step is to create the PHP scripting file which URL we would call from application and this file would store PDF on server.
Code for file_upload.php file.
<?php ServerConfig(); $PdfUploadFolder = 'PdfUploadFolder/'; $ServerURL = 'http://androidblog.esy.es/AndroidJSon/'.$PdfUploadFolder; if($_SERVER['REQUEST_METHOD']=='POST'){ if(isset($_POST['name']) and isset($_FILES['pdf']['name'])){ $con = mysqli_connect(HostName,HostUser,HostPass,DatabaseName); $PdfName = $_POST['name']; $PdfInfo = pathinfo($_FILES['pdf']['name']); $PdfFileExtension = $PdfInfo['extension']; $PdfFileURL = $ServerURL . GenerateFileNameUsingID() . '.' . $PdfFileExtension; $PdfFileFinalPath = $PdfUploadFolder . GenerateFileNameUsingID() . '.'. $PdfFileExtension; try{ move_uploaded_file($_FILES['pdf']['tmp_name'],$PdfFileFinalPath); $InsertTableSQLQuery = "INSERT INTO PdfTable (PdfURL, PdfName) VALUES ('$PdfFileURL', '$PdfName') ;"; mysqli_query($con,$InsertTableSQLQuery); }catch(Exception $e){} mysqli_close($con); } } function ServerConfig(){ define('HostName','mysql.hostinger.in'); define('HostUser','u288012116_json'); define('HostPass','N1c45hlf'); define('DatabaseName','u288012116_json'); } function GenerateFileNameUsingID(){ $con2 = mysqli_connect(HostName,HostUser,HostPass,DatabaseName); $GenerateFileSQL = "SELECT max(id) as id FROM PdfTable"; $Holder = mysqli_fetch_array(mysqli_query($con2,$GenerateFileSQL)); mysqli_close($con2); if($Holder['id']==null) { return 1; } else { return ++$Holder['id']; } } ?>
6. Adding net.gotev:uploadservice:2.1 library in your project :
1. Open your project’s build.gradle(Module:app) file.
2. Add compile ‘net.gotev:uploadservice:2.1’ in dependencies scope .
7. Adding Internet and READ_EXTERNAL_STORAGE permission to AndroidManifest.xml file :
Open your project’s AndroidManifest.xml file and add below both permission inside it. You could find the complete AndroidManifest.xml file source code at the end of this page.
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
8. Create Two buttons and one EditText in layout file :
<EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:hint="Enter PDF Name" android:ems="10" android:gravity="center" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:id="@+id/editText" /> <Button android:text="Upload pdf on online server" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="54dp" android:id="@+id/button2" android:layout_below="@+id/editText" android:layout_alignParentStart="true" /> <Button android:text="Select PDF TO Upload" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/button" android:layout_above="@+id/editText" android:layout_alignParentStart="true" android:layout_marginBottom="62dp" />
9. Start Coding for project Android Upload PDF File to Server :
Code for MainActivity.java file.
package com.androidjson.pdfuploadandroid_androidjsoncom; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.support.v4.app.ActivityCompat; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import net.gotev.uploadservice.MultipartUploadRequest; import net.gotev.uploadservice.UploadNotificationConfig; import java.util.UUID; public class MainActivity extends AppCompatActivity{ Button SelectButton, UploadButton; EditText PdfNameEditText ; Uri uri; public static final String PDF_UPLOAD_HTTP_URL = "http://androidblog.esy.es/AndroidJSon/file_upload.php"; public int PDF_REQ_CODE = 1; String PdfNameHolder, PdfPathHolder, PdfID; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AllowRunTimePermission(); SelectButton = (Button) findViewById(R.id.button); UploadButton = (Button) findViewById(R.id.button2); PdfNameEditText = (EditText) findViewById(R.id.editText); SelectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // PDF selection code start from here . Intent intent = new Intent(); intent.setType("application/pdf"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Pdf"), PDF_REQ_CODE); } }); UploadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PdfUploadFunction(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PDF_REQ_CODE && resultCode == RESULT_OK && data != null && data.getData() != null) { uri = data.getData(); SelectButton.setText("PDF is Selected"); } } public void PdfUploadFunction() { PdfNameHolder = PdfNameEditText.getText().toString().trim(); PdfPathHolder = FilePath.getPath(this, uri); if (PdfPathHolder == null) { Toast.makeText(this, "Please move your PDF file to internal storage & try again.", Toast.LENGTH_LONG).show(); } else { try { PdfID = UUID.randomUUID().toString(); new MultipartUploadRequest(this, PdfID, PDF_UPLOAD_HTTP_URL) .addFileToUpload(PdfPathHolder, "pdf") .addParameter("name", PdfNameHolder) .setNotificationConfig(new UploadNotificationConfig()) .setMaxRetries(5) .startUpload(); } catch (Exception exception) { Toast.makeText(this, exception.getMessage(), Toast.LENGTH_SHORT).show(); } } } public void AllowRunTimePermission(){ if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Toast.makeText(MainActivity.this,"READ_EXTERNAL_STORAGE permission Access Dialog", Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(MainActivity.this,new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } } @Override public void onRequestPermissionsResult(int RC, String per[], int[] Result) { switch (RC) { case 1: if (Result.length > 0 && Result[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this,"Permission Granted", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this,"Permission Canceled", Toast.LENGTH_LONG).show(); } break; } } }
Code for activity_main.xml layout file.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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="com.androidjson.pdfuploadandroid_androidjsoncom.MainActivity"> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:hint="Enter PDF Name" android:ems="10" android:gravity="center" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:id="@+id/editText" /> <Button android:text="Upload pdf on online server" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="54dp" android:id="@+id/button2" android:layout_below="@+id/editText" android:layout_alignParentStart="true" /> <Button android:text="Select PDF TO Upload" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/button" android:layout_above="@+id/editText" android:layout_alignParentStart="true" android:layout_marginBottom="62dp" /> </RelativeLayout>
Code for FilePath.java file.
package com.androidjson.pdfuploadandroid_androidjsoncom; /** * Created by Juned on 1/17/2017. */ import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; public class FilePath { /** * Method for return file path of Gallery image * * @param context * @param uri * @return path of the selected image file from gallery */ public static String getPath(final Context context, final Uri uri) { //check here to KITKAT or new version final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } //DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } }
Code for AndroidManifest.xml file.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidjson.pdfuploadandroid_androidjsoncom"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Code for PHP File :
Code for file_upload.php file.
<?php ServerConfig(); $PdfUploadFolder = 'PdfUploadFolder/'; $ServerURL = 'http://androidblog.esy.es/AndroidJSon/'.$PdfUploadFolder; if($_SERVER['REQUEST_METHOD']=='POST'){ if(isset($_POST['name']) and isset($_FILES['pdf']['name'])){ $con = mysqli_connect(HostName,HostUser,HostPass,DatabaseName); $PdfName = $_POST['name']; $PdfInfo = pathinfo($_FILES['pdf']['name']); $PdfFileExtension = $PdfInfo['extension']; $PdfFileURL = $ServerURL . GenerateFileNameUsingID() . '.' . $PdfFileExtension; $PdfFileFinalPath = $PdfUploadFolder . GenerateFileNameUsingID() . '.'. $PdfFileExtension; try{ move_uploaded_file($_FILES['pdf']['tmp_name'],$PdfFileFinalPath); $InsertTableSQLQuery = "INSERT INTO PdfTable (PdfURL, PdfName) VALUES ('$PdfFileURL', '$PdfName') ;"; mysqli_query($con,$InsertTableSQLQuery); }catch(Exception $e){} mysqli_close($con); } } function ServerConfig(){ define('HostName','mysql.hostinger.in'); define('HostUser','u288012116_json'); define('HostPass','N1c45hlf'); define('DatabaseName','u288012116_json'); } function GenerateFileNameUsingID(){ $con2 = mysqli_connect(HostName,HostUser,HostPass,DatabaseName); $GenerateFileSQL = "SELECT max(id) as id FROM PdfTable"; $Holder = mysqli_fetch_array(mysqli_query($con2,$GenerateFileSQL)); mysqli_close($con2); if($Holder['id']==null) { return 1; } else { return ++$Holder['id']; } } ?>
Screenshot :
Sir please help me ,I have written same code but my file is not uploaded on server ?
Anshul did you create the same folder as i did in my code or connect your server configuration in DatabaseConfig.php file.