详解sftp实现对远程服务器的文件操作
2015-09-24 14:34
639 查看
该所有操作依赖的jsch的jar包 jsch-0.1.50.jar
以下为本人整理的相关SFTP对服务器文件的相关操作,具体的操作方方法依赖于ChannelSftp对象,刻字机单独进行封装,本处就不贴出完整的工具类了
1:获得 ChannelSftp对象
2:SFTP上传单个文件
3.上传目录下的所有文件(批量上传)
4:通过SFTP下载文件
5:批量下载目录下的文件
6:删除文件
7:文件重命名
8:获得文件流
9:Servlet结合SFTP实现简单的文件下载
10:获得目录下的所有文件名
关于sftp内部方法详情:http://blog.csdn.net/jr_soft/article/details/18704857
以下为本人整理的相关SFTP对服务器文件的相关操作,具体的操作方方法依赖于ChannelSftp对象,刻字机单独进行封装,本处就不贴出完整的工具类了
1:获得 ChannelSftp对象
public class SftpUtil { private static final Logger LOG = LogManager.getLogger(SftpUtil.class); private static SftpUtil sftpUtil; private static ChannelSftp sftp; private String host; private int port; private String userName; private String password; private SftpUtil(String host, int port, String userName, String password) { this.host = host; this.port = port; this.userName = userName; this.password = password; } /** * 获得Smb连接对象 * * @Title: getInstance * @param url * @return SmbUtil * @author wangqinghua * @date 2015-9-22 下午7:39:41 */ public static synchronized SftpUtil getInstance(String host, int port, String userName, String password) { if (sftpUtil == null) { sftpUtil = new SftpUtil(host, port, userName, password); } return sftpUtil; } /** * 连接初始化 * * @Title: init void * @author wangqinghua * @date 2015-9-22 下午7:40:50 */ public ChannelSftp getSftp() { JSch jsch = new JSch(); Channel channel = null; try { Session sshSession = jsch.getSession(this.userName, this.host, this.port); sshSession.setPassword(password); Properties sshConfig = new Properties(); sshConfig.put("StrictHostKeyChecking", "no"); sshSession.setConfig(sshConfig); sshSession.connect(20000); channel = sshSession.openChannel("sftp"); channel.connect(); } catch (JSchException e) { LOG.info("getSftp exception:", e); } return (ChannelSftp) channel; } public void disconnect() throws Exception { if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); } else if (sftp.isClosed()) { System.out.println("Session close..........."); } } } }
2:SFTP上传单个文件
/** * SFTP上传单个文件 * * @Title: upload * @param directory * @param uploadFile * @throws Exception * void * @author wangqinghua * @date 2015-9-24 下午1:49:55 */ public void upload(String directory, String uploadFile) throws Exception { sftp.cd(directory); File file = new File(uploadFile); sftp.put(new FileInputStream(file), file.getName()); }
3.上传目录下的所有文件(批量上传)
/** * 上传目录下的所有文件(批量上传) * * @Title: uploadByDirectory * @param directory * @throws Exception * void * @author wangqinghua * @date 2015-9-24 下午1:50:53 */ 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); } }
4:通过SFTP下载文件
/** * 通过SFTP下载文件 * * @Title: download * @param directory * @param downloadFile * @param saveDirectory * @throws Exception * void * @author wangqinghua * @date 2015-9-24 下午1:56:22 */ public void download(String directory, String downloadFile, String saveDirectory) throws Exception { String saveFile = saveDirectory + "//" + downloadFile; sftp.cd(directory); File file = new File(saveFile); sftp.get(downloadFile, new FileOutputStream(file)); }
5:批量下载目录下的文件
/** * 批量下载目录下的文件 * * @Title: downloadByDirectory * @param directory * @param saveDirectory * @throws Exception * void * @author wangqinghua * @date 2015-9-24 下午1:58:17 */ 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); } }
6:删除文件
/** * 删除文件 * * @Title: delete * @param directory * @param deleteFile * @throws Exception * void * @author wangqinghua * @date 2015-9-24 下午1:58:57 */ public void delete(String directory, String deleteFile) throws Exception { sftp.cd(directory); sftp.rm(deleteFile); }
7:文件重命名
/** * 文件重命名 * * @Title: rename * @param directory * @param oldFileNm * @param newFileNm * @throws Exception * void * @author wangqinghua * @date 2015-9-24 下午2:02:22 */ public void rename(String directory, String oldFileNm, String newFileNm) throws Exception { sftp.cd(directory); sftp.rename(oldFileNm, newFileNm); }
8:获得文件流
/** * 获得文件流 * * @Title: get * @param directory * @return * @throws Exception * InputStream * @author wangqinghua * @date 2015-9-24 下午2:03:41 */ public InputStream getInputStream(String directory) throws Exception { InputStream streatm = sftp.get(directory); return streatm; }
9:Servlet结合SFTP实现简单的文件下载
/** * Servlet结合SFTP实现简单的文件下载 * @Title: doPost * @param request * @param response * @throws IOException * @throws ServletException * void * @author wangqinghua * @date 2015-9-24 下午2:15:40 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { LOG.info("进入下载文件开始.........."); String host = "";// 主机地址 String port = "";// 主机端口 String username = "";// 服务器用户名 String password = "";// 服务器密码 String planPath = "";// 文件所在服务器路径 BufferedInputStream bis = null; BufferedOutputStream bos = null; OutputStream fos = null; String fileName = "demo"; SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); String currentDate = formatter.format(new Date()); // demo20150924.txt String downloadFile = fileName + currentDate + ".zip"; PrintWriter out = null; SftpUtil sftpUtil = new SftpUtil(host, Integer.parseInt(port), username, password); try { ChannelSftp sftp=sftpUtil.getSftp(); String filename = ""; // String[] strs=planUrl.split("/"); String filePath = planPath; // 列出目录下的文件 List<String> listFiles = 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(); LOG.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(); LOG.info("SFTP连接已断开"); } catch (Exception e) { e.printStackTrace(); } if (out != null) { out.close(); } LOG.info("out已关闭"); if (bis != null) { bis.close(); } LOG.info("bis已关闭"); if (bos != null) { bos.close(); } LOG.info("bos已关闭"); } }
10:获得目录下的所有文件名
/** * 获得目录下的所有文件名 * * @Title: listFiles * @param directory * @return * @throws Exception * List<String> * @author wangqinghua * @date 2015-9-24 下午1:53:40 */ @SuppressWarnings("rawtypes") public List<String> listFiles(String directory) throws Exception { Vector fileList; List<String> fileNameList = new ArrayList<String>(); fileList = 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; }
关于sftp内部方法详情:http://blog.csdn.net/jr_soft/article/details/18704857
相关文章推荐
- php文件
- 高性能SOCKET扩展SWOOLE和PHP框架配置
- 用php实现百度网盘图片直链的代码分享
- 安装php phalcon扩展
- RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器
- 在php代码中调用帝国cms头部变量temp.header的方法
- ThinkPHP-RBAC为角色分配权限之展示表单
- LTP介绍
- 修改phpcms V9的后台登录地址
- yii2图片上传
- windos安装laravel
- Yii2结合webuploader实现图片上传
- ftp
- thinkphp3.2.3学习注意(pdo)
- php二维数组用键名分组相加实例函数
- PHP学习笔记(四):流程控制
- php is_uploaded_file()函数
- 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
- PHP中闭包的使用
- PHP编程 - 数值分析(php实现)一:Lagrange插值