0

I am trying to use JAVA NIO to transfer a file from host A to client B without having to download the file locally and then giving the client B a link to download the file.

I am running a spark Apache framework and using maven project.

I mapped the request http://localhost:8080/download/hello in Spark using : get("/download/:id",RequestHandler::downloadHandler);

Inside of the function is the code that downloads the file from : "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();
        }

I fetch the filename and file size using httpURLConnection and then processed to download the file. what I am trying to do is, instead of downloading the file locally using fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE) transfer the file directly to the client.

I did some research and I think it is possible with using Socketchannels but I didn't understand how it is supposed to work.

I also read this article https://examples.javacodegeeks.com/core-java/nio/java-nio-large-file-transfer-tutorial/ and tried to understand the class Reciever, but it is still not clear to me how.

I would appreciate some guidance. Thank you

0 Answers0