我正在开发一个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();
}
}
答案 0 :(得分:0)
请尝试通过USB而非网络从设备拍摄图像。那个图像会好吗还是会坏掉?
答案 1 :(得分:0)
如果没有构建测试应用程序并运行代码,我无法轻易告诉您为什么图像已损坏,但我可以给您一个提示:
将原始图像保存到文件中。抓取通过网络传输的图像。在十六进制编辑器中打开它们,然后看看它们之间的区别。 (大概在文件的末尾附近。)
这应该告诉你实际的损坏是什么,反过来它会告诉你在你的代码中寻找什么。
(例如,您可能会截断您的文件,或附加不应该存在的换行符或任何数量的细微错误。)
答案 2 :(得分:0)
您的代码可能有错误:
outputStream.write(buffer, 0, bufferSize);
应该是
outputStream.write(buffer, 0, bytesRead);