Search code examples
javaservletsftpapache-commons-net

How can i read a file in a ftp server using a servlet and then send this as a downloadable file to the user?


I have developed a servlet that offers some services. I am using apache-commons-net FTPClient to log into a ftp server and read a file.

I want to make this file downloadle (aka send it to the outputstream maybe?) , but the only ways of reading a file that i know of are: FTPClient.retrieveFileStream(String remote) and FTPClient.retrieveFile(String remote, OutputStream local).

I tried the first one and then wrote the InputStream i got to the outputStream of the servlet:

    InputStream myFileStream = FTPClient.retrieveFileStream(fileName);
    byte[] buffer = new byte[4096];
    int length;
    resp.reset();
    resp.setContentType("text/csv");
    resp.setHeader("Content-disposition","attachment; filename=\""+fileName+"\"");


    OutputStream out = resp.getOutputStream();
    while((length=myFileStream.read(buffer)) > 0){
        out.write(buffer, 0, length);
    }
    myFileStream.close();
    out.flush();

The Second One:

myClient.retrieveFile(fileName, resp.getOutputStream());

In both cases i get the text content of the file as a response and not the file itself.

Is there any way i can do this.

P.s. this code belongs to a medhod that is being called by the doPost() with http req and http resp as parameters.


Solution

  • The problem was that i was using a google extension (DHC) to test my web service. and it displayed the file content instead of initializing the download. I was making the file download in a doPost() method.

    Solution:

    I made it in a doGet() method and when accessed directly via browser everything works ok. So i think it was only the extensions problem, which wrote the content of the response back to me instead of downloading the file attachment.

    Thanks for the feedback to @Jozef