Android开发图片上传已损坏

时间:2010-06-30 23:42:56

标签: java android http image file

我正在开发一个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 :(得分:0)

请尝试通过USB而非网络从设备拍摄图像。那个图像会好吗还是会坏掉?

答案 1 :(得分:0)

如果没有构建测试应用程序并运行代码,我无法轻易告诉您为什么图像已损坏,但我可以给您一个提示:

将原始图像保存到文件中。抓取通过网络传输的图像。在十六进制编辑器中打开它们,然后看看它们之间的区别。 (大概在文件的末尾附近。)

这应该告诉你实际的损坏是什么,反过来它会告诉你在你的代码中寻找什么。

(例如,您可能会截断您的文件,或附加不应该存在的换行符或任何数量的细微错误。)

答案 2 :(得分:0)

您的代码可能有错误:

outputStream.write(buffer, 0, bufferSize);

应该是

outputStream.write(buffer, 0, bytesRead);