2010-11-03 9 views
6

Gracias de antemano. Me gustaría cargar alguna imagen de mapa de bits de mi aplicación de Android. pero no puedo obtenerlo. ¿Podría recomendar algunas soluciones para ello? o recoger mi código fuente?Cómo subir imágenes de mapa de bits desde un dispositivo Android?

ByteArrayOutputStream bao = new ByteArrayOutputStream(); 
       bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bao); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(
         "http://example.com/imagestore/post"); 
       MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
       byte [] ba = bao.toByteArray(); 
       try { 
        entity.addPart("img", new StringBody(new String(bao.toByteArray()))); 
        httppost.setEntity(entity); 
       } catch (UnsupportedEncodingException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       // Execute HTTP Post Request 
       HttpResponse response = null; 
       try { 
        response = httpclient.execute(httppost); 
       } catch (ClientProtocolException e) { 
} 
+1

¿Qué error obtienes? ¿Qué tecnología estás usando en el lado del servidor? ¿Estás seguro de que el problema no está allí y no en el cliente? – kgiannakakis

+0

Gracias por responder.Así que desarrollé el servicede en GAE, GAE dijo raise NotImageError(); Supongo que la codificación de cadenas está mal o tengo que usar InputStreamBody – freddiefujiwara

+0

Obtuve mi objetivo Usando InputStream con el nombre de archivo "img.jpg". :-) – freddiefujiwara

Respuesta

1

encontré esta solución realmente bien creado y el 100% de trabajo incluso con Amazon EC2, echar un vistazo a este enlace:

Uploading files to HTTP server using POST on Android (link deleted).

Comparar con la respuesta anterior, esta solución no requiere para importar la enorme biblioteca httpmime de Apache.

texto copiado del artículo original:

Este tutorial muestra una forma sencilla de cargar datos (imágenes, archivos MP3, archivos de texto, etc.) con el servidor HTTP/PHP usando Android SDK.

Incluye todo el código necesario para que la carga funcione en el lado de Android, así como un código de servidor simple en PHP para manejar la carga del archivo y guardarlo. Además, también le brinda información sobre cómo manejar la autorización básica al cargar el archivo.

Al probarlo en el emulador, recuerde agregar su archivo de prueba al sistema de archivos de Android mediante DDMS o la línea de comandos.

Lo que vamos a hacer es establecer el tipo de contenido apropiado de la solicitud e incluir la matriz de bytes como el cuerpo de la publicación. La matriz de bytes contendrá el contenido de un archivo que queremos enviar al servidor.

A continuación encontrará un fragmento de código útil que realiza la operación de carga. El código también incluye el manejo de respuesta del servidor.

HttpURLConnection connection = null; 
DataOutputStream outputStream = null; 
DataInputStream inputStream = null; 
String pathToOurFile = "/data/file_to_send.mp3"; 
String urlServer = "http://192.168.1.1/handle_upload.php"; 
String lineEnd = "\r\n"; 
String twoHyphens = "--"; 
String boundary = "*****"; 

int bytesRead, bytesAvailable, bufferSize; 
byte[] buffer; 
int maxBufferSize = 1*1024*1024; 

try 
{ 
    FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile)); 

    URL url = new URL(urlServer); 
    connection = (HttpURLConnection) url.openConnection(); 

    // Allow Inputs & Outputs. 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    connection.setUseCaches(false); 

    // Set HTTP method to POST. 
    connection.setRequestMethod("POST"); 

    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 

    outputStream = new DataOutputStream(connection.getOutputStream()); 
    outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
    outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd); 
    outputStream.writeBytes(lineEnd); 

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

    // Read file 
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

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

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

    // Responses from the server (code and message) 
    serverResponseCode = connection.getResponseCode(); 
    serverResponseMessage = connection.getResponseMessage(); 

    fileInputStream.close(); 
    outputStream.flush(); 
    outputStream.close(); 
} 
catch (Exception ex) 
{ 
    //Exception handling 
} 

Si necesita autenticar su usuario con un nombre de usuario y contraseña de carga del archivo, el fragmento de código siguiente muestra cómo agregarlo. Todo lo que tiene que hacer es establecer los encabezados de Autorización cuando se crea la conexión.

String usernamePassword = yourUsername + “:” + yourPassword; 
String encodedUsernamePassword = Base64.encodeToString(usernamePassword.getBytes(), Base64.DEFAULT); 
connection.setRequestProperty (“Authorization”, “Basic ” + encodedUsernamePassword); 

Digamos que un script PHP es responsable de la recepción de datos en el lado del servidor. La muestra de dicho script PHP podría verse así:

<?php 
$target_path = "./"; 
$target_path = $target_path . basename($_FILES['uploadedfile']['name']); 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
{ 
    echo "The file ". basename($_FILES['uploadedfile']['name']). 
" has been uploaded"; 
} 
else 
{ 
    echo "There was an error uploading the file, please try again!"; 
} 
?>; 

El código fue probado en Android 2.1 y 4.3. Recuerde agregar permisos a su secuencia de comandos en el lado del servidor. De lo contrario, la carga no funcionará.

chmod 777 uploadsfolder 

Donde uploadsfolder es la carpeta donde se cargan los archivos. Si planea cargar archivos más grandes que el límite de tamaño de archivo predeterminado de 2MB. Deberá modificar el valor de upload_max_filesize en el archivo php.ini.

+0

Parece que la publicación en el enlace mencionado ya no está disponible :( –

+0

@SeverianoJaramilloQuintanar trajo el texto del enlace eliminado – dikirill

Cuestiones relacionadas