zoukankan      html  css  js  c++  java
  • 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包 
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/chen-lhx/p/5063158.html
Copyright © 2011-2022 走看看