Android file uploader with server-side php

17,398

Solution 1

Yeah, so I found the java-side of things. This works, so... yeah.

public class Uploader extends Activity {

    private String Tag = "UPLOADER";
    private String urlString = "YOUR_ONLINE_PHP";
    HttpURLConnection conn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String exsistingFileName = "/sdcard/uploader/data/testfile";

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        try {
            // ------------------ CLIENT REQUEST

            Log.e(Tag, "Inside second Method");

            FileInputStream fileInputStream = new FileInputStream(new File(
                    exsistingFileName));

            // open a URL connection to the Servlet

            URL url = new URL(urlString);

            // Open a HTTP connection to the URL

            conn = (HttpURLConnection) url.openConnection();

            // Allow Inputs
            conn.setDoInput(true);

            // Allow Outputs
            conn.setDoOutput(true);

            // Don't use a cached copy.
            conn.setUseCaches(false);

            // Use a post method.
            conn.setRequestMethod("POST");

            conn.setRequestProperty("Connection", "Keep-Alive");

            conn.setRequestProperty("Content-Type",
                    "multipart/form-data;boundary=" + boundary);

            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos
                    .writeBytes("Content-Disposition: post-data; name=uploadedfile;filename="
                            + exsistingFileName + "" + lineEnd);
            dos.writeBytes(lineEnd);

            Log.e(Tag, "Headers are written");

            // create a buffer of maximum size

            int bytesAvailable = fileInputStream.available();
            int maxBufferSize = 1000;
            // int bufferSize = Math.min(bytesAvailable, maxBufferSize);
            byte[] buffer = new byte[bytesAvailable];

            // read file and write it into form...

            int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);

            while (bytesRead > 0) {
                dos.write(buffer, 0, bytesAvailable);
                bytesAvailable = fileInputStream.available();
                bytesAvailable = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
            }

            // send multipart form data necesssary after file data...

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

            // close streams
            Log.e(Tag, "File is written");
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {
            Log.e(Tag, "error: " + ex.getMessage(), ex);
        }

        catch (IOException ioe) {
            Log.e(Tag, "error: " + ioe.getMessage(), ioe);
        }

        try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn
                    .getInputStream()));
            String line;
            while ((line = rd.readLine()) != null) {
                Log.e("Dialoge Box", "Message: " + line);
            }
            rd.close();

        } catch (IOException ioex) {
            Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex);
        }
    }
}

Solution 2

If you want to upload files that is larger than 2MB you need to edit your PHP configuraton

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M

Eg:

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 10M

That would allow you to upload files up to 10MB of size

Solution 3

For the PHP side of things take a look at

move_uploaded_file and also the global $_FILES

http://php.net/manual/en/function.move-uploaded-file.php

http://php.net/manual/en/features.file-upload.php

Share:
17,398
Jonathan Pitre
Author by

Jonathan Pitre

JOBS - September 2010 to December 2012 > Course Assistant (Intro. to Computing) at McGill University - May 2012 to July 2015 > Software Developer at Ericsson - July 2015 to Present > Java Developer at TC Média INTERNSHIPS - Summer 2010 > Software Engineer at McGill University - Summer 2011 > Programmer at BuildIT Software & Solutions Ltd. - Winter 2012 > Programmer at BuildIT Software & Solutions Ltd. STUDIES - D.E.C. > Health Sciences at Champlain College - B.Sc. > Major in Software Engineering at McGill University CERTIFICATIONS - McGill Scrum Master and Agile Leadership Certification FAVOURITE POSTS / LINKS How to ask and answer homework questions on stackoverflow. What have you tried?Technobabble

Updated on July 23, 2022

Comments

  • Jonathan Pitre
    Jonathan Pitre almost 2 years

    I've been looking for a solution to this for hours, but I can't find any.

    Basically, I want to upload, from my android device, files to an http website. However, I have no clue whatsoever how to do this. I'm using java on the device, and I would like to use PHP on the server-side of things. I just want to upload the files, not do anything fancy with them on the server.

    Can anyone provide code and/or a good link to what I need? I have little to no experience in this, and I am at a loss.

    Thanks, NS

    PS. I have no experience in PHP coding.

  • PiyushMishra
    PiyushMishra almost 13 years
    I tested this code but cant able to upload a file more than 2MB, any solution for that.
  • Jonathan Pitre
    Jonathan Pitre almost 13 years
    Sadly this code only works for small files. We ran into that problem, but we didn't need to upload more than a few kBs anyways, so we dismissed it. We're no longer working on that project. The way I see it it's either with "int bytesAvailable = fileInputStream.available();", where the fIS doesn't ever have more than 2MBs available (unlikely), or the byte buffer: int maxBufferSize = 1000; byte[] buffer = new byte[bytesAvailable]; Try changing the maxBufferSize to see what happens.
  • Jonathan Pitre
    Jonathan Pitre over 12 years
    Thanks for the clarification!
  • dsdsdsdsd
    dsdsdsdsd almost 11 years
    when you say "java-side of things", does that mean that this code is for a 'native app'??? .... because if so, then wouldn't there be an issue if the user does not have the app?? they would have to download it onto their android device first?? ... thanks.
  • Jonathan Pitre
    Jonathan Pitre almost 11 years
    @dsdsdsdsd I haven't written for android in years, but IIRC this was a user-downloaded application. I don't know how an app could collect data if it wasn't downloaded on the device...
  • Gerard
    Gerard over 10 years
    If 2 MB is not enough for you, and are not able to remove this restriction (as with many cheap webservers) you can try to use FTP client.
  • Mahesh
    Mahesh about 10 years
    hey i want to send also other parameter with this like imagename,title,description,imagecapture date time where to add this parameters in this