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包 
  • 相关阅读:
    【论文阅读笔记】《StarGAN》
    【数据分析入门】泰坦尼克号生存率预测(一)
    【DLPytorch】Optimizer(一)
    【论文阅读笔记】《Pix2Pix》
    【论文阅读笔记】《DCGAN》
    【论文阅读笔记】《Conditional Generative Adversarial Nets》
    【论文阅读笔记】Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
    【Datawhale】Python从入门到放弃
    【数字图像处理】 直方图的均衡与规定化
    GAN学习入门篇(一)
  • 原文地址:https://www.cnblogs.com/chen-lhx/p/5063158.html
Copyright © 2011-2022 走看看