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)
を見ますがダウンロードしたファイルのdoesnをお持ちの
を呼び出して直接試すことができます
- IOUtils.copy(後の行を次の呼び出し)の代わりに、前にしてくださいそれに内容がありません。 –
IOUtils.copy()は、コピーされたバイト数を返します。あなたはそれを記録し、何かが全くコピーされているかどうか確認できますか? –
それは何かがコピーされることを意味する400535バイト数を与えました。 –