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