java 通过sftp服务器上传下载删除文件详解编程语言

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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/19508.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论