martes, 20 de mayo de 2014

WebService: Subir Imagen a Servidor desde Android.

Buenas amigos, estuvimos viendo en temas anteriores como manejar los datos de un servidor con una base de datos mysql. En este nuevo tema vamos a ver como subir, a nuestro servidor, una imagen tomada con la cámara de nuestro dispositivo.



Bien el tema en sí es un poco complejo pero con un poco de orden podemos lograrlo hacer muy fácilmente. Decir, antes de continuar, que también he creado una nueva tabla en la base de datos llamada "imagenes", la cual la componen un campo ID(primary key y auto incremento) y un campo imagen (Varchar) donde almaceno el nombre, OJO, no la ruta, el nombre de la imagen.

Antes de empezar agregamos permisos a nuestra aplicación:

Posteriormente agregamos la librería httpmine de Apache

httpmine-4.2.5.jar

Creamos una carpeta en nuestro servidor, en mi caso "imágenes". Si ya la tienes creada, ni caso a este punto.

Ahora creamos nuestro archivo xml con los componentes que desee cada uno. En mi caso se compondrán de:

  • ImageButton: Para lanzar nuestra cámara.
  • EditText: Para nombrar nuestra imagen
  • ImageView: Para mostrar la imagen obtenida.
  • Button: Para subir la imagen a nuestro servidor.

Tras realizar nuestro .xml nos vamos a nuestra clase y declaramos los atributos que vamos a necesitar:
Como veis tenemos declarados nuestros 4 componente:
  1. ImageButton camara
  2. ImageView imagen
  3. EditText nombreImagen
  4. Button upload
y otros 3 que vamos a ir utilizando a lo largo de este tema:
  1. Uri output.
  2. String foto
  3. File file.



Una vez llegados hasta aquí creamos un método para activar la cámara del dispositivo:



  • Primeramente almacenamos en la String foto la ruta donde se va a guardar nuestra imagen, en el dispositivo, con el nombre que hayamos elegido.
    • foto = Environment.getExternalStorageDirectory() +"/" +nombreImagen.getText().toString().trim()+".jpg";
  • Pasamos nuestra String foto a File.
    • file=new File(foto);
  • Creamos un Intent que accederá a la cámara de nuestro dispositivo.
    • Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  • Pasamos nuestro File a Uri.
    • output=Uri.fromFile(file);
  • Le pasamos a nuestro Intent la orden de almacenar en el dispositivo la imagen, y el Uri con la ruta de la imagen.
    • intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
  • Nos abre una nueva Activity con nuestra cámara y almacena el resultado para procesarla en el método sobreescrito starActivityForResult(parametro1,parametro2).
    • startActivityForResult(intent, 1);
      • El 1 es para indicar que queremos acceder a la cámara.
Bien, con este método se nos abrirá la cámara de nuestro dispositivo y al obtener una imagen el método startActivityForResult se encargará de procesarla y mostrarla en nuestro ImageView:


  • Creamos un objeto de la clase ContentResolver que nos dará acceso al contenido almacenado en la app.
    •  ContentResolver cr=this.getContentResolver();
  • Creamos un objeto de la clase Bitmap para manejar nuestra imagen que hemos obtenido de nuestra cámara.
    • Bitmap bit=android.provider.MediaStore.Images.Media.getBitmap(cr, output);
      • Le pasamos por argumentos nuestro objeto ContentResolver para permitir el acceso y nuestro Uri indicándole en que ruta está.
  • Una vez hecho esto, le indicamos en que orientación debe estar, esto de por si no lo hace android, tenemos que crear un código para indicar que si una imagen se obtiene en posición landscape u horizontal nos la tiene que mostrar en landscape u horizontal en nuestro ImageView. Esto lo podemos conseguir por medio de un switch y de la siguiente manera:
    • Creamos una variable de tipo int que almacenara los grados que debe ser rotada la imagen.
      • int rotate=0;
    • Creamos un objeto ExifInterface que se encargará de evaluar en que orientación esta nuestra imagen
      •  ExifInterface exif = new ExifInterface(file.getAbsolutePath());
        • Le pasamos por argumentos la ruta absoluta de nuestra imagen.
    • Creamos y almacenamos la orientación que nos devuelve ExifInterface:
      • int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    • Con un switch le damos un valor a rotate según el valor devuelto por ExifInterface:
      • switch (orientation) {
      •    case ExifInterface.ORIENTATION_ROTATE_270:
      •             rotate = 270;
      •              break;
      •   case ExifInterface.ORIENTATION_ROTATE_180:
      •              rotate = 180;
      •              break;
      •    case ExifInterface.ORIENTATION_ROTATE_90:
      •              rotate = 90;
      •              break;
      •         }
    • Creamos un objeto de la clase Matrix que será la encargada de transformar nuestra imagen y rotarla en su posición.
      • Matrix matrix=new Matrix();
    • Le pasamos la rotación que queremos que tenga:
      • matrix.postRotate(rotate);
    • Le indicamos a Bitmap la nueva configuración de la imagen:
      • bit = Bitmap.createBitmap(bit , 0, 0, bit.getWidth(), bit.getHeight(), matrix, true);
  • Finalmente insertamos nuestra imagen procesada a nuestro ImageView
    • imagen.setImageBitmap(bit);
Bien, hecho esto le damos a nuestro ImageButton la acción para iniciar la cámara:

Esta acción comprueba que el Edittext nombreImagen no esté vacío, si lo está, nos manda un Toast de aviso, si no, iniciará la cámara.

Con todo esto ya podremos hacer fotos e ir mostrándolas en nuestro ImageView.

