2010-11-03 30 views
6

Merci d'avance. Je voudrais télécharger une image bitmap à partir de mon application Android. mais, je ne peux pas l'obtenir. Pourriez-vous recommander des solutions pour cela. ou de recueillir mon code source?Comment télécharger une image Bitmap à partir d'un appareil 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

Quelle erreur obtenez-vous? Quelle technologie utilisez-vous du côté serveur? Êtes-vous sûr que le problème n'est pas là et pas dans le client? – kgiannakakis

+0

Merci d'avoir répondu.J'ai donc développé le servicede sur GAE, le GAE dit augmenter NotImageError(); Je suppose que le codage de chaîne est faux ou doit utiliser InputStreamBody – freddiefujiwara

+0

J'ai obtenu mon objectif en utilisant InputStream avec le nom de fichier "img.jpg". :-) – freddiefujiwara

Répondre

1

J'ai trouvé cette solution vraiment bien créé et 100% travaillent même avec EC2 amazone, un coup d'oeil sur ce lien:

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

Comparez à la réponse précédente, cette solution ne nécessite pas pour importer l'énorme bibliothèque httpmime à partir d'Apache.

texte Copié de l'article original:

Ce tutoriel montre une façon simple de téléchargement des données (images, fichiers MP3, fichiers texte, etc.) au serveur HTTP/PHP en utilisant SDK Android.

Il comprend tout le code nécessaire pour que le téléchargement fonctionne sur le côté Android, ainsi qu'un simple code serveur en PHP pour gérer le téléchargement du fichier et l'enregistrer. En outre, il vous donne également des informations sur la façon de gérer l'autorisation de base lors du téléchargement du fichier. Lors du test sur l'émulateur, n'oubliez pas d'ajouter votre fichier de test au système de fichiers d'Android via DDMS ou la ligne de commande.

Ce que nous allons faire est de définir le type de contenu approprié de la requête et d'inclure le tableau d'octets en tant que corps de la publication. Le tableau d'octets contiendra le contenu d'un fichier que nous voulons envoyer au serveur. Ci-dessous vous trouverez un extrait de code utile qui effectue l'opération de téléchargement.

Le code inclut également la gestion des réponses du serveur.

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 vous devez authentifier votre utilisateur avec un nom d'utilisateur et mot de passe en téléchargeant le fichier, l'extrait de code ci-dessous montre comment l'ajouter. Tout ce que vous avez à faire est de définir les en-têtes Authorization lorsque la connexion est créée.

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

Disons qu'un script PHP est chargé de recevoir les données du côté du serveur. Exemple d'un tel script PHP pourrait ressembler à ceci:

<?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!"; 
} 
?>; 

Le code a été testé sur Android 2.1 et 4.3. N'oubliez pas d'ajouter des autorisations à votre script côté serveur. Sinon, le téléchargement ne fonctionnera pas.

chmod 777 uploadsfolder 

Où uploadsfolder est le dossier dans lequel les fichiers sont téléchargés. Si vous prévoyez de télécharger des fichiers plus grands que la limite de taille de fichier par défaut de 2 Mo. Vous devrez modifier la valeur upload_max_filesize dans le fichier php.ini.

+0

Apparemment, le message dans le lien mentionné n'est plus disponible :( –

+0

@SeverianoJaramilloQuintanar a ajouté le texte sur le lien supprimé – dikirill