4

I am building an app and at a certain point I need to upload an image to a server. When I only put the image as a parameter, it all works perfectly but the problem is when I add the text, nothing happens. Here is my code

public int uploadFile(String sourceFileUri) {
      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 { 

            // open a URL connection to the Servlet
          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.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); 
          conn.setRequestProperty("username", username); 
          dos = new DataOutputStream(conn.getOutputStream());

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

          dos.writeBytes("Content-Disposition: form-data; name=\"username\";filename=\""
                                    + username + "\"" + lineEnd);
          dos.writeBytes("Content-Type: text/plain;charset=UTF-8" + 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){

              runOnUiThread(new Runnable() {
                   public void run() {

                       String msg = "http://phpserver"+ture;


                       Toast.makeText(Friend.this, "Uploaded succesfully", 
                                    Toast.LENGTH_SHORT).show();
                       //new Post_test().execute();
                   }
               });                
          }    

          //close the streams //
          fileInputStream.close();
          dos.flush();
          dos.close();

     } catch (MalformedURLException ex) {

         dialog.dismiss();  
         ex.printStackTrace();

         runOnUiThread(new Runnable() {
             public void run() {

                 Toast.makeText(Friend.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
             }
         });

         Log.e("Upload file to server", "error: " + ex.getMessage(), ex);  
     } catch (Exception e) {

         dialog.dismiss();  
         e.printStackTrace();

         runOnUiThread(new Runnable() {
             public void run() {

                 Toast.makeText(Friend.this, "Got Exception : see logcat ", 
                         Toast.LENGTH_SHORT).show();
             }
         });
         Log.e("Upload file to server Exception", "Exception : " 
                                          + e.getMessage(), e);  
     }
     dialog.dismiss();       

    return serverResponseCode; 
}

What am I doing wrong?

When I remove :

dos.writeBytes(twoHyphens + boundary + lineEnd);          
dos.writeBytes("Content-Disposition: form-data; name=\"username\";filename=\"" + 
                username + "\"" + lineEnd);
dos.writeBytes("Content-Type: text/plain;charset=UTF-8" + lineEnd);

the image gets uploaded, so the issue might come from how to add the text posts. Any help?

Radek Benkel
  • 8,278
  • 3
  • 32
  • 41
Jayo2k
  • 251
  • 3
  • 14
  • possible duplicate of [Post multipart request with Android SDK](http://stackoverflow.com/questions/2017414/post-multipart-request-with-android-sdk) – XGouchet Nov 07 '13 at 07:54

2 Answers2

1

This works for me!! I will adjust it to URLConnection in the future...

public int uploadFile(String sourceFileUri) {  

    String fileName=sourceFileUri;
    HttpURLConnection conn = null;
    DataOutputStream dos = null;  
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "------hellojosh";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024; 
    File sourceFile = new File(fileName); 
    Log.e("joshtag", "Uploading: sourcefileURI, "+fileName);

    if (!sourceFile.isFile()) {                                
         Log.e("uploadFile", "Source File not exist :"+appSingleton.getInstance().photouri);//FullPath);                
         runOnUiThread(new Runnable() {
            public void run() {             
                //messageText.setText("Source File not exist :"
                }
            });          
         return 0;  //RETURN #1
         }
    else{
        try{                

             FileInputStream fileInputStream = new FileInputStream(sourceFile);           
             URL url = new URL(upLoadServerUri);
             Log.v("joshtag",url.toString());

             // 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            s       
             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("file", fileName);                     
             conn.setRequestProperty("user", user_id));

             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);
                    Log.i("joshtag","->");
                    }

             // 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().toString();              
             Log.i("joshtag", "HTTP Response is : "  + serverResponseMessage + ": " + serverResponseCode);  

             // ------------------ read the SERVER RESPONSE
             DataInputStream inStream;
             try {
                 inStream = new DataInputStream(conn.getInputStream());
                 String str;
                 while ((str = inStream.readLine()) != null) {
                     Log.e("joshtag", "SOF Server Response" + str);
                    }
                 inStream.close();
                }
             catch (IOException ioex) {
                Log.e("joshtag", "SOF error: " + ioex.getMessage(), ioex);
                }

             //close the streams //
             fileInputStream.close();
             dos.flush();
             dos.close();    

             if(serverResponseCode == 200){ 
                //Do something                       
                }//END IF Response code 200  

            dialog.dismiss();
            }//END TRY - FILE READ      
        catch (MalformedURLException ex) {
            ex.printStackTrace();     
            Log.e("joshtag", "UL error: " + ex.getMessage(), ex);  
            } //CATCH - URL Exception

         catch (Exception e) {           
            e.printStackTrace();             
            Log.e("Upload file to server Exception", "Exception : "+ e.getMessage(), e);
            } //

        return serverResponseCode; //after try       
        }//END ELSE, if file exists.
    }
