2017-06-30 20 views
1

Java JSschライブラリを使用してSFTPでファイルをダウンロードしようとしています。ファイルをローカルディレクトリにダウンロードできました。 **しかし、私が必要とするのは、ファイルをChromeにダウンロードする方法など、ローカルの宛先パスを指定せずに直接ブラウザにファイルをダウンロードすることです。私は応答をキャッチするために、Spring Controller AngularJS Promiseを使用しています。以下は私のコードです。中間ファイルを使用せずにSFTPからHTTPレスポンスに直接ファイルをダウンロードする

@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を使った。これは私に以下のようなExceptionを与えています。

に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:99) 9)

答えて

1

(変数に格納されている「ある」):

これは正しいコードです。あなたはまた、これは働いていたドキュメントhere

+0

を見ますがダウンロードしたファイルのdoesnをお持ちの

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

を呼び出して直接試すことができます

is.close(); channel.disconnect(); session.disconnect(); 

- IOUtils.copy(後の行を次の呼び出し)の代わりに、前にしてくださいそれに内容がありません。 –

+0

IOUtils.copy()は、コピーされたバイト数を返します。あなたはそれを記録し、何かが全くコピーされているかどうか確認できますか? –

+0

それは何かがコピーされることを意味する400535バイト数を与えました。 –

2

データを読み取ろうとする前にSFTPセッションを閉じることはできません。あなたが実際に入力ストリームから何かを読み取る前に、チャネルとセッションを切断されている

is = sftp.get(fileName); 
IOUtils.copy(is, response.getOutputStream()); 
channel.disconnect(); 
session.disconnect(); 
is.close(); 
関連する問題