Вот пример нативного кода Java, который загружает файл, используя куски:
final String LF = "\r\n"; // Line separator required by multipart/form-data. Can be static class constant
final String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
HttpURLConnection connection = (HttpURLConnection) new URL("http://some.com/upload").openConnection();
try {
connection.setDoOutput(true);
connection.setChunkedStreamingMode(4096);
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
connection.addRequestProperty("Accept", "application/json");
connection.addRequestProperty("Authorization", myToken);
try (OutputStream os = connection.getOutputStream();
Writer writer = new OutputStreamWriter(os, StandardCharsets.UTF_8)) {
writer.append("--").append(boundary).append(LF);
writer.append("Content-Disposition: form-data; name=\"dataFile\"; filename=\"file.zip\"").append(LF);
writer.append("Content-Type: application/zip").append(LF);
writer.append(LF);
writer.flush();
// Write body
writeBinaryBody(os);
writer.append(LF).append("--").append(boundary).append("--").append(LF);
writer.flush();
os.flush();
}
if (200 != connection.getResponseCode()) {
try (Reader reader = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)) {
// Handle error here
}
}
} finally {
connection.disconnect();
}
Код в этом примере основан на этом ответе о загрузке http-файла из Java. Разница заключается в вызове connection.setChunkedStreamingMode(4096);
, который определяет использование потоковой передачи по частям.