最近做了一个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包 

转载于:https://www.cnblogs.com/chen-lhx/p/5063158.html

java 通过sftp服务器上传下载删除文件相关推荐

  1. Java通过FTP服务器上传下载文件的方法

    本文介绍了如何使用Apache Jakarta Commons Net(commons-net-3.3.jar)基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作 ...

  2. Java从sftp服务器上传与下载文件

    一.背景 业务需要从sftp服务器上上传.下载.删除文件等功能,通过查阅资料及手动敲打代码,实现了操作sftp的基本功能,有需求的小伙伴可以看看具体的实现过程. 二.sftp介绍 摘自百度百科:SSH ...

  3. minio对象存储单机部署并设置开机自启动及集成spring boot进行(创建删除桶)(上传下载删除文件)

    目录 1.minio简介 2.minio特性 3.下载及部署 4.配置开机自启动 5.集成Springboot 1.minio简介 MinIO 是在GNU Affero 通用公共许可证 v3.0下发布 ...

  4. fastDfs上传下载删除文件

    工程搭建 工程名称:FastDFSDemo 项目依赖: <!-- fastdfs --> <dependency><groupId>org.csource</ ...

  5. C# 文件操作(上传 下载 删除 文件列表...)

    using System.IO;      1.文件上传   ----------   如下要点:   HTML部分:   <form id="form1" runat=&q ...

  6. php清除账号登录,php实现账号登录/上传/下载/删除文件

    环境:Ubuntu16.04 搭建apache+mysql+php 1.安装apache sudo apt-get update sudo apt-get install apache2 安装完后输入 ...

  7. springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

    springboot文件上传下载实战 文件上传 文件上传核心 UserFileController 文件上传测试 文件下载与在线打开 文件下载.在线打开核心 UserFileController 文件 ...

  8. 从服务器上传下载文件

    服务器上传下载文件 本文介绍了笔者使用过的一些服务器上传下载文件的一些方法. 使用ftp的软件进行文件的上传下载 使用netsarang的xftp进行文件上传下载 ,xftp官方下载地址.示意图如下: ...

  9. 总结排查服务器上传下载慢的几种手段与查看服务器带宽的具体方法

    一.排查服务器上传下载 最近出现的一个情况,服务器上传和下载比较慢,因此我排查了种种手段,特此记录下几种常见的手段. 1.使用speedtest-cli 测试网速: 该方法是测试网速的速度怎么样,看看 ...

  10. 云服务器上传文件到哪个文件夹,云服务器上传到那个文件夹

    云服务器上传到那个文件夹 内容精选 换一换 Model File:模型文件.单击右侧的文件夹图标,在后台服务器sample所在路径(工程目录/run/out/test_data/model)选择需要转 ...

最新文章

  1. SpringBoot静态获取 bean的三种方式,你学会了吗?
  2. javascript addEventListener()
  3. python使用正则表达式验证用户输入密码的有效性
  4. 《新一代城市大脑建设与发展》专家研讨会在京举办(新版)
  5. android 中处理崩溃异常并重启程序
  6. mysql+1.6安装,CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14方法
  7. 解决springboot读取jar包中文件的问题
  8. linux 可执行文件_linux中ELF二进制程序解析
  9. Struts2 简介
  10. FLOAT或DOUBLE列与具有数值类型的数值进行比较 问题
  11. 做游戏美术师必须掌握哪些基本知识
  12. cmos和ttl_TTL和CMOS的区别详解
  13. 投影仪显示播放服务器连接异常,投影仪常见的故障大全和原因
  14. matlab绝对均值,MATLAB中均值、方差、均方差的计算方法
  15. matlab的句柄 图形对象 gca gco gcf set get
  16. Updating indexes
  17. thread ‘main‘ panicked at ‘called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound
  18. 运城学院公共计算机教学部办公室,运城学院公共计算机教学部.docx
  19. 2020 社招 JAVA面试题总结
  20. vue模板里面直接调用methods里面的方法方式

热门文章

  1. 基于Hexo+Node.js+github+coding搭建个人博客——基础篇
  2. cocos2dx 交叉编译 iconv库 protobuf库
  3. ios拇指社保应用源码
  4. php memcache 扩展 libmemcached 安装
  5. Linux下配置MySQL免安装版
  6. 拷贝构造函数和赋值构造函数的区别
  7. Linux系统编程 -- 线程私有属性
  8. 单片机重要组成部分还有什么,引脚封装分布知识讲解(一)
  9. 【渝粤教育】21秋期末考试基础会计10258k2
  10. 图论——两道并查集例题