Envío de imágenes a un servidor web

Tengo que crear una aplicación que envíe imágenes desde el teléfono a un servidor web. Lamentablemente, realmente no sé cómo hacer esto. ¿Podría alguien ayudarme por favor?

Use el servicio web para lograr esta tarea.

Para utilizar el servicio web en Android, visita estos enlaces.

  1. Biblioteca kSoap2 utilizada para llamar al servicio web desde un dispositivo Android.
  2. Llamando al servicio web simple en Android.
  3. Llamar al servicio web y cargar el archivo a través de HttpClient
  4. Servicio web que devuelve una matriz de objetos con KSOAP : para objetos complejos.
  5. Acceder a un servicio web JAX-WS desde Android
  6. Cómo hacerlo: Android como un cliente RESTful

Aquí está el código que estoy usando para subir imágenes a un servidor remoto, usando sockets sin formato. Las ventajas del socket crudo sobre httpclient es que puede mostrar una barra de progreso de carga.

Descargo de responsabilidad: la mayoría de este código proviene principalmente de stackoverflow.

/** * Asynchronous task to upload file to server */ class UploadImageTask extends AsyncTask { /** Upload file to this url */ private static final String UPLOAD_URL = "http://thibault-laptop:8080/report"; /** Send the file with this form name */ private static final String FIELD_FILE = "file"; private static final String FIELD_LATITUDE = "latitude"; private static final String FIELD_LONGITUDE = "longitude"; /** * Prepare activity before upload */ @Override protected void onPreExecute() { super.onPreExecute(); setProgressBarIndeterminateVisibility(true); mConfirm.setEnabled(false); mCancel.setEnabled(false); showDialog(UPLOAD_PROGRESS_DIALOG); } /** * Clean app state after upload is completed */ @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); setProgressBarIndeterminateVisibility(false); mConfirm.setEnabled(true); mDialog.dismiss(); if (result) { showDialog(UPLOAD_SUCCESS_DIALOG); } else { showDialog(UPLOAD_ERROR_DIALOG); } } @Override protected Boolean doInBackground(File... image) { return doFileUpload(image[0], UPLOAD_URL); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); if (values[0] == 0) { mDialog.setTitle(getString(R.string.progress_dialog_title_uploading)); } mDialog.setProgress(values[0]); } /** * Upload given file to given url, using raw socket * @see http://stackoverflow.com/questions/4966910/androidhow-to-upload-mp3-file-to-http-server * * @param file The file to upload * @param uploadUrl The uri the file is to be uploaded * * @return boolean true is the upload succeeded */ private boolean doFileUpload(File file, String uploadUrl) { HttpURLConnection conn = null; DataOutputStream dos = null; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; String separator = twoHyphens + boundary + lineEnd; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1 * 1024 * 1024; int sentBytes = 0; long fileSize = file.length(); // The definitive url is of the kind: // http://host/report/latitude,longitude uploadUrl += "/" + mLocation.getLatitude() + "," + mLocation.getLongitude(); // Send request try { // Configure connection URL url = new URL(uploadUrl); conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestMethod("PUT"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); publishProgress(0); dos = new DataOutputStream(conn.getOutputStream()); // Send location params writeFormField(dos, separator, FIELD_LATITUDE, "" + mLocation.getLatitude()); writeFormField(dos, separator, FIELD_LONGITUDE, "" + mLocation.getLongitude()); // Send multipart headers dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"" + FIELD_FILE + "\";filename=\"" + file.getName() + "\"" + lineEnd); dos.writeBytes(lineEnd); // Read file and create buffer FileInputStream fileInputStream = new FileInputStream(file); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; // Send file data bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { // Write buffer to socket dos.write(buffer, 0, bufferSize); // Update progress dialog sentBytes += bufferSize; publishProgress((int)(sentBytes * 100 / fileSize)); 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); dos.flush(); dos.close(); fileInputStream.close(); } catch (IOException ioe) { Log.e(TAG, "Cannot upload file: " + ioe.getMessage(), ioe); return false; } // Read response try { int responseCode = conn.getResponseCode(); return responseCode == 200; } catch (IOException ioex) { Log.e(TAG, "Upload file failed: " + ioex.getMessage(), ioex); return false; } catch (Exception e) { Log.e(TAG, "Upload file failed: " + e.getMessage(), e); return false; } } private void writeFormField(DataOutputStream dos, String separator, String fieldName, String fieldValue) throws IOException { dos.writeBytes(separator); dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"\r\n"); dos.writeBytes("\r\n"); dos.writeBytes(fieldValue); dos.writeBytes("\r\n"); } } 

Para iniciar la carga, use el siguiente comando:

 new UploadImageTask().execute(new File(imagePath)); 

Lo hice usando un servicio web Rest y una clase DefaultHttpClient en Android. Para crear un servicio web REST de muestra y desplegar en Apache Tomcat, siga el tutorial Vogella

Para que el servicio de descanso acepte la imagen, se requiere el tipo de contenido multiparte en el lado del servidor

 @POST @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces("application/json") public String uploadFile(@FormDataParam("image") InputStream uploadedInputStream, @FormDataParam("image") FormDataContentDisposition fileDetail) { String uploadedFileLocation = "e://game/" + fileDetail.getFileName(); boolean response=false; // save it try{ OutputStream out = null; int read = 0; byte[] bytes = new byte[1024]; out = new FileOutputStream(new File(uploadedFileLocation)); while ((read = uploadedInputStream.read(bytes)) != -1) { out.write(bytes, 0, read); } out.flush(); out.close(); return response=true; }catch(IOException e){ e.printStackTrace(); } return response; } 

En el lado de Android para enviar imágenes (hice dentro de DoInBackground de AsyncTask)

  HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("http://"+ip+":8080/MiniJarvisFaceServer/image"); MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", new FileBody(file)); postRequest.setEntity(reqEntity); ResponseHandler handler = new BasicResponseHandler(); String response = httpClient.execute(postRequest,handler); Log.d("Response", response); httpClient.getConnectionManager().shutdown(); 

Para hacer una solicitud HTTP, puede usar DefaultHttpClient class y HttpPost class

 HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://your.site/your/service"); // set some headers if needed post.addHeader(....); // and an eclosed entity to send post.setEntity(....); // send a request and get response (if needed) InputStream responseStream = client.execute(post)..getEntity().getContent(); 

El método de agregar una entidad para solicitarlo depende de cómo esté funcionando su servicio remoto.

Sigue esta guía Está usando PHP en el lado del servidor. Utilicé Android Studio y httpmime.4.3.6 y funcionó a la perfección http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/

También es compatible con video y muestra cómo puede responder con algunos resultados del servidor. El único inconveniente es asegurarse de que está utilizando HttClient para Android y la versión correcta de HttpMime. En este momento HttpMime 4.4.x no funciona y eso desperdició una semana de mi tiempo. usar 4.3.6