Para subir nuestra imagen a servidor necesitaremos:
  1. Un método que conecte con un WebService
  2. Un WebService que guarde nuestra imagen.
  3. Una clase AsyncTask para ejecutarlo todo.
Nuestro método quedaría de la siguiente forma:

  • Creamos un objeto DefaultHttpClient para realiza la conexión a nuestro WebService.
    • HttpClient httpclient=new DefaultHttpClient();
  • Le cambiamos los parámetros (normalmente utilizamos los valores por defecto, en este caso no)
    • httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
  • Creamos un objeto HttpPost y le pasamos la ruta de nuestro WebService en el servidor por el construtor.
    • HttpPost httppost = new HttpPost("http://192.168.0.11/picarcodigo/upload.php");
  • Creamos un objeto de MultipartEntity, la cual se encuentra en la librería que os pasé antes. Se encargará de ayudarnos a subir el archivo almacenándolo (en temas anteriores vimos que utilizábamos BasicNameValuePair para almacenarlos).
    • MultipartEntity mpEntity = new MultipartEntity(); 
  • Creamos un objeto FileBody el cual ayudará a subir el contenido indicando, por constructor, el archivo a subir y el tipo, en este caso una imagen en formato jpg ("image/jpeg").
    •  ContentBody foto = new FileBody(file, "image/jpeg");
  • Le pasamos en contenido almacenado en FileBoody y se lo pasamos MultipartEntity para que lo almacene
    • mpEntity.addPart("fotoUp", foto);
  • Pasamos el objeto mpEntity y lo almacenamos en nuestro httppost
    • httppost.setEntity(mpEntity);
  • Ejecutamos nuestro httpclient pasándole toda la información necesaria por httppost
    • httpclient.execute(httppost);
  • Una vez ejecutado todo, obtenemos la conexión y la cerramos.
    • httpclient.getConnectionManager().shutdown();
Bien, es un poco complejo, pero siguiendo los pasos es sencillo. Veamos como queda nuestro WebService:


Bien, un poco distinto a lo visto en otros temas:
  • Le indicamos cual va a ser la ruta que va a tener en nuestro servidor, recordar que mi carpeta se llamaba imagenes.
    • $ruta = "imagenes/" .basename($_FILES['fotoUp']['name']);
      • A la variable $_FILES se le adjudicara la ruta y el nombre.
  • Creamos una condición if y con la ayuda del método move_uploaded_file movemos la imagen desde nuestro dispositivo al servidor.
    • if(move_uploaded_file($_FILES['fotoUp']['tmp_name'], $ruta))
      • Este método tiene 2 parámetros, el primero es de donde viene el archivo y el segundo es donde va a ser copiado.
  • Damos permisos al archivo por medio del método chmod
    • chmod ("uploads/".basename( $_FILES['fotoUp']['name']), 0644);
      • 2 parámetros, el tipo de archivo, y los permisos, 0644 en este caso. El 6 para administrador, el primer 4 para grupos y el segundo 4 para usuarios (creo que es así, no estoy muy puesto en permisos)Adjunto tabla de la wikipedia:

Bien, así queda nuestro WebService, pongámoslo todo a correr en un AsyncTask:


Bien nuestra clase AsyncTask va a utilizar los métodos onPreExecute y onPostExecute, los cuales realizan acciones antes y después de la acción del método doInBackground() respectivamente.

En el método onPreExecute creamos un progressDialog que se mostrará mientras se sube nuestra imagen, y lo cerramos en el on PostExecute una vez realizada la acción de doInBackground.

En el método doInBackground llamamos al método uploadFoto y le pasamos por parámetro la url de nuestra imagen. Posteriormente, y como dije al principio del tema insertaremos el nombre de la imagen en una tabla de la base de datos.

No voy a explicar lo que hace el método insertar, ni su WebService, os pongo las imágenes y si queréis saber como funciona exactamente podéis visitar la PARTE 1.

Método onInsertar():

WebService InsertImagen.php



Hecho esto, le damos la acción a nuestro botón Upload:

Comprobamos que el archivo existe, y si es así, nos ejecuta toda la parafernalia.

Bien, espero que no haya sido mucho lío ni mucha confusión. Este código funciona, estar seguro de que tenéis vuestro servidor correctamente configurado cuando ejecutéis.

Aquí os dejo los archivos (xml, .java y .php): WebServiceUploadImage

Un saludo.

