Estou construindo um aplicativo Android que precisa receber um arquivo de uma aplicação web.
Estou usando Java ServerSocket
para lidar com isso.
Lidei com os cabeçalhos da solicitação POST e tudo funciona bem, mas quando gravo o arquivo no disco, ele fica corrompido.
Exibi os primeiros bytes do arquivo original e do arquivo corrompido para ver quais bytes foram escritos incorretamente e não tenho ideia de como lidar com isso.
Eu uso esse código para ler a parte da solicitação POST que contém os dados do arquivo até obter a string de limite.
Prefixei a string de limite "\r\n"
porque não quero que isso seja incluído em meu arquivo, especialmente quando não faz parte dele.
// 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();
}