我如何使用 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 的反馈
我开发了一个提供某些服务的 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 的反馈