111 comentarios:

  1. Hola!! Excelente explicación.
    Pero que crees, sólo me inserta en la BD, pero nunca en la carpeta de mi servidor =(
    Y en LogCat solo notifica algo como 05-26 10:52:32.771: E/StatusBarPolicy(1612): ecio: 37
    No sé que signifique, ojala puedas ayudarme, Gracias!!

    ResponderEliminar
    Respuestas
    1. Buenas Karina.

      Algún error he tenido alguna vez por no tener puestas bien las rutas donde van las imágenes, pero no tiene porque ser tu caso, aún así revísalo, comprueba también que tipo de excepción te salta, y si no te salta, es posible que el error esté o bien en el servidor o en el archivo php, así acotamos el fallo.

      Tendrás que enviarme todo el log que reporta tu aplicación. Puedes enviármelo a bartolomeabellan@gmail.com, o bien pegarlo aquí. Solo con E/StatusBarPolicy(1612) no te puedo ayudar.

      Un saludo.

      Eliminar
    2. Hola amigo esto funciona para cualquier tamaño del archivo? o solo 1M?

      Eliminar
  2. broo puedes pasarme el código, te agradecería bastante!

    ResponderEliminar
    Respuestas
    1. Al final del post esta el enlace de descarga bro, hay que leer hasta el final. Suerte

      Un saludo

      Eliminar
    2. Me refería al proyecto de eclipse completo, tengo muchos problemas al pasarlo a un proyecto. te dejo mi correo d.villamarin9@gmail.com

      Muchas gracias

      Eliminar
  3. Bartolomé solo me funciona lo de la base de datos pero no la envía al servidor, pero el log no me lanza ningun error y el php esta tal cual el tuyo pero con la ruta de mi carpeta en el servidor...no sabes que puede ser...

    ahhhhhhhhh karina si lo pudiste resolver avisame como porfavor :)

    ResponderEliminar
    Respuestas
    1. Buenas Jorge, ¿Cuando pulsas uploads te sale el mensaje de "imagen subida con exito"? Si es así, el código funciona bien y el problema debería de estar en tu servidor. Si no es así, es decir, no te muestra el mensaje del éxito al subir tu imagen, hay que comprobar el código.

      A veces me olvido de que yo pruebo todos estos tutoriales en un xperia Z que tiene una capacidad de memoria muy alta. Prueba a poner este código que te paso en el método "onActivityResult" entre el switch y la clase matrix:

      BitmapFactory.Options options = new BitmapFactory.Options();
      options.inSampleSize = 2;
      bit = BitmapFactory.decodeFile(foto, options);

      Android gestiona muy mal imágenes muy pesadas y con resoluciones elevadas, si lo pruebas en un dispositivo con poca memoria (512mb mas o menos) es posible que falle, aunque yo tengo un dispositivo (xperia arc) con 512mb y no me ha creado ningún problema.

      Seguiré investigando un poco a ver cual puede ser el problema. Aunque comprueba si el problema puede ser de código (comprobando lo que te dije antes) o del servidor.

      Si hay alguien que lo haya probado y le funcione, que lo diga. Yo os subiré imágenes de como me funciona a mi.

      Un saludo.

      PD: Comprueba el cortafuegos de windows y el de tu router, desactivalos no vaya a ser que el problema esté por ahi (yo los tengo desactivados).

      Eliminar
  4. voy a probar y te aviso...yo estoy trabando con un xperia L....

    ResponderEliminar
  5. tenias razón Bartolomé era solo un error en mi servidor....te pasaste por el tutorial muchas gracias... oye tu sabes ahora como puedo hacer para mostrar la imagen que subí en el dispositivo????

    ResponderEliminar
    Respuestas
    1. Jorge disculpa como supiste que era poblema en el servidor? y como se soluciona?

      Eliminar
    2. Hola, por si aun no lo resuelves, yo tube el mismo problema, lo solucione dandole permiso total a la carpeta, estoy trabajando en linux asi q desde consola ejecute el comando sudo chmod 777, de esta forma ya empezo a guardar correctamente las imagenes, si estas en windows dale click derecho y quitar la opcion solo lectura por si esta habilitada, de otra forma averigua sobre los permisos requeridos en tu sistema, suerte.

      Eliminar
  6. Excelent aportacion si me funciono una pregunta como lo puedo hacer ahora seleccionando la imagen desd la galeria i subir al servidor la imagen

    ResponderEliminar
  7. se hacen los registros a la base de datos y me sale que la imgane fue cargada con exito,.....pero no la pone en dicha carpeta imagenes....ya no se que mas probar/...en verdad esta igual el codigo apuntando a mi server web,,,,,que sera? en verdad necesito el ejercicio

    ResponderEliminar
    Respuestas
    1. Buenas, tiene pinta de ser problema de permisos, vete a tu servidor, pincha con botón derecho sobre tu carpeta imagen y le das a propiedades, alli desactiva la opción de "solo lectura", si la tienes desactivada, comprueba que la carpeta de tu servidor la tenga desactivada también.

      Me han llegado muchos emails preguntandome por el mismo problema que tu, y en el 90% ha sido por este problema, si no es asi, avisame y te ayudo en lo que pueda.

      Eliminar
    2. Bartolome muchisimas gracias por contestar. Ya cambie de 0715 a 0777 (todos los permisos) en permisos tanto la carpeta de servidor como la carpeta de imagenes y nada...no las sube... el .php invoca uploads/ ......eso de que trata? sera la extension jpg....aunque mi movil genera las imagenes .jpg......no se que puede ser?

      Eliminar
    3. Bartolome ..no uso localhost.....yo tengo el webservice y la carpeta imagenes en un servidor remoto....sera por eso? faltara algo en el manifest?

      Eliminar
    4. Que el servidor sea remoto no es un problema, he estado trabajando con un servidor alojado en filipinas y no tuve ningún problema, aunque cierto es, que, a mi me lo dieron todo hecho, es decir, el administrador del servidor me dio todos los permisos y accesos y funcionó correctamente.

      Respecto a tu duda de si falta algo en el manifest, la respuesta es no, ya que te da éxito tanto al escribir en la DB como al subir la imagen. Si el manifest tuviese algún problema de permisos (como el de internet), directamente se te inmola cuando intenta ejecutarse.

      Me han llegado varios emails con el mismo problema que tu, en el 90% de los casos el problema ha sido que la carpeta imagenes estaba marcada como "solo lectura", el otro 10% eran problemas de configuración del servidor(no abrian bien los puertos, o tenian programas utilizando los mismo puertos que el servidor, normalmente el 80 o 8080, y cosas así). Yo personalmente, creo que es cosa de permisos, pero me dices que los cambiastes a 0777 y te creo, así que no se decirte, lo único, mandame el logcat cuando lo ejecutes, a ver que dice....

      Suerte

      Un saludo

      Eliminar
    5. ok voy a mirar logcat...pero antes bartolome una pregunta...esa linea en upload.php que dice chmod uploads/ eso es una carpeta? es que estoy empezando en android

      Eliminar
    6. Y muchas gracias por tu paciencia y atencion!!

      Eliminar
    7. De nada, para eso estamos.

      Cuando yo le digo chmod uploads/ le estoy dando permisos al archivo, es decir, le hago saber al servidor que el archivo que he subido (uploads/) va a tener los permisos indicados. Realmente, no creo que afecte a tu servidor, solo al archivo que ha sido subido.

      Un saludo

      Eliminar
    8. hola Bartolome, solo con una duda, la ruta de uploads/ no la entiendo, es donde tienes las imagenes en el movil android n0???

      Eliminar
    9. Buenas Yoban;

      Esa ruta pertenece al servidor, es decir, yo tengo una jerarquía de carpetas de la siguiente forma: root/picarcodigo/uploads/imagenes.

      Cuando yo subo un archivo a la carpeta imágenes, le doy permisos de lectura y escritura a uploads, ya que de esta forma no me dará problemas al insertar u obtener archivos (en este caso imágenes) que estén dentro de esta. Y si te preguntas por que le doy permisos a uploads y no a imágenes, te diré que si yo tengo 20 carpetas dentro de uploads, debería escribir mucho código para dar permisos a todas ellas cada vez que subo un fichero, por lo tanto se los doy a uploads y ya el resto de carpetas en su interior obtendrán los permisos de esta.

      Un saludo espero haberte ayudado.

      Eliminar
  8. Hola estoy haciendo lo mismo para subir una imagen almacenada en la memoria sd y cuando la intento subir al servidor la aplicacion se cierra, tengo los permisos tal como esta al inicio del blog, alguien me puede ayudar.

    ResponderEliminar
    Respuestas
    1. Buenas Luis, me tendrías que mandar el log que produce para poder ayudarte, asi, a palo seco, no se que le pasa. Mandame el log a bartolomeabellan@gmail.com y vemos por que te hace crash la app.

      Un saludo.

      Eliminar
  9. Buenas, vete a la carpeta "imagenes" de tu servidor, pinchale con botón derecho y le das a propiedades, y mira a ver si tienes marcado la opción de "solo lectura" en la carpeta, si es así desactivala, si no es así y no está marcada como "solo lectura", comprueba que la carpeta de tu servidor no esté marcada como "solo lectura".

    Suerte, avisame si te funciona o no.

    Un saludo.

    ResponderEliminar
  10. Buenas, la carpeta imagenes ya tenia en permisos 777, ahora en la carpeta del servidor tambien le he dado permisos 777 y sigue sin funcionar. Los archivos PHP son los mismos que los de la página cambiados para que se conecten a mi servidor. ¿Que puedo estar haciendo mal?

    Un saludo.

    ResponderEliminar
  11. Buenas, ya lo solucione, simplemente tenia la carpeta imagenes en el sitio equivocado, aun asi muchas gracias por la ayuda y tu tiempo!

    Un saludo.

    ResponderEliminar
  12. Es cierto, me lo comentaste en el primer mensaje, lo siento, no lo lei bien, me alegro de que te funciones.

    Un saludo.

    ResponderEliminar
  13. donde debe estar creada la carpeta "imagenes", en que ruta del servidor?

    ResponderEliminar
  14. te agradezco de principio Bartolomé

    ResponderEliminar
    Respuestas
    1. La carpeta "imagenes" debe estar dentro de la carpeta de tu servidor, en mi casa dentro de la carpeta "picarcodigo" que tengo en mi servidor.

      Un saludo.

      Eliminar
    2. Excelente, Muchas gracias me funcionó correctamente... Bendiciones!!!

      Eliminar
  15. Disculpa Bartolomé, si deseo tomar una segunda foto al instante despues de tomar la primera, como comparo si la imagen que voy a volver a tomar tiene el mismo nombre que la imagen que ya se encuentra en ruta por defecto que guarda la galería?

    gracias,

    ResponderEliminar
  16. Si deseo eliminar esa imagen que cargue en el servidor desde el movil como seria?

    ResponderEliminar
  17. Como hago para cambiar la ruta de guardado de esas imágenes en el archivo PHP de mi web service?. Es decir mi ruta seria C:\proyectos\agua\imagenes.

    Te lo agradezco enormemente

    ResponderEliminar
    Respuestas
    1. para empezar instala PHP, me imagino que no lo tienes instalado, de ser así sabrías la ruta

      Eliminar
  18. Bartolome, Muchas gracias buen tutorial, podrias explicar como mostrar la imgen en el dispositivo movil y poder borrarla desde allí. o si sabes de algun sitio donde pueda encontrar esto te lo agradezco

    ResponderEliminar
  19. Hola Bartolome, serias tan amable de pasarme la clase MultipartEntity y la clase ContenBody! URGE :cccc
    GRACIAS SALUDOS! :D

    ResponderEliminar
    Respuestas
    1. Buenas, al principio del post pongo para descargar una libreria (httpmine-4.2.5.jar), en esa librería están las clases que se necesitan.

      Un saludo, siento la tardanza.

      Eliminar
  20. Hola Bartolome, mi nombre es Francisco Javier, queria comentarte lo que me pasa y es que creo toda la aplicacion tal cual , le doy un nombre a la imagen y me dice que la aplicacion se ha cerrado de forma imprevista no se porque si me pudieras ayudar he hecho de todo poner el nombre de la foto con extension sin el y nada al darle al boton upload me pone el mensaje.
    Estoy creando una aplicacion y lo de subir el nombre a la base de datos me daria igual pero si necesito saber porque se me cierra el programa y no me funciona, te agradceria me ayudaras, yo he colocado la direccion de subida de la forma
    http://www.ffffffff.es/imagenes/upload.php, donde imagenes es la carpeta donde se me almacenaran las fotos y ahi tambien tengo el php upload que me he bajado de el archivo y que tu das.
    muchas gracias
    Un saludo

    ResponderEliminar
    Respuestas
    1. Buenas Francisco Javier;

      La cosa es que el archivo upload yo lo tengo puesto fuera de la carpeta imagenes, me explico;

      En mi carpeta htdocs de apache creo una carpeta llamada "picarcodigo", dentro de esa carpeta tengo la carpeta imagenes y los archivos .php

      La url que utilizo para subir las imágenes es "http://localhost/picarcodigo/upload.php" ya que en el archivo upload.php ya va dentro la ruta de mi carpeta imagenes, por lo tanto si tu tienes una carpeta imagenes y dentro el archivo upload.php, te va a buscar una carpeta imagenes donde este situado tu upload.php, al no tener ninguna carpeta imagenes (ya que tu archivo php está dentro de la carpeta misma) te hace un crash, por lo tanto, por ese lado, saca el archivo .php de la carpeta imagenes o crea otra carpeta imagenes donde tengas el .php

      Otra cosa es lo del nombre, ahí puede existir algún tipo de error o te cause algún tipo de conflicto con alguna otra variable, así que necesitaría el logcat para saber exactamente porque te falla ahí, pero yo creo que el error que te produce es por lo comentado antes de tu archivo php.

      Suerte, comenta si tienes algún otro fallo o se te solucionó el problema.

      Un saludo

      Eliminar
  21. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
    Respuestas
    1. Ya lo tengo, cuando lo vea con detenimiento, te digo algo.

      Un saludo

      Eliminar
    2. Te lo agradecere, en serio me esta volviendo loco

      Eliminar
  22. Hola, resulta que selecciono imagenes desde mi galeria o bien las saco desde la cámara, luego obtengo la URI seleccionada. Estas uri las paso a bitmap y las dejo en un ListView para que el usuario pueda ingresar varias imagenes. El caso es que cuando intento pasar mi tercera imagen seleccionada me lanza un error en mi aplicacion al tratar de convertir mi uri en bitmap, las 2 primeras imagenes que subo no tienen ningun problema.

    Aca el código de uri a bitmap

    Bitmap nuevobitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);

    selectedImage es mi uri (este uri viene con datos, incluso la puedo convertir en un path, pero al pasarlo a bitmap se cae).



    Alguna idea? Muchas gracias.

    ResponderEliminar
  23. Bartolome mira revise la carpeta de imágenes le quite la opción de solo lectura y aun así no sube la imagen, estoy usando wampserver tengo una carpeta imagenes dentro de wamp/www/hotel/imagenes esta bien? ayudame por favor, se que la aplicación esta bien porque la información que debe estar en la base de datos esta pero la imagen nada

    ResponderEliminar
    Respuestas
    1. Buenas;

      Aparte de revisar la carpeta imagenes, revisa las otras también (wamp, www/ y hotel), solo conque alguna lleve la de "solo lectura" te fastidia todo el cotarro.

      Otra cosa no te puedo comentar sin el catlog que te tira, y si no te tira ningún catlog, te puedes ir a tu carpeta de wampserver y buscar la carpeta log (ahora mismo no me acuerdo de su ruta), en esa carpeta log están los log que te lanza el wampserver, compruébalos para ver que errores te está tirando.

      Siento no poder ayudarte más, pero sin ver los log's lo único que te puedo comentar es que revises bien las carpetas por si tuviesen "solo lectura" o comprobar la url de tu programa, pero eso ya lo habrás comprobado millones de veces, así que sin algo más de info por parte de los logs, no te puedo ayudar más, lo siento :(

      Suerte.

      Eliminar
    2. hola muy buen tutorial me funciona casi todo puedo abrir la camara tomar la foto nombrarla pero el problema esta al subir la imagen al servidor el archivo php que se encarga de subirla si uso un formulario html si lo sube sin problemas pero si uso el formulario de android no llega al servidor.

      ¿que puedo hacer?

      Eliminar
  24. Felicidades Bartolome, como debo modificar esto para poder enviar un archivo de audio sea mp3 o wav el cual ya lo tengo grabado en una carpeta del dispositivo y enviarlo a una tabla en mysql.

    Muchas gracias por tu ayuda.

    ResponderEliminar
  25. Hola amigo...
    Me da error en esta fila:
    ContentBody foto = new FileBody(file, "image/jpeg");

    ResponderEliminar
  26. Buenas!
    Antes de nada, felicitarte por tu trabajo

    He realizado todo lo que has comentado, pero hay una parte que se me queda tachado, todo lo refente a http*

    private void uploadFoto(String imag){
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
    HttpPost httppost = new HttpPost("http://192.168.0.11/picarcodigo/upload.php");
    MultipartEntity mpEntity = new MultipartEntity();
    ContentBody foto = new FileBody(file, "image/jpeg");
    mpEntity.addPart("fotoUp", foto);
    httppost.setEntity(mpEntity);
    try {
    httpclient.execute(httppost);
    httpclient.getConnectionManager().shutdown();
    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    No se muy bien por que me esta pasando esto... pero me he quedado pillado.
    Me puedes echar una mano?? o si alguien sabe como solucionar

    Muchas gracias

    ResponderEliminar
    Respuestas
    1. a mi me pasa lo mismo lo pudiste solucionar?, saludos :D

      Eliminar
    2. a mi me pasa lo mismo lo pudiste solucionar?, saludos :D

      Eliminar
    3. requieren http components y http client ademas de http mine

      Eliminar
    4. Pudiste solucionar ese problema?

      Eliminar
  27. Hola amigo... que tal... me esta sirviendo de mucho tu trabajo... muchas gracias... pero al igual que muchos aqui... también no me sube la imagen a la carpeta... ya cheque los permisos y aparentemente están bien... ya cambie cosas al PHP y tampoco... alguna otra idea del porque no me fusiona? Saludos!!

    ResponderEliminar
  28. Buenas Bartalome tengo una duda; al igual que ha mucho a mi no me subia la imagen al server pero lo logre solventar revisando muy bien el codigo y por ello te FELICITO gracias me sacaste de una que no tienes idea, no obstante tengo una duda como puedo hacer para hacer lo mismo solo que escogiendola desde la galeria si no te molestas te pedire que seas un poco explicito ya que apenas estoy empezando en estos ambitos
    Gracias de antemano,
    PSD: puede responder cualquiera que sepa y que lea esto por favor es urgente...

    ResponderEliminar
  29. ALguien puede ayudarme? solo necesitaro guardar un monto y la foto que se tome o seleccione.
    Solo em falta el guardar los datos lo demas ya lo tengo. Estoy utilizando Androdi Studio. HELP! :(

    ResponderEliminar
  30. no sube la imagen el nombre de la imagen y el formato pero jamas la imagen me pueden explicar por fa como es q sube y que tipo de dato debe aceptar la tabla por q la resivon eun un varchar ey en un blob la visualizo y solo elnombre no apaese la imagen que estare asiendo mas podias decirme ens si cuan es el proceso donde la sube porfa

    ResponderEliminar
  31. Hola disculpen alguien puede ayudarme:
    Cuando tomo la foto desde la App y darle OK en ocasiones regresa a la pantalla principal y muestra la vista previa, pero en ocasiones se detiene y me señala que esta mal la siguiente linea de código:

    bit = android.provider.MediaStore.Images.Media.getBitmap(cr, output);

    También me queda tachado, todo lo referente a http*

    Por favor alguien podría ayudarme ya intente solucionarlo pero se sigue deteniendo (Soy nueva en este tema)...

    solo modifique la ruta de la foto a:

    foto = Environment.getExternalStorageDirectory() + "/"+ "Expedientes" + "/" + NombreCarClient + "/"+ "Documentos"+"/"
    +nombreImagen.getText().toString().trim()+".jpg"; //--->RUTA ...



    Estoy trabajando con Android Studio

    ResponderEliminar
    Respuestas
    1. Hola eso se debe al uso de bitmaps de imágenes muy pesadas.. en un momento hace crash debido a que se llena la memoria..

      Eliminar
  32. Exelente trabajo, podrias volver a subir el proyecto completo, ya que el link parece estar caido.

    ResponderEliminar
  33. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  34. Buenos días Ingeniero, quiero agradecerle por brindarnos sus conocimientos, muy chevere sus tutoriales. Ingeniero me puede colaborar por favor, no he podido encontrar una solución y no quiero quedarme con "no pude no intento mas" el que persevera alcanza, una ayuda o una iniciativa por fa.
    Me encontraba trabajando en eclipse Indigo, un día x no me continuo funcionando los emuladores, arrojando el siguiente error, y pues nada que encuentro la solución, lo que he echo es instalar de nuevo la plataforma eclipse con sus requerimientos y nada que me sirve los emuladores, intento crear emuladores nuevos y tampoco este es el error que me dice:
    Starting emulator for AVD 'Android-4-3-1'
    Failed to create Context 0x3005
    emulator: WARNING: Could not initialize OpenglES emulation,
    /////////////////////////////////
    //using software renderer.
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //could not get wglGetExtensionsStringARB//
    //Could not initialize emulated framebufferCannot set up //guest memory 'android_arm': Invalid argument//
    ////////////////////////////////////////
    Al comienzo que empece con eclipse me arrojaba un error parecido e investigue y aumente la ram a 1024 y se soluciono, pero esta vez no.
    Agradezco la ayuda, no encuentro como solucionar esto.

    ResponderEliminar
    Respuestas
    1. La solución que me acabo de dar, es instale Android Studio y ejecute o cree un emulador y me funciono.
      Entonces intente abrirlo por eclipse y ya todo esta bien.

      No supe cual era el error pero ya puedo continuar trabajando en esto.

      Eliminar
  35. hola oye necesito tu ayuda, de un error, esperare tu respuesta para poder mostrartelo

    ResponderEliminar
  36. Hola buen dia, estoy realizando algo muy similar a esto, pero el problema que tengo es que el http esta deprecated, alguna idea de cual otra pudiese usar?? algo similar ya que soy novato en android

    ResponderEliminar
  37. excelente ayuda , para subir un txt o pdf como seria?
    que kambio habria k hacer?

    ResponderEliminar
  38. Hola estoy usando android studio y ya agrege el httpmime pero al ejecutar la app, me sale error de que la clase no exite, me podrias ayudar por favor. gracias

    ResponderEliminar
  39. Saludo. Podríamos por favor conversar vía Skype? mi usuario es agromerchant. Requiero subir fotos, adjuntar datos de esa imagen. Dar acceso a ciertos usuarios, con contraseña... etc. Gracias mil.

    ResponderEliminar
  40. Saludo. Podríamos por favor conversar vía Skype? mi usuario es agromerchant. Requiero subir fotos, adjuntar datos de esa imagen. Dar acceso a ciertos usuarios, con contraseña... etc. Gracias mil.

    ResponderEliminar
  41. Hola saludos desde Guatemala, necesito ayuda con el codigo en que quiero enviar la imagen pero antes comprimirla para que sea mucho mas rapido el envio como podria lograrlo, algien que me pueda ayudar

    ResponderEliminar
  42. Mi hermano del alma, gracias, gracias y muchisimas gracias, estoy haciendo mi proyecto de grado y el ultimo modulo que me faltaba era precisamente la montada de una foto, con esto cierro con broche de oro la beta de mi aplicacion.
    Saludos.

    ResponderEliminar
  43. Estoy utilizando Android Studio, pero ya compila pro a la hora de subir se que queda en actualizando el servidor y de ahí no pasa.Alguien sabe?
    O que me ayude?

    ResponderEliminar
    Respuestas
    1. Revisa los permisos de la carpeta donde guardas las imágenes, saludos

      Eliminar
  44. Muchas gracias, me fue muy útil.

    Saludos hermano....

    ResponderEliminar
  45. que tal como están? tengo un problema, es relacionado a servidores locales, no se si vaya aqi o donde; bueno ahí va: he creado un servidor local con mi cel Android y kws, lo que quiero hacer es cargar un exploit para la consola wiiu;pongo los archivos en la raíz del cel y los cargo en el navegador de la consola; tiene que cargarse 2 veces en el navegador; una para cargar el kernel exploit y otra para cargar el programa que corre los backups, eston se corren a través de una memoria sd, ya los tengo preparados y listos, mi pregunta es: tengo que guardar los mismos archivos en la raíz del cel y en la SD? el index.html tiene que ser el mismo o tengo que editarlo, sinceramente no soy programador pero me interesan estos temas, si alguien me pudiera ayudar estaría muy agradecido, pueden preguntar lo que sea, se que es otro tema, pero es relacionado a servidores, gracias x su tiempo, ojala a alguien le interese. Gracias.

    ResponderEliminar
  46. De antemano excelente aporte. Tan solo tengo una duda; como quedaría el código si en lugar de PHP fuera C# ?

    ResponderEliminar
    Respuestas
    1. sucede que las imágenes están dentro del servidor del mysql y por lo tanto si necesitas con el C#, seria con el IIS(publicarías con el IIS), revisa este link
      http://www.sgoliver.net/blog/acceso-a-servicios-web-soap-en-android-22/

      Eliminar
  47. Muchas gracias por este increíble código, sinembargo tengo problemas con el sdk 23, tengo entendido que hay algunos comandos que ya son "obsoletos" para el 23, para que sdk se diseño este código? ya voy a probar con el 21 a ver que pasa.

    ResponderEliminar
  48. Gracias por el código esta genial me ayudo mucho, pero tengo un problema: me aparece un error cuando pongo "serverUpdate() para cargar la foto no se que pueda estar generando este error no se si alguien me pueda ayudar. Les agradecería mucho

    ResponderEliminar
    Respuestas
    1. tiene que verificar si realmente esta igual al ejemplo, revisa minuciosamente

      Eliminar
  49. Mi estimado, cuando necesito obtener una imagen de la unidad C:Imegen/todas mis imaganes y poder visualizarlo en mi App, como seria?

    ResponderEliminar
  50. Buen día al momento de ejecutar me sale Sin éxito al subir la imagen

    ResponderEliminar
  51. Buen día al momento de ejecutar me sale Sin éxito al subir la imagen

    ResponderEliminar
  52. no puedo abrir el proyecto me indica q el archivo rar eta dañado

    ResponderEliminar
  53. Hola muchas gracias por tu tutoriales agradezco que hallas compartido tu conocimiento, tengo las siguientes dudas:
    1. En el php en donde debo colocar la carpeta y si tengo que darle algún permiso especial???
    2. Me gustaría que a la misma vez se alojará la imagen en una base de datos como debería hacer el proceso???
    3. En el caso de querer obtener una imagen de la galería de fotos cual seria el código correcto.
    Agradezco la colaboración que me brindes es de suma importancia para mi gracias.

    ResponderEliminar
  54. muchas gracias por el material pero yo tengo un problema ala hora de oprimir el boton upload la aplicacion se detiene alguien que me pueda ayudar de ante mano gracias ..

    ResponderEliminar
    Respuestas
    1. Hola Daniel revisa la resolución de la cámara si es muy pesada siempre se te detendrá

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  55. Hola:
    muchas gracias por tu tutoriales agradezco que hayas compartido tu conocimiento, tengo las siguientes dudas:
    1. En el php en donde debo colocar la carpeta ya que la estoy manejando en la carpeta del directorio pero no me esta guardando las imágenes y si tengo que darle algún permiso especial???
    2. Me gustaría que a la misma vez se alojará la imagen en una base de datos como debería hacer el proceso???
    3. En el caso de querer obtener una imagen de la galería de fotos cual sería el código correcto.
    4. Al darle upload me indica que la foto quedo subida pero no se en que carpeta se esta guardando y en la BD no esta guardando
    Agradezco la colaboración que me brindes es de suma importancia para mi gracias.

    ResponderEliminar
    Respuestas
    1. Hola, alguna vez yo hice el cambio para que trajera las imágenes desde la galería, lo único que debes hacer es cambiar el Intent para que llame a la galería en vez de la Cámara

      Eliminar
  56. cual fue la ruta correcta entonces?, que ami como a casi todos le funciona bien el codigo en android studio, la base de datos imagenes si se actualiza, me da el mensaje de exito en la conexion, pero no me sube las imagenes.

    ya le quite a la carpeta solo lectura, y desactive el antivirus..

    porcierto, no se si puedas hacer el codigo para PDO en vez de mysql_query

    ResponderEliminar
  57. Funciona bien la conexión solo que actualice los ficheros a php5 y funciona correctamente pero hay un problema solo se guarda el nombre en la tabla pero en la carpeta no se genera.

    ResponderEliminar
  58. OpenGL ES Shader Compiler Version: E031.24.00.15
    Build Date: 05/13/14 Tue
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.1_RB1.2
    Local Patches: NONE
    Reconstruct Branch: NOTHING
    07-05 11:47:04.844 29575-29575/com.robeasd.takepicture D/OpenGLRenderer: Enabling debug mode 0
    07-05 11:47:04.984 29575-29575/com.robeasd.takepicture I/ActivityManager: Timeline: Activity_idle id: android.os.BinderProxy@4195b368 time:128725784
    07-05 11:47:16.544 29575-29575/com.robeasd.takepicture W/IInputConnectionWrapper: showStatusIcon on inactive InputConnection
    07-05 11:47:20.964 29575-29575/com.robeasd.takepicture D/dalvikvm: GC_FOR_ALLOC freed 456K, 30% free 3372K/4792K, paused 138ms, total 138ms
    07-05 11:47:20.964 29575-29575/com.robeasd.takepicture I/dalvikvm-heap: Grow heap (frag case) to 18.227MB for 12582928-byte allocation
    07-05 11:47:21.374 29575-29575/com.robeasd.takepicture D/dalvikvm: GC_FOR_ALLOC freed 34K, 9% free 15629K/17084K, paused 10ms, total 15ms
    07-05 11:47:21.374 29575-29575/com.robeasd.takepicture I/dalvikvm-heap: Grow heap (frag case) to 30.197MB for 12582928-byte allocation
    07-05 11:47:22.324 29575-29575/com.robeasd.takepicture I/Adreno-EGL: : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.052_msm8610_LNX.LA.3.5.1_RB1__release_AU ()
    OpenGL ES Shader Compiler Version: E031.24.00.15
    Build Date: 05/13/14 Tue
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.1_RB1.2
    Local Patches: NONE
    Reconstruct Branch: NOTHING
    07-05 11:47:22.864 29575-29575/com.robeasd.takepicture I/ActivityManager: Timeline: Activity_idle id: android.os.BinderProxy@4195b368 time:128743662

    ResponderEliminar
  59. Buena tarde, a mi no me muestra la imagen en el ImageView y tampoco la sube al servidor, podrías apoyarme a solucionarlo?

    ResponderEliminar
    Respuestas
    1. Solucionado el problema!

      Eliminar
    2. ¿Te importaría compartir como lo has solucionado? me ocurre lo mismo! Un saludo

      Eliminar
  60. disculpa bartolome el principio del tutorial hablas de crear una carpeta de imagen como se hace eso o que es yo soy principiante en ello

    ResponderEliminar
  61. como puedo hacerle para subir dos imagenes?

    ResponderEliminar
  62. sabes como mandar a un servicio web asmx c#

    ResponderEliminar
  63. Hola amigo esto sirve para cualquier tamaño de archivo o solo para 1 MB

    ResponderEliminar
  64. Me funciono Perfecto muchas gracias Testeado en android api 22

    ResponderEliminar
    Respuestas
    1. amigo me podrias pasar el codigo funcionando te lo agradeceria de antemano mi correo fallenpulla@gmail.com

      Eliminar
  65. saludos amigo muy buen tuto ayuda mucho para otras cosas eres un crack en esto amigo tengo un problema el codigo lo tengo vien resolvi poco poco los errores yo solo pero no se porque no me muestra la imagen en el imageview si no lo hace no puedo subir la foto sera por la api yo la estoy usando en una api 15 y tu usas una api 19

    ResponderEliminar
    Respuestas
    1. que tal... tengo el mismo problema que tu.. no me aparece la imagen en el ImageView... lo pudiste solucionar?

      Eliminar
  66. Hola muy buenas, esto siguiendo tus pasos, para mi proyecto lo que necesito saber es si está bien el php, eso es para un webservice local y lo que quiero,utilizar un webservice alojado en un servidor de hostinger, y utilizo para la gestion de mis archivos el invisionfilemanager, La pregunta es ¿no tendría que poner en el php una ruta en plan de esta manera http://theturistllion.hol.es/upload?

    ResponderEliminar
    Respuestas
    1. Hola, yo tenia el mismo problema que algunos ponen con respecto a que se guarda en base y no se sube el archivo, después de buscar algún error en el android studio no encontraba algo que me indique el error, yo uso XAMPP y después de mucho testear me dio por revisar el log de error del servidor, me encuentro con el siguiente error:

      move_uploaded_file(imagenes/lady-26.jpg): failed to open stream: No such file or directory in C:\\xampp\\htdocs\\ReconocimientoFacial\\cargarImagen.php on line 3

      el problema era que la carpeta imagenes como se indica en el tutorial debe estar en el mismo directorio que tenemos el archivo upload.php, hice eso y se solucionó el problema.

      ademas cambie el contenido del archivo upload.php y funcionó correctamente.

      $target_path = "imagenes/".basename( $_FILES['fotoUp']['name']);

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

      Saludos

      Eliminar
  67. Buenas tardes he usado el código pero no me sale imagen subida con éxito he probado el php sólito y si me sube la imagen pero cuando envió la imagen desde android a través de la url se me cae la app he revisado el código linea por linea de lo descargado y lo de la web hay cosas cambiadas las modifique a como tiene en su web y nada que problemas podrían ser me hacen falta mas librerías aparte del httpmine o no funciona en un dispositivo con android 9 un xiaomi m1 o es el problema en el asyntask gracias espero me ayuden o si alguien me puede facilitar e proyecto funcionando correctamente muy amablemente

    ResponderEliminar