我正在构建一个需要从网络应用程序接收文件的 Android 应用程序。
我正在使用 JavaServerSocket
来处理这个问题。
我处理了 POST 请求标头,一切正常,但是当我将文件写入磁盘时,它被损坏了。
我显示了原始文件和损坏文件的前几个字节,以查看哪些字节写错了,但我不知道如何处理它。
我使用此代码来读取 POST 请求的部分,其中包含文件数据,并获取边界字符串。
我在边界字符串前加上了前缀,"\r\n"
因为我不希望将其包含在我的文件中,尤其是当它不是文件的一部分时。
// Handle POST request
File file_upload = new File(Environment.getExternalStorageDirectory(), "Download/" + filename);
if (file_upload.createNewFile()) {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file_upload)));
// boundary index
int bi = 0;
// char
int c;
// this is boundary prefixed with \r\n--
String __boundary = "\r\n--" + boundary;
StringBuilder buffer = new StringBuilder();
// `br` is BufferedReader
// I start reading the file content here. br.read() reads the first byte and keeps reading until it meets the boundary.
while ((c = br.read()) != -1) {
if ((char) c == __boundary.charAt(bi)) {
buffer.append((char) c);
bi++;
if (bi == __boundary.length()) {
break;
}
} else {
if (buffer.length() != 0) {
out.write(buffer.toString());
buffer.setLength(0);
} else {
bi = 0;
}
out.write((char) c);
}
}
out.close();
}
您正在像阅读文本一样阅读该流。它不是 - 它是一个 PNG,所以是二进制数据。它应该被视为二进制数据。您可能需要使用特定字符编码的字节来检测边界
\r\n--
,但除此之外,您应该将数据读取和写入为文本 - noBufferedWriter
、 noBufferedReader
、 justInputStream
和OutputStream
基于类。(如果您可以更改请求和响应的方法,使每个请求/响应仅包含一个数据文件,那么您就不必查看边界了。我们确实没有足够的上下文来知道这是否可行,但您似乎不太可能必须在代码中进行边界检测-即使您需要使用多部分请求和响应,我也希望 HTTP 客户端能够为您处理该问题。)