title: Android upload pdf file to server
body: <p>I know there's already lots of question and tutorial of my question. But I failed to get any tutorial to upload file other than images.</p>
  
  <p>I followed an example and managed to upload an image successfully to localhost. But, I want to upload files like pdf, docx, pptx etc. Not restricted to images only.</p>
  
  <p>I followed this tutorial: <a href="http://programmerguru.com/android-tutorial/how-to-upload-image-to-php-server/" rel="nofollow">http://programmerguru.com/android-tutorial/how-to-upload-image-to-php-server/</a></p>
  
  <p>I'm totally beginner in android so I have no idea what am I doing when changing some code from the original. So far, my MainActivity.java as given and the result is 'something went wrong' and crashed when I click the upload button.</p>
  
  <pre><code>public class MainActivity extends Activity {
      ProgressDialog prgDialog;
      String encodedString;
      RequestParams params = new RequestParams();
      String filePath, fileName;
      Bitmap bitmap;
      private static int RESULT_LOAD_FILE = 1;
      TextView viewFileName;@
      Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          prgDialog = new ProgressDialog(this);
          // Set Cancelable as False
          prgDialog.setCancelable(false);
      }
      public void loadImagefromGallery(View view) {
              // Create intent to Open Image applications like Gallery, Google Photos
              Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
              intent.setType("*/*");
              // Start the Intent
              startActivityForResult(intent, RESULT_LOAD_FILE);
          }
          // When Image is selected from Gallery
          @
      Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              viewFileName.setText("File Name: \n" + data.getData().getLastPathSegment() +
                  "\n");
              try {
                  // When an Image is picked
                  if (requestCode == RESULT_LOAD_FILE &amp;&amp; resultCode == RESULT_OK &amp;&amp;
                      null != data) {
                      // Get the Image from data
                      Uri selectedFile = data.getData();
                      String[] filePathColumn = {
                          MediaStore.Files.FileColumns.DATA
                      };
                      // Get the cursor
                      Cursor cursor = getContentResolver().query(selectedFile,
                          filePathColumn, null, null, null);
                      // Move to first row
                      cursor.moveToFirst();
                      int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                      filePath = cursor.getString(columnIndex);
                      cursor.close();
                      ImageView imgView = (ImageView) findViewById(R.id.imgView);
                      // Set the Image in ImageView
                      imgView.setImageBitmap(BitmapFactory.decodeFile(filePath));
                      // Get the Image's file name
                      String fileNameSegments[] = filePath.split("/");
                      fileName = fileNameSegments[fileNameSegments.length - 1];
                      // Put file name in Async Http Post Param which will used in Php web app
                      params.put("filename", fileName);
                  } else {
                      Toast.makeText(this, "You haven't picked any file", Toast.LENGTH_LONG)
                          .show();
                  }
              } catch (Exception e) {
                  Toast.makeText(this, "Something went wrong", Toast.LENGTH_LONG)
                      .show();
              }
          }
          // When Upload button is clicked
      public void uploadImage(View v) {
              // When Image is selected from Gallery
              if (filePath != null &amp;&amp; !filePath.equals("")) {
                  prgDialog.setMessage("Converting Image to Binary Data");
                  prgDialog.show();
                  // Convert image to String using Base64
                  encodeImagetoString();
                  // When Image is not selected from Gallery
              } else {
                  Toast.makeText(getApplicationContext(),
                      "You must select image from gallery before you try to upload",
                      Toast.LENGTH_LONG).show();
              }
          }
          // AsyncTask - To convert Image to String
      public void encodeImagetoString() {
          new AsyncTask &lt; Void, Void, String &gt; () {
              protected void onPreExecute() {};@
              Override
              protected String doInBackground(Void...params) {
                  BitmapFactory.Options options = null;
                  options = new BitmapFactory.Options();
                  options.inSampleSize = 3;
                  bitmap = BitmapFactory.decodeFile(filePath, options);
                  ByteArrayOutputStream stream = new ByteArrayOutputStream();
                  // Must compress the Image to reduce image size to make upload easy
                  bitmap.compress(Bitmap.CompressFormat.PNG, 50,
                      stream);
                  byte[] byte_arr = stream.toByteArray();
                  // Encode Image to String
                  encodedString = Base64.encodeToString(byte_arr, 0);
                  return "";
              }@
              Override
              protected void onPostExecute(String msg) {
                  prgDialog.setMessage("Calling Upload");
                  // Put converted Image string into Async Http Post param
                  params.put("image", encodedString);
                  // Trigger Image upload
                  triggerImageUpload();
              }
          }.execute(null, null, null);
      }
      public void triggerImageUpload() {
              makeHTTPCall();
          }
          // Make Http call to upload Image to Php server
      public void makeHTTPCall() {
          prgDialog.setMessage("Invoking Php");
          AsyncHttpClient client = new AsyncHttpClient();
          // Don't forget to change the IP address to your LAN address. Port no as well.
          client.post("http://10.16.36.144:8080/imgupload/upload_image.php",
              params, new AsyncHttpResponseHandler() {
                  // When the response returned by REST has Http
                  // response code '200'
                  @
                  Override
                  public void onSuccess(String response) {
                          // Hide Progress Dialog
                          prgDialog.hide();
                          Toast.makeText(getApplicationContext(),
                              response, Toast.LENGTH_LONG).show();
                      }
                      // When the response returned by REST has Http
                      // response code other than '200' such as '404',
                      // '500' or '403' etc
                      @
                  Override
                  public void onFailure(int statusCode, Throwable error,
                      String content) {
                      // Hide Progress Dialog
                      prgDialog.hide();
                      // When Http response code is '404'
                      if (statusCode == 404) {
                          Toast.makeText(getApplicationContext(),
                              "Requested resource not found",
                              Toast.LENGTH_LONG).show();
                      }
                      // When Http response code is '500'
                      else if (statusCode == 500) {
                          Toast.makeText(getApplicationContext(),
                              "Something went wrong at server end",
                              Toast.LENGTH_LONG).show();
                      }
                      // When Http response code other than 404, 500
                      else {
                          Toast.makeText(getApplicationContext(),
                              "Error Occured \n Most Common Error: \n1. Device not connected to Internet\n2. Web App is not deployed in App server\n3. App server is not running\n HTTP Status code : " +
                              statusCode, Toast.LENGTH_LONG).show();
                      }
                  }
              });
      }@
      Override
      protected void onDestroy() {
          // TODO Auto-generated method stub
          super.onDestroy();
          // Dismiss the progress bar when application is closed
          if (prgDialog != null) {
              prgDialog.dismiss();
          }
      }
  }
  </code></pre>
  
  <p>edited
  logcat after the app crashed</p>
  
  <pre><code>FATAL EXCEPTION: main
  Process: com.example.habibah.uploadtoserverv4, PID: 3840
  java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/document/1504-0F18:8MSFDPo.jpg flg=0x1 }} to activity {com.example.habibah.uploadtoserverv4/com.example.habibah.uploadtoserverv4.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3577)
      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3620)
      at android.app.ActivityThread.access$1300(ActivityThread.java:151)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5257)
      at java.lang.reflect.Method.invoke(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
      at com.example.habibah.uploadtoserverv4.MainActivity.onActivityResult(MainActivity.java:56)
      at android.app.Activity.dispatchActivityResult(Activity.java:6192)
      at android.app.ActivityThread.deliverResults(ActivityThread.java:3573)
      at android.app.ActivityThread.handleSendResult(ActivityThread.java:3620) 
      at android.app.ActivityThread.access$1300(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
  </code></pre>