Загрузка изображения для Android повреждена - PullRequest
1 голос
/ 01 июля 2010

Я разрабатываю приложение для Android и пытаюсь загрузить изображение на наш сервер со стороны клиента.Когда я захожу на сервер, чтобы посмотреть изображение, оно иногда искажается (серая полоса внизу).Я не уверен, почему это происходит.Может кто-нибудь помочь мне решить эту проблему или указать мне руководство, как это сделать?Ниже приведен код, который загружает изображение:

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();
    }
}

Ответы [ 3 ]

0 голосов
/ 01 июля 2010

Я не могу легко сказать, почему изображение повреждено, не создав тестовое приложение и не запустив свой код, но я могу дать подсказку:

Сохранить исходное изображение в файл. Возьмите изображение, которое было передано по сети. Откройте оба из них в шестнадцатеричном редакторе, а затем посмотрите на разницу. (Предположительно, ближе к концу файла.)

Это должно сказать вам, из чего состоит фактическое искажение, что, в свою очередь, скажет вам, что искать в вашем коде.

(Например, вы можете обрезать свой файл или добавить новую строку, которой не должно быть, или любое количество мелких ошибок.)

0 голосов
/ 01 июля 2010

У вас может быть ошибка в вашем коде:

outputStream.write(buffer, 0, bufferSize);

должно быть

outputStream.write(buffer, 0, bytesRead);
0 голосов
/ 01 июля 2010

Пожалуйста, попробуйте получить изображение из Divece через USB, а не по сети.Будет ли это изображение в порядке или оно тоже будет сломано?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...