Josh
  • 6,251
  • 2
  • 46
  • 73
  • Hey your code is most useful for me.. have you tried using URLConnection?? – Asmi Sep 09 '16 at 11:45
  • 1
    your code is really useful but just add one line conn.setRequestProperty("Connection", "close"); instead of conn.setRequestProperty("Connection", "Keep-Alive"); because when service runs it gives first time correct result and then again second time it gives 400.. its because of pull.. so we need to add the above line then code absolutely working great.. Thanks.. – Asmi Sep 12 '16 at 06:05
0

After searching lots of resources i got nothing but when i tried to fetch text data from $_SERVER super global variable, i got all text data and $_FILE for getting image.

Here is the code given for android and php side both

package com.example.kingmash.Helper;


import android.content.Context;
import android.os.AsyncTask;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

import com.example.kingmash.DAO.Profile_cover;
import com.example.kingmash.DAO.User_profile_cover;
import com.example.kingmash.MainActivity;
import com.example.kingmesh.R;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

import static com.example.kingmash.Helper.AllRequest.responseMessage;

public class UploadFileOnlyAsync extends AsyncTask<String, Void, String> {
    String sourceFileUri, serverResponseMessage;
    int serverResponseCode;
    ProgressBar progressBar;
    User_profile_cover upc;
    int isdatainserted;
    Context context;

    public UploadFileOnlyAsync(Context context, String sourceFileUri, boolean requireprgressbar, User_profile_cover upc) {
        this.sourceFileUri = sourceFileUri;
        this.context = context;
        progressBar = null;
        this.upc = upc;
        if (requireprgressbar) {
//            progressBar = ((AppCompatActivity) context).findViewById(R.id.progressbar);
        }

    }

    @Override
    protected void onPreExecute() {
        Log.d("on pre----", "on pre-----------");
        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
            progressBar.setVisibility(View.VISIBLE);
        }


    }

    @Override
    protected void onProgressUpdate(Void... values) {

        Log.d("On update-------------", "" + values[0]);

        if (progressBar != null) {
            progressBar.setProgress(Integer.parseInt(values[0].toString()));
        }

    }

    @Override
    protected String doInBackground(String... params) {
        responseMessage = new Profile_cover(context).insert(upc, Routes.insertStepsURL);
        if (responseMessage.get(0).equals("Inserted")) {
            Log.d("key------insert fata", "" + isdatainserted);
            try {
                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);
                if (sourceFile.isFile()) {
                    try {
                        String upLoadServerUri = Routes.update_prfile_covrer_URL;
                        // open a URL connection to the Servlet
                        FileInputStream fileInputStream = new FileInputStream(sourceFile);
                        URL url = new URL(upLoadServerUri);
                        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                        StrictMode.setThreadPolicy(policy);
                        // 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.setRequestMethod("POST");
                        conn.setRequestProperty("Connection", "Keep-Alive");
                        conn.setRequestProperty("ENCTYPE",
                                "multipart/form-data");
                        conn.setRequestProperty("Content-Type",
                                "multipart/form-data;boundary=" + boundary);
                        conn.setRequestProperty("user_id", "1");
                        dos = new DataOutputStream(conn.getOutputStream());

                        dos.writeBytes(twoHyphens + boundary + lineEnd);
                        dos.writeBytes("Content-Disposition: form-data; name=\"profile\";filename=\""
                                + sourceFileUri + "\"" + 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();
                        serverResponseMessage = conn
                                .getResponseMessage();

                        if (serverResponseCode == 200) {

                            // messageText.setText(msg);
                            //Toast.makeText(ctx, "File Upload Complete.",
                            //      Toast.LENGTH_SHORT).show();

                            // recursiveDelete(mDirectory1);

                        }
                        // close the streams //
                        fileInputStream.close();
                        dos.flush();
                        dos.close();

                        String line;
                        ArrayList responseMessage = new ArrayList();
                        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        while ((line = br.readLine()) != null) {
                            Log.d("line---", line);
                            responseMessage.add(line);
                        }

                    } catch (Exception e) {

                        // dialog.dismiss();
                        e.printStackTrace();

                    }
                    // dialog.dismiss();

                } // End else block


            } catch (Exception ex) {
                // dialog.dismiss();

                ex.printStackTrace();
            }
        }
        Log.d("do in back-------------", "" + "Executed " + serverResponseMessage + "" + serverResponseCode + responseMessage);

        return "Executed " + serverResponseMessage + "" + serverResponseCode + "  " + responseMessage;
    }

    @Override
    protected void onPostExecute(String result) {
        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
        }
    }


}

And here is the php code which is reading header from $_SERVER or getAllHeaders() function

<?php
session_start();
include '../Config/ConnectionObjectOriented.php';
include '../Config/DB.php';
$db = new DB($conn);
$user_id=$_SERVER["user_id"];
$info=$db->fileUploadWithTable($_FILES,"user_profile_cover",$user_id,"../img/user", "5m", "jpg,png");
echo $info[0];
echo $info[1];

// or you can check the detail by this code

foreach (getallheaders() as $name => $value) { 
    echo "$name: $value <br>"; 
} 
Alok Panday
  • 403
  • 4
  • 10