Я пытаюсь использовать JAVA NIO для передачи файла с хоста A на клиент B без необходимости загружать файл локально, а затем дать клиенту B ссылку для загрузки файла.
Я выполняюспарк Apache и фреймворк Maven проекта.
Я отобразил запрос http://localhost:8080/download/hello в Spark, используя: get ("/ download /: id", RequestHandler :: downloadHandler);
Внутри функции находится код, который загружает файл из: "https://download.springsource.com/release/STS/3.8.1.RELEASE/dist/e4.6/spring-tool-suite-3.8.1.RELEASE-e4.6-linux-gtk-x86_64.tar.gz"
try {
URL url = new URL("https://download.springsource.com/release/STS/3.8.1.RELEASE/dist/e4.6/spring-tool-suite-3.8.1.RELEASE-e4.6-linux-gtk-x86_64.tar.gz");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
int respCode = +httpURLConnection.getResponseCode();
System.out.println("response code : "+respCode);
if (respCode == HttpURLConnection.HTTP_OK){
String fileName = "";
String disposition = httpURLConnection.getHeaderField("Content-Disposition");
String contentType = httpURLConnection.getContentType();
int contentLength = httpURLConnection.getContentLength();
if (disposition != null) {
// extracts file name from header field
int index = disposition.indexOf("filename=");
if (index > 0) {
fileName = disposition.substring(index + 10,
disposition.length() - 1);
}
} else {
// extracts file name from URL
fileName = url.toString().substring(url.toString().lastIndexOf("/") + 1,
url.toString().length());
}
System.out.println("Content-Type = " + contentType);
System.out.println("Content-Disposition = " + disposition);
System.out.println("Content-Length = " + contentLength);
System.out.println("fileName = " + fileName);
httpURLConnection.disconnect();
System.out.println("other stuff : ");
System.out.println(url.getHost());
ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
FileChannel fileChannel = fileOutputStream.getChannel();
fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
fileOutputStream.close();
readableByteChannel.close();
}
} catch (IOException e) {
e.printStackTrace();
}
Я извлекаю имя файла и размер файла, используя httpURLConnection, а затем обрабатываю для загрузки файла.Я пытаюсь сделать это вместо того, чтобы загружать файл локально с помощью fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE)
и передавать файл напрямую клиенту.
Я провел некоторые исследования и думаю, что это возможно с использованием Socketchannels, но я не понялкак это должно работать.
Я также читал эту статью https://examples.javacodegeeks.com/core-java/nio/java-nio-large-file-transfer-tutorial/ и пытался понять класс Reciever, но мне все еще не ясно, как.
Я быСпасибо за руководство. Спасибо