0

I'm trying to upload PDF files to a server using PHP in Android. For that I get the URI of the selected file and POST those data to a PHP file in my server. This is where I post that data:

URL url = new URL(url_path);
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setChunkedStreamingMode(1024);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data");

OutputStream outputStream = conn.getOutputStream();
InputStream inputStream = c.getContentResolver().openInputStream(path);
Log.e("URI",path.toString());
int bytesAvailable = inputStream.available();
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
int bytesRead;
while ((bytesRead = inputStream.read(buffer, 0, bufferSize)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
}
Log.e("URI",String.valueOf(bytesAvailable));
outputStream.flush();
inputStream.close();

This data is posted to this php file:

<?php
print_r($_REQUEST);
$file_name = date("U").".pdf";
$server_path = "uploads/";
$web_path = "http://mysite/uploads/";

$file = $server_path.$file_name;
file_put_contents($file,"");

$fp = fopen("php://input",'r');
echo 'fp : '.$fp;
while ($buffer = fread($fp,8192)){
    echo $buffer;
    file_put_contents($file,$buffer,FILE_APPEND | LOCK_EX);
}?>

For each upload, it creates a new file in my uploads directory. But the size of the PDF is 0 bytes. I have no idea why. Please help me on this. Thanks in advance.

5
  • change file to base64 and send like text to php file. Commented Mar 1, 2017 at 20:15
  • @Breakermind Can you please give me a link toan example? Commented Mar 1, 2017 at 20:15
  • stackoverflow.com/questions/10226046/… Commented Mar 1, 2017 at 20:16
  • 1
    dzone.com/articles/base64-encoding-java-8 Commented Mar 1, 2017 at 20:26
  • 1
    example android app github.com/fxstar/AndroidAppExample Commented Mar 1, 2017 at 20:28

3 Answers 3

2
<?php

    $file_path = "uploads/";

    $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path) ){
        echo "success";
    } else{
        echo "fail";
    }
 ?>

public int uploadFile(final String selectedFilePath){

    int serverResponseCode = 0;

    HttpURLConnection connection;
    DataOutputStream dataOutputStream;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";


    int bytesRead,bytesAvailable,bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;
    File selectedFile = new File(selectedFilePath);


    String[] parts = selectedFilePath.split("/");
    final String fileName = parts[parts.length-1];

    if (!selectedFile.isFile()){
        dialog.dismiss();

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvFileName.setText("Source File Doesn't Exist: " + selectedFilePath);
            }
        });
        return 0;
    }else{
        try{
            FileInputStream fileInputStream = new FileInputStream(selectedFile);
            URL url = new URL(SERVER_URL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);//Allow Inputs
            connection.setDoOutput(true);//Allow Outputs
            connection.setUseCaches(false);//Don't use a cached Copy
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setRequestProperty("ENCTYPE", "multipart/form-data");
            connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            connection.setRequestProperty("uploaded_file",selectedFilePath);

            //creating new dataoutputstream
            dataOutputStream = new DataOutputStream(connection.getOutputStream());

            //writing bytes to data outputstream
            dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
            dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                    + selectedFilePath + "\"" + lineEnd);

            dataOutputStream.writeBytes(lineEnd);

            //returns no. of bytes present in fileInputStream
            bytesAvailable = fileInputStream.available();
            //selecting the buffer size as minimum of available bytes or 1 MB
            bufferSize = Math.min(bytesAvailable,maxBufferSize);
            //setting the buffer as byte array of size of bufferSize
            buffer = new byte[bufferSize];

            //reads bytes from FileInputStream(from 0th index of buffer to buffersize)
            bytesRead = fileInputStream.read(buffer,0,bufferSize);

            //loop repeats till bytesRead = -1, i.e., no bytes are left to read
            while (bytesRead > 0){
                //write the bytes read from inputstream
                dataOutputStream.write(buffer,0,bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable,maxBufferSize);
                bytesRead = fileInputStream.read(buffer,0,bufferSize);
            }

            dataOutputStream.writeBytes(lineEnd);
            dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            serverResponseCode = connection.getResponseCode();
            String serverResponseMessage = connection.getResponseMessage();

            Log.i(TAG, "Server Response is: " + serverResponseMessage + ": " + serverResponseCode);

            //response code of 200 indicates the server status OK
            if(serverResponseCode == 200){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tvFileName.setText("File Upload completed.\n\n You can see the uploaded file here: \n\n" + "http://coderefer.com/extras/uploads/"+ fileName);
                    }
                });
            }

            //closing the input and output streams 
            fileInputStream.close();
            dataOutputStream.flush();
            dataOutputStream.close();



        } catch (FileNotFoundException e) {
            e.printStackTrace();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,"File Not Found",Toast.LENGTH_SHORT).show();
                }
            });
        } catch (MalformedURLException e) {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "URL error!", Toast.LENGTH_SHORT).show();

        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "Cannot Read/Write File!", Toast.LENGTH_SHORT).show();
        }
        dialog.dismiss();
        return serverResponseCode;
    }

}

Ref: http://www.coderefer.com/android-upload-file-to-server/ and https://github.com/vamsitallapudi/AndroidUploadFileToServer

Sign up to request clarification or add additional context in comments.

2 Comments

It fails here, !selectedFile.isFile(). I get the path from onactivityresult of ACTION_GET_CONTENT. Why the Uri fails here?
I would recommend you to use retrofit to upload a file.
2

Rather than doing it yourself, you could easily use this library called ION: https://github.com/koush/ion . Uploading a pdf file is as simply as:

Ion.with(getContext())
.load("your url")
.setMultipartFile("archive", "application/pdf", new File("path to file"))
.setCallback(...)

Comments

1

The best approach would be to use Retrofit instead. Here is a sample app you can use: https://github.com/hidrodixtion/Example-Retrofit-Image-Upload

1 Comment

I'll try with Retrofit. Thanks a lot.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.