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

Java 将文件从SFTP直接下载到HTTP响应,而不使用中间文件,java,angularjs,spring-mvc,sftp,jsch,Java,Angularjs,Spring Mvc,Sftp,Jsch,我正在尝试使用JavaJSSCH库通过SFTP下载一个文件。我成功地将文件下载到本地目录**但是,我所需要的只是将文件直接下载到浏览器,而不提供任何本地目标路径(比如文件在Chrome中的下载方式)。我正在使用Spring控制器AngularJS Promise捕捉响应。下面是我的代码 @RequestMapping(value = "/downloadAttachment", method = RequestMethod.POST, produces = Med

我正在尝试使用JavaJSSCH库通过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\u OCTET\u STREAM\u 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) 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.copyragle(IOUtils.java:1025) org.apache.commons.io.IOUtils.copy(IOUtils.java:999)


在尝试读取数据之前,无法关闭SFTP会话

这是正确的代码:

is = sftp.get(fileName);
IOUtils.copy(is, response.getOutputStream());
channel.disconnect();
session.disconnect();
is.close();

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

is.close();
channel.disconnect();
session.disconnect();
你也可以试着直接打电话

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

查看文档

此操作有效,但下载的文件中没有任何内容。IOUtils.copy()返回复制的字节数。你能把它记录下来并检查是否有任何东西被复制了吗?它给出的字节数是400535,这意味着有东西被复制了。我想这是spring mvc特有的问题。您是否单独尝试过将文件从本地目录下载到web浏览器?