最近做了一个sftp服务器文件下载的功能,mark一下:

首先是一个SftpClientUtil 类,封装了对sftp服务器文件上传、下载、删除的方法

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session; public class SftpClientUtil { /**
* 初始化日志引擎
*/
private final Logger logger = LoggerFactory.getLogger(SftpClientUtil.class); /** Sftp */
ChannelSftp sftp = null;
/** 主机 */
private String host = "";
/** 端口 */
private int port = 0;
/** 用户名 */
private String username = "";
/** 密码 */
private String password = ""; /**
* 构造函数
*
* @param host
* 主机
* @param port
* 端口
* @param username
* 用户名
* @param password
* 密码
*
*/
public SftpClientUtil(String host, int port, String username,
String password){ this.host = host;
this.port = port;
this.username = username;
this.password = password;
} /**
* 连接sftp服务器
*
* @throws Exception
*/
public void connect() throws Exception { JSch jsch = new JSch();
Session sshSession = jsch.getSession(this.username, this.host, this.port);
logger.debug(SftpClientUtil.class + "Session created."); sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect(20000);
logger.debug(SftpClientUtil.class + " Session connected."); logger.debug(SftpClientUtil.class + " Opening Channel.");
Channel channel = sshSession.openChannel("sftp");
channel.connect();
this.sftp = (ChannelSftp) channel;
logger.debug(SftpClientUtil.class + " Connected to " + this.host + ".");
} /**
* Disconnect with server
*
* @throws Exception
*/
public void disconnect() throws Exception {
if(this.sftp != null){
if(this.sftp.isConnected()){
this.sftp.disconnect();
}else if(this.sftp.isClosed()){
logger.debug(SftpClientUtil.class + " sftp is closed already");
}
}
} /**
* 上传单个文件
*
* @param directory
* 上传的目录
* @param uploadFile
* 要上传的文件
*
* @throws Exception
*/
public void upload(String directory, String uploadFile) throws Exception {
this.sftp.cd(directory);
File file = new File(uploadFile);
this.sftp.put(new FileInputStream(file), file.getName());
} /**
* 上传目录下全部文件
*
* @param directory
* 上传的目录
*
* @throws Exception
*/
public void uploadByDirectory(String directory) throws Exception { String uploadFile = "";
List<String> uploadFileList = this.listFiles(directory);
Iterator<String> it = uploadFileList.iterator(); while(it.hasNext())
{
uploadFile = it.next().toString();
this.upload(directory, uploadFile);
}
} /**
* 下载单个文件
*
* @param directory
* 下载目录
* @param downloadFile
* 下载的文件
* @param saveDirectory
* 存在本地的路径
*
* @throws Exception
*/
public void download(String directory, String downloadFile, String saveDirectory) throws Exception {
String saveFile = saveDirectory + "//" + downloadFile; this.sftp.cd(directory);
File file = new File(saveFile);
this.sftp.get(downloadFile, new FileOutputStream(file));
} /**
* 下载目录下全部文件
*
* @param directory
* 下载目录
*
* @param saveDirectory
* 存在本地的路径
*
* @throws Exception
*/
public void downloadByDirectory(String directory, String saveDirectory) throws Exception {
String downloadFile = "";
List<String> downloadFileList = this.listFiles(directory);
Iterator<String> it = downloadFileList.iterator(); while(it.hasNext())
{
downloadFile = it.next().toString();
if(downloadFile.toString().indexOf(".")<0){
continue;
}
this.download(directory, downloadFile, saveDirectory);
}
} /**
* 删除文件
*
* @param directory
* 要删除文件所在目录
* @param deleteFile
* 要删除的文件
*
* @throws Exception
*/
public void delete(String directory, String deleteFile) throws Exception {
this.sftp.cd(directory);
this.sftp.rm(deleteFile);
} /**
* 列出目录下的文件
*
* @param directory
* 要列出的目录
*
* @return list 文件名列表
*
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<String> listFiles(String directory) throws Exception { Vector fileList;
List<String> fileNameList = new ArrayList<String>(); fileList = this.sftp.ls(directory);
Iterator it = fileList.iterator(); while(it.hasNext())
{
String fileName = ((LsEntry)it.next()).getFilename();
if(".".equals(fileName) || "..".equals(fileName)){
continue;
}
fileNameList.add(fileName); } return fileNameList;
} /**
* 更改文件名
*
* @param directory
* 文件所在目录
* @param oldFileNm
* 原文件名
* @param newFileNm
* 新文件名
*
* @throws Exception
*/
public void rename(String directory, String oldFileNm, String newFileNm) throws Exception {
this.sftp.cd(directory);
this.sftp.rename(oldFileNm, newFileNm);
} public void cd(String directory)throws Exception {
this.sftp.cd(directory);
}
public InputStream get(String directory) throws Exception{
InputStream streatm=this.sftp.get(directory);
return streatm;
} } 其次是供jsp调用的的servlet类 public class DownloadApplyPersonServlet extends HttpServlet { /** 初始化日志引擎 * */
private final Logger logger = LoggerFactory
.getLogger(DownloadApplyPersonServlet.class); public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doPost(request, response);
} // 在doPost()方法中,当servlet收到浏览器发出的Post请求后,实现文件下载
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
logger.info("进入下载文件开始..........");
String host="";//主机地址
String port="";//主机端口
String username="";//服务器用户名
String password ="";//服务器密码
String planPath ="";//文件所在服务器路径
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OutputStream fos = null; String fileName = "KJ_CUST_KBYJ";//KJ_CUST_KBYJ20140326.txt
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
String currentDate = formatter.format(new Date());
String downloadFile = fileName + currentDate + ".zip"; PrintWriter out=null;
SftpClientUtil sftp = new SftpClientUtil(host, Integer.parseInt(port), username,
password);
try {
sftp.connect();
String filename="";
// String[] strs=planUrl.split("/");
String filePath=planPath;
//列出目录下的文件
List<String> listFiles=sftp.listFiles(filePath);
boolean isExists=listFiles.contains(downloadFile);
if(isExists){
sftp.cd(filePath);
if(sftp.get(downloadFile)!=null){
bis = new BufferedInputStream(sftp.get(downloadFile));
}
filename=downloadFile;
fos = response.getOutputStream();
bos = new BufferedOutputStream(fos);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-msdownload;charset=utf-8");
final String agent = request.getHeader("User-Agent");
String attachment = "attachment;fileName=";
String outputFilename = null; if (agent.indexOf("Firefox") > 0) {
attachment = "attachment;fileName*=";
outputFilename = "=?UTF-8?B?" + (new String(Base64.encodeBase64(filename.getBytes("UTF-8")))) + "?=";;
} else {
if (agent.indexOf("MSIE") != -1) {
outputFilename = new String(filename.getBytes("gbk"), "iso8859-1");
} else {
outputFilename = new String(filename.getBytes("UTF-8"), "iso8859-1");
}
}
response.setHeader("Content-Disposition", attachment + outputFilename);
int bytesRead = 0;
//输入流进行先读,然后用输出流去写,下面用的是缓冲输入输出流
byte[] buffer = new byte[8192];
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer,0,bytesRead);
}
bos.flush();
logger.info("文件下载成功");
}else{
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
out=response.getWriter();
out.println("<html >" +
"<body>" +
"没有找到你要下载的文件" +
"</body>" +
"</html>");
}
} catch (Exception e) {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
out=response.getWriter();
out.println("<html >" +
"<body>" +
"没有找到你要下载的文件" +
"</body>" +
"</html>");
}finally{
try {
sftp.disconnect();
logger.info("SFTP连接已断开");
} catch (Exception e) {
e.printStackTrace();
} if(out!=null){
out.close();
}
logger.info("out已关闭");
if(bis != null){
bis.close();
}
logger.info("bis已关闭");
if(bos != null){
bos.close();
}
logger.info("bos已关闭");
}
}
} 最后是对servlet的配置,具体可参考web.xml中servlet的配置。
附件中是需要用到饿jar包

