我如何使用 servlet 读取 ftp 服务器中的文件,然后将其作为可下载文件发送给用户?

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

我开发了一个提供某些服务的 servlet。 我正在使用 apache-commons-net FTPClient 登录 ftp 服务器并读取文件。

我想下载这个文件(也许也可以将它发送到输出流?),但我知道的读取文件的唯一方法是: FTPClient.retrieveFileStream(远程字符串)和 FTPClient.retrieveFile(远程字符串,本地 OutputStream)。

我尝试了第一个,然后将我得到的 InputStream 写到 servlet 的 outputStream:

    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();

第二个:

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

在这两种情况下,我都得到文件的文本内容作为响应,而不是文件本身。

有什么办法可以做到这一点

P.s。此代码属于 doPost() 以 http req 和 http resp 作为参数调用的方法。

如果您想下载文件而不只是显示它,则必须更改发送到浏览器的内容类型(因为显示数据或将数据另存为文件是浏览器的职责)。因此,做例如

resp.setContentType("application/octet-stream");

(而不是text/csv)到"hide"来自浏览器的数据的真实性质并强制它保存数据。

问题是我使用 google 扩展 (DHC) 来测试我的网络服务。它显示文件内容而不是初始化下载。 我正在使用 doPost() 方法下载文件。

解决方案:

我在 doGet() 方法中创建了它,当通过浏览器直接访问时一切正常。 所以我认为这只是扩展问题,将响应的内容写回给我而不是下载文件附件。

感谢@Jozef 的反馈