2010-06-30 4 views
1

Je suis en train de développer une application Android et j'essaie de télécharger une image sur notre serveur du côté client. Quand je suis sur le serveur pour voir l'image, elle est corrompue (barre grise en bas) parfois. Je ne suis pas sûr de ce qui se passe. Quelqu'un peut-il m'aider à résoudre ce problème ou me diriger vers un guide sur la façon de le faire? Voici le code qui télécharge l'image:Développement Android Téléchargement d'image corrompu

try { 
    url = new URL(SERVER_URL); 
    connection = (HttpURLConnection)url.openConnection(); 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    connection.setUseCaches(false); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Content-Type", "image/jpeg"); 
    connection.setChunkedStreamingMode(STREAM_CHUNK_SIZE_KB * 1024); 
    connection.connect(); 
    outputStream = new DataOutputStream(connection.getOutputStream()); 

    // Write file header (userId; Id; contentId; MediaType; size) 
    outputStream.writeLong(mUserId); 
    outputStream.writeLong(mId); 
    outputStream.writeLong(file.getId()); 
    outputStream.writeUTF(MediaType.getMediaType(file.getMediaType())); 
    outputStream.writeInt(file.getSize()); 

    // Write file data to stream 
    int maxBufferSize = (8 * 1024); 
    FileInputStream fileInputStream = new FileInputStream(file.getImageFile()); 
    int bytesAvailable = fileInputStream.available(); 
    int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    byte[] buffer = new byte[bufferSize]; 
    int 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("\r\n"); 
    outputStream.flush(); 

    // Check response 
    int responseCode = connection.getResponseCode(); 
    if (responseCode == HttpURLConnection.HTTP_OK) { 
     uploadStatus = true; 
     InputStream responseStream = connection.getInputStream(); 
     BufferedReader responseReader = new BufferedReader(new 
      InputStreamReader(responseStream)); 
     char[] response = new char[4]; 
     responseReader.read(response, 0, 4); 
     responseReader.close(); 
     int responseValue = 0; 
     for (int b = 0; b < 4; b++) { 
      responseValue |= response[b] & 0xFF; 
      if (b < 3) { 
       responseValue <<= 8; 
      } 
     } 

     switch (responseValue) { 
      case SAVED_SUCCESSFULLY: 
       Log.d("FileUploader::upload -> Server response: Upload successful"); 
      break; 
      case ERROR_SAVING_FILE: 
       Log.d("FileUploader::upload -> Server response: Upload failed"); 
      break; 
      case FILE_MORE_THAN_ALLOWED_SIZE: 
       Log.d("FileUploader::upload -> Server response: Upload failed, exceeded 
        allowed file size"); 
      break; 
     } 
    } 

    else { 
     Log.d("FileUploader::upload -> responseCode = " + responseCode); 
     checkErrorStream(connection.getErrorStream()); 
    } 
} 

catch(Exception e) { 
    Log.e(Log.getStackTraceString(e)); 
} 

finally { 
    try { 
     if (outputStream != null) { 
      outputStream.close(); 
     } 
    } 

    catch(Exception e) { 
     Log.e(Log.getStackTraceString(e)); 
    } 

    if (connection != null) { 
     connection.disconnect(); 
    } 
} 

Répondre

0

S'il vous plaît essayer de prendre l'image de divece via USB non via le réseau. Est-ce que cette image serait OK ou serait elle aussi cassée?

0

Je ne peux pas vous dire facilement pourquoi l'image est corrompue sans la construction d'une application de test et l'exécution de votre code, mais je peux vous donner un indice:

Enregistrez l'image d'origine dans un fichier. Prenez l'image qui a été transférée sur le réseau. Ouvrez les deux dans un éditeur hexadécimal, puis regardez quelle est la différence. (Qui est vraisemblablement proche de la fin du fichier.)

Ceci devrait vous indiquer en quoi consiste la corruption réelle, ce qui vous indiquera ce qu'il faut rechercher dans votre code.

(Par exemple, vous pourriez être troncation votre fichier, ou l'ajout d'une nouvelle ligne qui ne devrait pas être là, ou un certain nombre d'erreurs subtiles.)

0

Vous pouvez avoir une erreur dans votre code:

outputStream.write(buffer, 0, bufferSize); 

devrait être

outputStream.write(buffer, 0, bytesRead);