将文件从SFTP直接下载到HTTP响应,而无需使用中间文件

我正在尝试使用Java

JSsch库通过SFTP下载文件。我已成功将文件下载到本地目录。**但是,我所需要做的就是直接将文件下载到浏览器,而无需提供任何本地目标路径(例如,文件在Chrome中的下载方式)。我正在使用Spring控制器AngularJS

Promise来捕获响应。下面是我的代码。

@RequestMapping(value = "/downloadAttachment", method = RequestMethod.POST,

produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)

public void downloadAttachment(

@RequestParam(value = "fileName") String fileName,

@RequestParam(value = "filePath") String filePath,

@RequestParam(value = "fileId") String fileId,

HttpServletResponse response, Locale locale) throws Exception {

InputStream is = null;

if(!fileName.isEmpty() && !filePath.isEmpty() && !fileId.isEmpty()){

String directory = filePath;

java.util.Properties config = new java.util.Properties();

config.put("StrictHostKeyChecking", "no");

JSch ssh = new JSch();

Session session = ssh.getSession(sftpLogin, sftpAddress, 22);

session.setConfig(config);

session.setPassword(sftpPassword);

session.connect();

logger.info("Connection to server established");

Channel channel = session.openChannel("sftp");

channel.connect();

ChannelSftp sftp = (ChannelSftp) channel;

sftp.cd(directory);

is = sftp.get(fileName);

channel.disconnect();

session.disconnect();

}

IOUtils.copy(is, response.getOutputStream());

is.close();

response.getOutputStream().close();

response.flushBuffer();

}

我不知道要下载的文件类型。所以,我用了MediaType.APPLICATION_OCTET_STREAM_VALUE。这给了我下面给出的异常。

java.io.IOException:管道关闭java.io.PipedInputStream.read(未知源)java.io.PipedInputStream.read(未知源)com.jcraft.jsch.ChannelSftp.fill(ChannelSftp.java:2909)com.jcraft。

jsch.ChannelSftp.header(ChannelSftp.java:2935)com.jcraft.jsch.ChannelSftp.access

$ 500(ChannelSftp.java:36)com.jcraft.jsch.ChannelSftp $

2.read(ChannelSftp.java:1417)com.jcraft。 jsch.ChannelSftp $

2.read(ChannelSftp.java:1364)org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)org.apache.commons.io.IOUtils.copy(IOUtils.java:999)

回答:

您实际上要从输入流中读取任何内容(存储在变量“ is”中)之前断开通道和会话的连接。请在IOUtils.copy()之后而不是在之前致电以下几行-

is.close();

channel.disconnect();

session.disconnect();

您也可以尝试直接致电

sftp.get(filename, response.getOutputSteam());

在这里看看文档

以上是 将文件从SFTP直接下载到HTTP响应,而无需使用中间文件 的全部内容, 来源链接: utcz.com/qa/433707.html

回到顶部