HI I´M AN IDEA
WANNA PLAY
WITH ME?
 

Tutorial: Subiendo archivos con android y php.

Ya que nos encontramos en una época en que la información fluye de manera intermitente y no es que se distinga por su gran calidad habrá que ver la manera de darle vidilla a esto y que mejor que con algo que nunca pasa de moda como los tutoriales.

Esta vez voy a intentar explicar de una manera mas o menos comprensible algo tan recurrido como el hecho de subir archivos a un servidor php.

Capa Servidora.

Para empezar crearemos un fichero en php que recibirá el archivo que mandemos con el cliente android. Pondré un ejemplo muy sencillo.

upload.php

<?php

$target_path = basename( $_FILES['uploadedfile']['name']);

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "Archivo ". $target_path . "subido correctamente";
} else{
    echo "Error al subir el archivo";
}

?>

Capa Cliente.

Clase para la subida de archivos (HttpFileUploader.java)

Esta clase se encargará de realizar el “trabajo sucio”.

public class HttpFileUploader implements Runnable{

    URL connectURL;
    String params;
    String responseString;
    String fileName;
    byte[] dataToServer;

    HttpFileUploader(String urlString, String params, String fileName ){
        try{
            connectURL = new URL(urlString);
        }catch(Exception ex){
            Log.i("URL FORMATION","MALFORMATED URL");
        }
        this.params = params+"=";
        this.fileName = fileName;
    }

    void doStart(FileInputStream stream){
        fileInputStream = stream;
        thirdTry();
    }

    FileInputStream fileInputStream = null;
    void thirdTry() {
        String exsistingFileName = fileName;

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

            Log.e(Tag,"Starting to bad things");
            // Abrimos una conexión http con la URL

            HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();

            // Permitimos Inputs
            conn.setDoInput(true);

            // Permitimos Outputs
            conn.setDoOutput(true);

            // Deshabilitamos el uso de la copia cacheada.
            conn.setUseCaches(false);

            // Usamos el método post esto podemos cambiarlo.
            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: form-data; name=\"uploadedfile\";filename=\"" + exsistingFileName +"\"" + lineEnd);
            dos.writeBytes(lineEnd);

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

            // creamos un buffer con el tamaño maximo de archivo, lo pondremos en 1MB

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

           	int 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);
            }

            // enviar multipart form data

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

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

            InputStream is = conn.getInputStream();
            // retrieve the response from server
            int ch;

            StringBuffer b =new StringBuffer();
            while( ( ch = is.read() ) != -1 ){
            b.append( (char)ch );
            }
            String s=b.toString();
            Log.i("Response",s);
            dos.close();

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

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

@Override
public void run() {

}

}

Función a la que llamar para subir el fichero

