Загрузка изображения для Android повреждена
Я разрабатываю приложение для 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 ответа
Я не могу легко сказать вам, почему изображение повреждено, не создав тестовое приложение и не запустив ваш код, но я могу дать вам подсказку:
Сохраните исходное изображение в файл. Возьмите изображение, которое было передано по сети. Откройте оба из них в шестнадцатеричном редакторе, а затем посмотрите на разницу. (Который предположительно ближе к концу файла.)
Это должно сказать вам, из чего состоит фактическое искажение, что, в свою очередь, скажет вам, что искать в вашем коде.
(Например, вы можете обрезать свой файл или добавить новую строку, которой не должно быть, или любое количество мелких ошибок.)
Пожалуйста, попробуйте получить изображение из Divece через USB, а не через сеть. Будет ли это изображение в порядке или оно тоже будет сломано?
У вас может быть ошибка в вашем коде:
outputStream.write(buffer, 0, bufferSize);
должно быть
outputStream.write(buffer, 0, bytesRead);