java 通过sftp服务器上传下载删除文件的更多相关文章

  1. 【转】Android 服务器之SFTP服务器上传下载功能 -- 不错

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

  2. 【转】Android 服务器之SFTP服务器上传下载功能

    原文网址:http://blog.csdn.net/tanghua0809/article/details/47056327 本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之 ...

  3. java FTP 上传下载删除文件

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...

  4. coding++:java操作 FastDFS(上传 | 下载 | 删除)

    开发工具  IDEAL2017  Springboot 1.5.21.RELEASE --------------------------------------------------------- ...

  5. 通过代码链接ftp上传下载删除文件

    因为我的项目是Maven项目,首先要导入一个Maven库里的包:pom.xml <dependency>            <groupId>com.jcraft</ ...

  6. Xshell5下利用sftp上传下载传输文件

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...

  7. JAVA中使用FTPClient上传下载

    Java中使用FTPClient上传下载 在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在c ...

  8. 向linux服务器上传下载文件方式收集

    向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...

  9. Android连接socket服务器上传下载多个文件

    android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...

随机推荐

  1. shell的特殊符号的表示

    shell中存在一些特殊的符号.这些符号可以帮助我们更好的写出shell来 1.特殊字符 符号          使用 输出 ,             枚举分隔符 .             当前目 ...

  2. Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖

    题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...

  3. 基于Adaboost的人脸检测算法

    AdaBoost算法是一种自适应的Boosting算法,基本思想是选取若干弱分类器,组合成强分类器.根据人脸的灰度分布特征,AdaBoost选用了Haar特征[38].AdaBoost分类器的构造过程 ...

  4. CF 17B Hierarchy

    Nick's company employed n people. Now Nick needs to build a tree hierarchy of «supervisor-surbodinat ...

  5. vc++远程调试工具

    简单来说: 1>在远程机器跑VC自带的远程调试工具msvsmon.exe,并把要调试的程序跑起来 2>用VC调试器附加进程,即可调试 先展开来说: VC8,VC9都自带远程调试工具,可以在 ...

  6. HTML5文件上传还有进度条

    以下是自学it网--中级班上课笔记 网址:www.zixue.it 需要在chrome,ff,IE10下运行 html页面 <!DOCTYPE html> <html lang=&q ...

  7. Ubuntu下Chromium源码的编译

    一.失败的经历 印象中,谷歌建议Ubuntu建议版本为10.4.但是我找不到出处了,模糊的印象.不知道是不是这样? 1.Ubuntu10.4.3-desktop-amd64 + Virtual Box ...

  8. 浅谈 PHP 神盾的解密过程

    原文:浅谈 PHP 神盾的解密过程 前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 “神盾加密” , 牛逼闪闪的样子.百度下发现神盾是个很古老的东西,最后一次更新是在 201 ...

  9. poj 1220 NUMBER BASE CONVERSION(短除法进制转换)

    题目连接:1220 NUMBER BASE CONVERSION 题目大意:给出两个进制oldBase 和newBase, 以及以oldBase进制存在的数.要求将这个oldBase进制的数转换成ne ...

  10. .Net——使用.net内置处理程序处理自己定义节点Demo

    在.net中.由于对不同的节点,都相应着类去对它进行处理,.net里面为了方便.已经内置了一些类供我们使用.使我们在读取配置文件时.不必自己去定义类去处理自己定义的自己定义节点. 以下我们写了这样一个 ...