En teoría la función nos debería servir para poder mandar ficheros que tengamos en la tarjeta SD.

 public void uploadFile(String filename){
        try {
            FileInputStream fis = new FileInputStream(filename);
            HttpFileUploader htfu = new HttpFileUploader("http://www.tuservidor.com/upload.php","noparamshere", filename);
            htfu.doStart(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

Ahora cuando queramos subir un fichero, simplemente tendremos que llamar a esta función pasando como parámetro la ruta absoluta del fichero en cuestión.

Ni que decir que es una forma sencilla de hacerlo y que, como todo , podríamos mejorarla pero al menos cumplirá su función :D.

 

About the author

Jaime Mulero Hola! Me llamo Jaime Mulero, soy programador desde hace años, apasionado por la informática prácticamente desde que tengo uso de razón. Jquery Ninja, Codeigniter Trooper, database juggler and Android engineer! Jaime Mulero

VN:F [1.9.20_1166]
Rating: 7.7/10 (7 votes cast)
Tutorial: Subiendo archivos con android y php., 7.7 out of 10 based on 7 ratings
Difunde la palabra
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • Meneame

7 Comments on "Tutorial: Subiendo archivos con android y php."

  1. Anelfo dice:

    Hola, buen aporte, pero me gustaría hacer una aclaración:

    Cuando dices
    HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();

    // Permitimos Inputs
    conn.setDoInput(true);

    // Permitimos Outputs
    conn.setDoOutput(true);

    // Deshabilitamos el uso de la copia cacheada.
    conn.setUseCaches(false

    Realmente podría funcionar si:
    URL connectURL;
    String params;
    String responseString;
    String fileName;
    byte[] dataToServer;

    HttpFileUploader(String urlString, String params, String fileName ){
    try{
    connectURL = new URL(urlString);
    }catch(Exception ex){
    Log.i(“URL FORMATION”,”MALFORMATED URL”);
    }
    this.params = params+”=”

    Tuviera un script del tipo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void uploadFile(String filename){
    try {
    FileInputStream fis = new FileInputStream(filename);
    HttpFileUploader htfu = new HttpFileUploader(“http://www.tuservidor.com/upload.php”,”noparamshere”, filename);
    htfu.doStart(fis);
    } catch (FileNotFoundException e

    O del tipo:
    // enviar multipart form data

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

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

    InputStream is = conn.getInputStream();
    // retrieve the response from server
    int

    No te parece?

    Gracias un saludo

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: +1 (from 1 vote)
  2. Arturo dice:

    Hola, estuve probando este código para mi tesis durante buen tiempo desde el emulador y funcionaba perfectamente, pero al usarlo desde un teléfono real falla, no se si tienes alguna pista de porque podrá ser. gracias.

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: +1 (from 1 vote)
    • jk dice:

      excelente aporte, pero ya hice pruebas y no funciona, podrias poner para descargar el proyecto de ejemplo .zip funcional? gracias

      VA:F [1.9.20_1166]
      Rating: 0.0/5 (0 votes cast)
      VA:F [1.9.20_1166]
      Rating: 0 (from 0 votes)
      • Jaime Mulero dice:

        cuando pueda sacar un ratillo esta semana lo pongo, gracias 😀

        VN:F [1.9.20_1166]
        Rating: 0.0/5 (0 votes cast)
        VN:F [1.9.20_1166]
        Rating: 0 (from 0 votes)
  3. AlexWeb dice:

    Hola,

    Si no es mucho pedir, podias subir los archivos ya creados, para asi solamente tener que modificarlos.. esque no tengo mucha idea de php y tal..

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)
  4. Emanuel dice:

    Primero quiero felicitarte por el código estimado colega, fue de bastantísima ayuda, espero que no te moleste que lo haya incorporado en mi aplicación web de un sistema de almacenamiento en la nube.

    Ahora para todos aquellos que dicen que no sirve, pues déjenme decirles que sirve perfectamente, seguramente su problema en los PHP es que tienen que cambiar el nombre del campo de almacenamiento del archivo de esta línea por el suyo en el servidor PHP:

    $target_path = basename( $_FILES[‘uploadedfile’][‘name’]);

    Donde dice uploadedfile por su nombre del campo que recibe el archivo en su PHP.
    También a los que dicen que no les sirve en el móvil, es porque tienen que agregar el permiso para conectarse a internet en el manifest o los dará error:

    Por último combine este código con este filebrowser para Android y en combinación es una bomba:

    https://github.com/vaal12/AndroidFileBrowser

    Este programa elije la ruta del archivo con una muy agradable interfaz gráfica y se la envía a este código para subirlo al servidor:

    https://github.com/vaal12/AndroidFileBrowser

    Nuevamente excelente trabajo, saludos.

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: +2 (from 2 votes)
  5. Victor dice:

    Te ha faltado indicar que permisos hay que poner en el manifiesto.

    VA:F [1.9.20_1166]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.20_1166]
    Rating: 0 (from 0 votes)

¿Algo que opinar? Deja tu comentario!