精华内容
下载资源
问答
  • import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; ...import java.io.File; import ja...
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Vector;
    
    
    public class SftpClientUtil {
    
    
    
        /**
         * 密码方式登录 读取指定目录文件
         *
         * @param ip
         * @param user
         * @param psw
         * @param port
         */
        public static  Session sshSftpReadFile(String ip, String user, String psw, int port) {
            Session session = null;
            JSch jsch = new JSch();
            try {
                if (port <= 0) {
                    // 连接服务器,采用默认端口
                    session = jsch.getSession(user, ip);
                } else {
                    // 采用指定的端口连接服务器
                    session = jsch.getSession(user, ip, port);
                }
    
                // 如果服务器连接不上,则抛出异常
                if (session == null) {
                    throw new Exception("session is null");
                }
    
                // 设置登陆主机的密码
                session.setPassword(psw);// 设置密码
                // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
                session.setConfig("StrictHostKeyChecking", "no");
                // 设置登陆超时时间
                session.connect(300000);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        return session;
        }
    
        /**
         * 密码方式登录 上传指定目录文件
         *
         * @param ip
         * @param user
         * @param psw
         * @param port
         */
        public static File sshSftpUpLoadFile(String ip, String user, String psw, int port, String sPath,File file) {
            Session session = null;
            File folderToScan = null;
            JSch jsch = new JSch();
            try {
                if (port <= 0) {
                    // 连接服务器,采用默认端口
                    session = jsch.getSession(user, ip);
                } else {
                    // 采用指定的端口连接服务器
                    session = jsch.getSession(user, ip, port);
                }
    
                // 如果服务器连接不上,则抛出异常
                if (session == null) {
                    throw new Exception("session is null");
                }
    
                // 设置登陆主机的密码
                session.setPassword(psw);// 设置密码
                // 设置第一次登陆的时候提示,可选值:(ask | yes | no)
                session.setConfig("StrictHostKeyChecking", "no");
                // 设置登陆超时时间
                session.connect(300000);
    
                upLoadFile(session,file,sPath);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return folderToScan;
        }
    
        public static    Map<String, InputStream > readFile(Session session, String sPath) {
    
            Channel channel = null;
            Map<String, InputStream > stringHashMap  =new HashMap<>();
            try {
                channel = (Channel) session.openChannel("sftp");
                channel.connect(10000000);
                ChannelSftp sftp = (ChannelSftp) channel;
                try {
                    sftp.cd(sPath);
    
                } catch (SftpException e) {
    
                    sftp.mkdir(sPath);
                    sftp.cd(sPath);
    
                }
                Vector<ChannelSftp.LsEntry>  listFiles = sftp.ls(sftp.pwd());
                for (ChannelSftp.LsEntry file : listFiles)
                {
                    String fileName = file.getFilename();
                    try
                        {
                            InputStream    inputStream = sftp.get(sftp.pwd() + "/" + fileName);
    
                            stringHashMap.put(fileName,inputStream);
                        }
                        catch (SftpException e)
                        {
                            e.printStackTrace();
                        }
    
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return stringHashMap;
        }
    
    
        public static void upLoadFile(Session session,  File file , String sPath) {
    
            Channel channel = null;
            try {
                channel = (Channel) session.openChannel("sftp");
                channel.connect(10000000);
                ChannelSftp sftp = (ChannelSftp) channel;
                try {
                    sftp.cd(sPath);
                    //
                } catch (SftpException e) {
    
                    sftp.mkdir(sPath);
                    sftp.cd(sPath);
    
                }
                copyFile(sftp, file, sftp.pwd());
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                session.disconnect();
                channel.disconnect();
            }
        }
    
        public static void copyFile(ChannelSftp sftp, File file, String pwd) {
    
            if (file.isDirectory()) {
                File[] list = file.listFiles();
                try {
                    try {
                        String fileName = file.getName();
                        sftp.cd(pwd);
                        sftp.mkdir(fileName);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    pwd = pwd + "/" + file.getName();
                    try {
    
                        sftp.cd(file.getName());
                    } catch (SftpException e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                for (int i = 0; i < list.length; i++) {
                    copyFile(sftp, list[i], pwd);
                }
            } else {
    
                try {
                    sftp.cd(pwd);
    
                } catch (SftpException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                InputStream instream = null;
                OutputStream outstream = null;
                try {
                    outstream = sftp.put(file.getName());
                    instream = new FileInputStream(file);
    
                    byte b[] = new byte[1024];
                    int n;
                    try {
                        while ((n = instream.read(b)) != -1) {
                            outstream.write(b, 0, n);
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                } catch (SftpException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    try {
                        outstream.flush();
                        outstream.close();
                        instream.close();
    
                    } catch (Exception e2) {
                        // TODO: handle exception
                        e2.printStackTrace();
                    }
                }
            }
        }
    
    }
    
    展开全文
  • 接到需求要对第三方公司的服务器进行文件操作,包括文件的上传下载等。。。以下是具体实现代码,希望能帮助到有同样需求的战友,有疑问可以微信交流:【shedexinjing】 package com.util; import java.io....

     接到需求要对第三方公司的服务器进行文件操作,包括文件的上传下载等。。。以下是具体实现代码,希望能帮助到有同样需求的战友,有疑问可以微信交流:【shedexinjing】

    package com.util;
    
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Properties;
    import java.util.Vector;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    
    
    
    public class SFTPUtil {
    	private static final Log log = LogFactory.getLog(SFTPUtil.class);
    	/**从sftp中后去文件内容
    	 * @param path      远程文件目录
    	 * @param fileName  远程文件
    	 * @return          以  #@# 为分隔的字符串,每一个部分为一行数据
    	 * @throws JSchException  
    	 * @throws Exception
    	 */
    	public static String downLoadFileTxt(String SFTPType,String path,String fileName) throws JSchException,  Exception{
    		log.info("down_load_file:"+path+"/"+fileName);
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		InputStream is = null;
    		BufferedReader buf = null;
    		StringBuffer content = new StringBuffer();
    		try {
    			session = getSession(SFTPType);
    			
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    sftpChannel.cd(path);
    		
    			is = sftpChannel.get(fileName);
    			if(is==null){
    				throw new CashException("文件不存在");
    			}else{
    				buf = new BufferedReader(new InputStreamReader(is,"UTF-8"));
    				String tcontent = null;
    				
    				while((tcontent = buf.readLine())!=null){
    					if(StringUtils.isNotEmpty(tcontent)){
    						content.append(CashServiceConstant.DOWN_TEXT_LINE_SPLIT).append(tcontent);
    					}
    				}
    			}
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(is!=null)is.close();
    			if(buf!=null)buf.close();
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    		//去掉最后部分
    		if(content.toString().startsWith(CashServiceConstant.DOWN_TEXT_LINE_SPLIT)){
    			return content.toString().replaceFirst(CashServiceConstant.DOWN_TEXT_LINE_SPLIT, "");
    		}else{
    			return content.toString();
    		}
    	}
    	
    	/**
    	 * @param SFTPType
    	 * @param sFile         老文件
    	 * @param dFile         先文件
    	 * @return
    	 * @throws JSchException
    	 * @throws Exception
    	 */
    	public static boolean rename(String SFTPType,String sFile,String dFile) throws JSchException,  Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    sftpChannel.rename(sFile, dFile);
    		    return true;
    		} catch (Exception e) {
    			log.error("",e);
    			return false;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    	}
    	/**创建文件目录
    	 * @param SFTPType  配置文件中的sftp前缀例如 DJ_SFTP_USER 就等于  SFTPType=DJ
    	 * @param paths   形成靠左/靠前的先创建
    	 * @return
    	 * @throws JSchException
    	 * @throws Exception
    	 */
    	public static boolean getMkdirs(String SFTPType,List<String> paths) throws JSchException,  Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    int size = paths.size();
    		    for(int i=0;i<size;i++){
    		    	String path = paths.get(i);
    		    	try {
    		    		if(fileExist("YC",path)){
    		    			sftpChannel.mkdir(path);
    		    		}
    		    		if(fileExist("ZJ",path)) {
    		    			sftpChannel.mkdir(path);
    		    		}
    				} catch (Exception e) {
    					log.warn(e.getMessage(),e);
    				}
    		    }
    		    return true;
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    	}
    	/**
    	 * 判断文件夹是否存在
    	 * 存在  false
    	 * 不存在  true
    	 */
    	public static boolean fileExist(String SFTPType,String path) throws JSchException,  Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    try {
    		    	 Vector ls = sftpChannel.ls(path);
    		    	 return false;
    			} catch (Exception e) {
    				return true;
    			}
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    	}
    	public static void upLoadFile(String SFTPType,String rpath,String rFileName,byte[] fileData) throws Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    
    		    sftpChannel.cd(rpath);
    		    OutputStream os = sftpChannel.put(rFileName);
    		    os.write(fileData);
    		    os.flush();
    		    os.close();
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    	}
    	public static boolean cdPath(String SFTPType,String path) throws JSchException,  Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		final List fs = new ArrayList();
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    log.debug("cd="+path);
    		    sftpChannel.cd(path);
    		} catch (Exception e) {
    			log.error("",e);
    			return false;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    		return true;
    	}
    	/**查看当前目录下所有文件夹以及文件
    	 * @param SFTPType
    	 * @return
    	 * @throws JSchException
    	 * @throws Exception
    	 */
    	public static List<String> getLs(String SFTPType,String path) throws JSchException,  Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		List fs = new ArrayList();
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    //sftpChannel.cd(path);
    		    log.debug("ls_pwd="+sftpChannel.pwd());
    		    Vector fileList = sftpChannel.ls(path);
    		    fs= parseList(fileList);
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    		 return fs;
    	}
    	/**查看当前目录
    	 * @param SFTPType
    	 * @return
    	 * @throws JSchException
    	 * @throws Exception
    	 */
    	public static String getPwd(String SFTPType) throws JSchException,  Exception{
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    String pwd = sftpChannel.pwd();
    		    log.debug("pwd="+pwd);
    		    return pwd;
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    	}
    	
    	/**连接ftp
    	 * @param SFTPType  配置文件中的sftp前缀例如 DJ_SFTP_USER 就等于  SFTPType=DJ
    	 * @return
    	 */
    	public static Session getSession(String SFTPType){
    		JSch jsch=new JSch(); 
    		Session session = null;
    		try {
    			//从properties配置文件中获取服务器参数,自己定义
    			String user = Properties.getValue(SFTPType+"_SFTP_USER");
    			String passwd = Properties.getValue(SFTPType+"_SFTP_PASSWD");
    			String host = Properties.getValue(SFTPType+"_SFTP_HOST");
    			int port = Properties.getInt(SFTPType+"_SFTP_PORT");
    			log.debug("user>>"+user);
    			log.debug("passwd>>"+passwd);
    			log.debug("host>>"+host);
    			log.debug("host>>"+host);
    			session=jsch.getSession(user, host, port);  
    			session.setPassword(passwd);
    			Properties config = new java.util.Properties();
    			config.put("StrictHostKeyChecking", "no");
    			session.setConfig(config);
    			Integer timeout = CashProperties.getInt(SFTPType+"_SFTP_TIMEOUT");
    			session.setTimeout(timeout==null?6000:timeout); // 设置timeout时间
    			session.connect();
    			return session;
    		} catch (JSchException e) {
    			e.printStackTrace();
    			if(session!=null && session.isConnected()){
    				session.disconnect();
    			}
    			return null;
    		} 
    	}
    	/**
    	 * 删除文件夹及其子文件
    	 * @param SFTPType 类型 例如 DJ
    	 * @param directory 上一级文件夹
    	 * @param desdir 目标文件夹
    	 */
    	public static void deleteAll(String SFTPType,String directory,String desdir) {
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    	    try {
    	    	session = getSession(SFTPType);
    	    	Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    	    	channel.connect();
    	    	sftpChannel=(ChannelSftp)channel;
    	    	//获取删除目录下的所有文件,要先删除目录下的所有文件再删除文件夹
    	    	Vector fileList = null;
    	    	try {
    				fileList = sftpChannel.ls(directory+"/"+desdir);
    			} catch (Exception e) {
    				log.debug(directory+"/"+desdir+",该目录不存在");
    				return;
    			}
    		    List<String> list= parseList(fileList);
    		    sftpChannel.cd(directory+"/"+desdir);
    		    for (int i = 0; i < list.size(); i++) {
    		    	
    		    	sftpChannel.rm(list.get(i));
    		    }
    		    sftpChannel.cd("../");
    	    	sftpChannel.rmdir(desdir);
    	    } catch (Exception e) {
    	    	e.printStackTrace();
    	    }finally{
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
        }
    	/**
    	 * 下载文件
    	 * @param SFTPType  类型 例如 DJ
    	 * @param directory ftp上的文件夹
    	 * @param downloadFile 下载的目标文件
    	 * @param saveDirectory 下载保存的路径
    	 * @throws Exception
    	 */
    	public static void download(String SFTPType,String directory, String downloadFile, String saveDirectory)
    		    throws Exception
    		  {
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		FileOutputStream fileOutputStream = null;
    		try {
    			String saveFile = saveDirectory + "//" + downloadFile;
    			session = getSession(SFTPType);
    	    	Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    	    	channel.connect();
    	    	sftpChannel=(ChannelSftp)channel;
    	    	sftpChannel.cd(directory);
    		    File file = new File(saveFile);
    		    fileOutputStream = new FileOutputStream(file);
    		    sftpChannel.get(downloadFile, fileOutputStream);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally{
    			if(fileOutputStream!=null){fileOutputStream.close();}
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    		   
    	 }
    	
    	public static List<String> parseList(Vector fileList){
    		List<String> list= new ArrayList<String>();
    		Iterator it = fileList.iterator();
    	    while (it.hasNext())
    	    {
    	      String fileName = ((ChannelSftp.LsEntry)it.next()).getFilename();
    	      if ((".".equals(fileName)) || ("..".equals(fileName))) {
    	        continue;
    	      }
    	      list.add(fileName);
    	    }
    	    return list;
    	}
    	/**
    	 * 下载文件,返回InputStream
    	 */
    	public static byte[] downLoadFileIo(String SFTPType,String path,String fileName) throws JSchException,  Exception{
    		log.info("下载文件,down_load_file:"+path+"/"+fileName);
    		Session session = null;
    		ChannelSftp sftpChannel = null;
    		InputStream is = null;
    		byte[] bs = null;
    		try {
    			session = getSession(SFTPType);
    			Channel channel=session.openChannel("sftp"); // 打开SFTP通道 
    			channel.connect(); // 建立SFTP通道的连接
    		    sftpChannel=(ChannelSftp)channel;  
    		    sftpChannel.cd(path);
    			is = sftpChannel.get(fileName);
    			bs = readInputStream(is);
    		} catch (Exception e) {
    			throw e;
    		}finally{
    			if(is!=null)is.close();
    			if(sftpChannel!=null)sftpChannel.disconnect();
    			if(session!=null) session.disconnect();
    		}
    		return bs;
    	}
    	/**
    	 * 从输入流中获取字节数组
    	 * 
    	 * @param inputStream
    	 * @return
    	 * @throws IOException
    	 */
    	private static  byte[] readInputStream(InputStream inputStream) throws IOException {
    		byte[] buffer = new byte[1024];
    		int len = 0;
    		ByteArrayOutputStream bos = new ByteArrayOutputStream();
    		while ((len = inputStream.read(buffer)) != -1) {
    			bos.write(buffer, 0, len);
    		}
    		bos.close();
    		return bos.toByteArray();
    	}
    }
    

     

    展开全文
  • SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。接下来通过本文给大家介绍了Java使用sftp定时下载文件的示例代码,感兴趣的朋友跟随脚本之家小编一起看看吧
  • Java 使用SFTP文件上传

    2021-02-01 22:28:13
    SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,...

    SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP(来自百度的解释)
    JSch是Java Secure Channel的缩写。 JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。

    ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:

    put():      文件上传
    get():      文件下载
    cd():       进入指定目录
    ls():       得到指定目录下的文件列表
    rename():   重命名指定文件或目录
    rm():       删除指定文件
    mkdir():    创建目录
    rmdir():    删除目录
    

    1、先引入jar包

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.2</version>
    </dependency>
    

    账号密码类

    public interface SFTPDTO {
        /*FTP登录用户名*/
        public static final String username=xxxx;
        /** FTP登录密码*/
        public static final String password=xxxx;
        /** 私钥*/
        public static final String privateKey = xxxx;
        /** FTP服务器地址IP地址*/
        public static final String host=xxxx;
        /** FTP端口*/
        public static final int port=xxxx;
    }
    

    重要类,里面包含开启连接和关闭连接。

    public class SFTPUtils {
        private ChannelSftp sftp;
        private Session session;
    
        public void login(){
            try {
                JSch jsch = new JSch();
                if (SFTPDTO.privateKey != null) {
                    jsch.addIdentity(SFTPDTO.privateKey);// 设置私钥
                }
                session = jsch.getSession(SFTPDTO.username, SFTPDTO.host, SFTPDTO.port);
    
                if (SFTPDTO.password != null) {
                    session.setPassword(SFTPDTO.password);
                }
    
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
    
                session.setConfig(config);
                session.connect();
    
                Channel channel = session.openChannel("sftp");
                channel.connect();
    
                sftp = (ChannelSftp) channel;
            } catch (Exception e) {
                log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{SFTPDTO.host, SFTPDTO.port, e.getMessage()});
            }
        }
    
        /**
         * 关闭连接 server
         */
        public void logout(){
            if (sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                    log.info("sftp is closed already");
                }
            }
            if (session != null) {
                if (session.isConnected()) {
                    session.disconnect();
                    log.info("sshSession is closed already");
                }
            }
        }
    	
    	
    	/**
         * 将输入流的数据上传到sftp作为文件
         * @param directory 上传到该目录
         * @param sftpFileName sftp端文件名
         * @throws SftpException
         * @throws Exception
         */
        public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{
            try {
                sftp.cd(directory);
            } catch (SftpException e) {
                log.warn("directory is not exist");
                sftp.mkdir(directory);
                sftp.cd(directory);
            }
            sftp.put(input, sftpFileName);
            log.info("file:{} is upload successful" , sftpFileName);
        }
    }
    

    测试一下

    public static void main(){
    	SFTPUtils sftp = new SFTPUtils();
        sftp.login();
    
        String audioUrl = courseSection.getAudioUrl();
        String temp[] = audioUrl.split("\\\\");
        String fileName = temp[temp.length - 1];
        InputStream inputStream = FileUtils.urlInputStream(audioUrl);
        sftp.upload("/www/website/haha/audio", fileName, inputStream);//上传
        //拼接最终的url
        String newUrl = "https://static.taobao.com/website/ancai/audio/".concat(fileName);
        sftp.logout();
    }
    

    把url转成流

    public class FileUtils {
        public static InputStream urlInputStream(String fileUrl){
            if(StringUtils.isBlank(fileUrl)){
                return null;
            }
            try {
                URL url = new URL(fileUrl);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                //设置超时间为3秒
                conn.setConnectTimeout(3*1000);
                //防止屏蔽程序抓取而返回403错误
                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
                //得到输入流
                return conn.getInputStream();
            } catch (Exception e) {
                //打印error
                log.error("fileutils.urlinputstream-获取url流失败:",e.getMessage());
            }
            return null;
        }
    }
    

    实际中,我们使用这个工具类就够用了

    public class SFTPUtils {
    
        private ChannelSftp sftp;
        
        private Session session;
        public void login(){
            try {
                JSch jsch = new JSch();
                if (SFTPDTO.privateKey != null) {
                    jsch.addIdentity(SFTPDTO.privateKey);// 设置私钥
                }
                session = jsch.getSession(SFTPDTO.username, SFTPDTO.host, SFTPDTO.port);
    
                if (SFTPDTO.password != null) {
                    session.setPassword(SFTPDTO.password);
                }
    
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
    
                session.setConfig(config);
                session.connect();
    
                Channel channel = session.openChannel("sftp");
                channel.connect();
    
                sftp = (ChannelSftp) channel;
            } catch (Exception e) {
                log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{SFTPDTO.host, SFTPDTO.port, e.getMessage()});
            }
        }
    	
        /**
         * 关闭连接 server
         */
        public void logout(){
            if (sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                    log.info("sftp is closed already");
                }
            }
            if (session != null) {
                if (session.isConnected()) {
                    session.disconnect();
                    log.info("sshSession is closed already");
                }
            }
        }
    
        /**
         * 将输入流的数据上传到sftp作为文件
         * @param directory 上传到该目录
         * @param sftpFileName sftp端文件名
         * @throws SftpException
         * @throws Exception
         */
        public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{
            try {
                sftp.cd(directory);
            } catch (SftpException e) {
                log.warn("directory is not exist");
                sftp.mkdir(directory);
                sftp.cd(directory);
            }
            sftp.put(input, sftpFileName);
            log.info("file:{} is upload successful" , sftpFileName);
        }
    
        /**
         * 上传单个文件
         * @param directory 上传到sftp目录
         * @param uploadFile 要上传的文件,包括路径
         * @throws FileNotFoundException
         * @throws SftpException
         * @throws Exception
         */
        public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{
            File file = new File(uploadFile);
            upload(directory, file.getName(), new FileInputStream(file));
        }
    
        /**
         * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。
         * @param directory 上传到sftp目录
         * @param sftpFileName 文件在sftp端的命名
         * @param byteArr 要上传的字节数组
         * @throws SftpException
         * @throws Exception
         */
        public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{
            upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));
        }
    
        /**
         * 将字符串按照指定的字符编码上传到sftp
         * @param directory 上传到sftp目录
         * @param sftpFileName 文件在sftp端的命名
         * @param dataStr 待上传的数据
         * @param charsetName sftp上的文件,按该字符编码保存
         * @throws UnsupportedEncodingException
         * @throws SftpException
         * @throws Exception
         */
        public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{
            upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));
        }
    
        /**
         * 下载文件
         * @param directory 下载目录
         * @param downloadFile 下载的文件
         * @param saveFile 存在本地的路径
         * @throws SftpException
         * @throws Exception
         */
        public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);
            }
            File file = new File(saveFile);
            sftp.get(downloadFile, new FileOutputStream(file));
            log.info("file:{} is download successful" , downloadFile);
        }
    
        /**
         * 下载文件
         * @param directory 下载目录
         * @param downloadFile 下载的文件名
         * @return 字节数组
         * @throws SftpException
         * @throws Exception
         */
        public byte[] download(String directory, String downloadFile) throws SftpException, IOException {
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);
            }
            InputStream is = sftp.get(downloadFile);
            byte[] fileData = IOUtils.toByteArray(is);
            log.info("file:{} is download successful" , downloadFile);
            return fileData;
        }
    
        /**
         * 删除文件
         * @param directory 要删除文件所在目录
         * @param deleteFile 要删除的文件
         * @throws SftpException
         * @throws Exception
         */
        public void delete(String directory, String deleteFile) throws SftpException{
            sftp.cd(directory);
            sftp.rm(deleteFile);
        }
    
        /**
         * 列出目录下的文件
         * @param directory 要列出的目录
         * @return
         * @throws SftpException
         */
        public Vector<?> listFiles(String directory) throws SftpException {
            return sftp.ls(directory);
        }
    
        /*public static void main(String[] args) throws SftpException, Exception {
            SFTPUtils sftp = new SFTPUtils("xxxx", "xxx", "upload.haha.com", 8888);
            sftp.login();
            InputStream inputStream = getInputStream("http://qiniu.xinxuanhaoke.com/keqianduwu_1.jpg");
            sftp.upload("/www/website/ancai/audio", "123.jpg", inputStream);
            sftp.logout();
        }*/
    }
    

    方式二、使用HuTool的工具类

    先引入jar

    <dependency>
    	<groupId>cn.hutool</groupId>
    	<artifactId>hutool-all</artifactId>
    	<version>5.4.0</version>
    </dependency>
    <dependency>
    	<groupId>com.jcraft</groupId>
    	<artifactId>jsch</artifactId>
    	<version>0.1.53</version>
    </dependency>
    
    public static void main(String[] args) {
        Sftp sftp = JschUtil.createSftp("ip或者域名", 端口, "账号", "密码");
        ChannelSftp client = sftp.getClient();
        String cd = "/www/website/ancai/audio";//要上传的路径
        try {
            sftp.cd(cd);  //进入指定目录
        } catch (Exception e) {
            log.warn("directory is not exist");
            sftp.mkdir(cd);     //创建目录
            sftp.cd(cd);        //进入目录
        }
        InputStream inputStream = urlInputStream("http://audio.xinxuanhaoke.com/50bda079e9ef3673bbaeda20321bf932.mp3");//将文件转成流
        
        client.put(String.valueOf(inputStream), "1.mp3");//开始上传。
    }
    

    本文引自:https://www.cnblogs.com/ceshi2016/p/7519762.html

    展开全文
  • 引用Jsch包 Maven <dependency> <groupId>...//下載文件到本地 sftp.delete(ftpPath + fileName);//刪除ftp文件 } sftp.logout();

    引用Jsch包
    Maven

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.54</version>
    </dependency>
    

    Gradle

    compile group: 'com.jcraft', name: 'jsch', version: '0.1.54'
    

    提示:SFTP默认端口22,FTP默认端口21

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Properties;
    import java.util.Vector;
    
    import org.apache.commons.io.IOUtils;
    
    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.JSchException;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    
    public class SFTPUtil {
     
        private ChannelSftp sftp;       
        private Session session;  
        private String username; 
        private String password;  
        private String privateKey;  
        private String host;  
        private int port;  
            
        public SFTPUtil(String username, String password, String host, int port) {  
            this.username = username;  
            this.password = password;  
            this.host = host;  
            this.port = port;  
        } 
        
        public SFTPUtil(String username, String host, int port, String privateKey) {  
            this.username = username;  
            this.host = host;  
            this.port = port;  
            this.privateKey = privateKey;  
        }  
        
        public SFTPUtil(){}  
        
        public ChannelSftp getChannelSftp() {
        	return this.sftp;
        }
        
        public void login(){  
            try {  
                JSch jsch = new JSch();  
                if (privateKey != null) {  
                    jsch.addIdentity(privateKey);// 设置私钥  
                }  
        
                session = jsch.getSession(username, host, port);  
               
                if (password != null) {  
                    session.setPassword(password);    
                }  
                Properties config = new Properties();  
                config.put("StrictHostKeyChecking", "no");  
                    
                session.setConfig(config);  
                session.connect();  
                  
                Channel channel = session.openChannel("sftp");  
                channel.connect();  
        
                sftp = (ChannelSftp) channel;  
            } catch (JSchException e) {  
                e.printStackTrace();
            }  
        }    
        
        public void logout(){  
            if (sftp != null) {  
                if (sftp.isConnected()) {  
                    sftp.disconnect();  
                }  
            }  
            if (session != null) {  
                if (session.isConnected()) {  
                    session.disconnect();  
                }  
            }  
        }  
      
        public ArrayList<String> listFiles(String dir) throws SftpException{
        	ArrayList<String> files = new ArrayList<String>();
        	sftp.cd(dir);
        	Vector<String> lss = sftp.ls("*");
        	for (int i = 0; i < lss.size(); i++)
        	{
        	    Object obj = lss.elementAt(i);
        	    if (obj instanceof com.jcraft.jsch.ChannelSftp.LsEntry)
        	    {
        	        LsEntry entry = (LsEntry) obj;
        	        if (true && !entry.getAttrs().isDir())
        	        {
        	        	files.add(entry.getFilename());
        	        }
        	        if (true && entry.getAttrs().isDir())
        	        {
        	            if (!entry.getFilename().equals(".") && !entry.getFilename().equals(".."))
        	            {
        	            	files.add(entry.getFilename());
        	            }
        	        }
        	    }
        	}
        	return files;
        }
        
        public void download(String fileName, String savedir) throws SftpException, IOException{  
            InputStream is = sftp.get(fileName);
            
            System.out.println("fileName:"+fileName+"; savedir:"+savedir);
            
            FileOutputStream out = new FileOutputStream(new File(savedir + "\\" +fileName));
            IOUtils.copy(is,out);
            is.close();
            out.close(); 
        }
        
        public void delete(String fileName) throws SftpException {
        	sftp.rm(fileName);
        }
        
    }
    

    调用:

    SFTPUtil sftp = new SFTPUtil(ftpUsername, ftpPassword, ftpUrl, ftpPort);
    sftp.login();
    ArrayList<String> ftpFileArr = sftp.listFiles(ftpPath);
    for (int ii = 0; ii < ftpFileArr.size(); ii++) {
    	String fileName = ftpFileArr.get(ii);
    	byte[] bytes = fileName.getBytes("iso-8859-1");
        String string = new String(bytes, "UTF-8");
        sftp.download(fileName, filePath);//下載文件到本地
        sftp.delete(ftpPath + fileName);//刪除ftp文件
    }
    sftp.logout();
    
    展开全文
  • 需要获得某个sftp上的某些增量的zip文件,并将zip文件中的txt中的内容保存到数据库。 txt中文件的内容是以 | 隔开。 zip文件每天新增一个,以前保存到数据库的zip中的数据不能重复保存。 package ...
  • SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP为SSH的一部份,是一种传输文件到服务器的安全方式。 依赖包 <!-- ...
  • Java利用SFTP实现文件上传与下载

    万次阅读 热门讨论 2018-03-08 17:27:45
    SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP为SSH的一部份,是一种传输文件到服务器的安全方式。package sftp; import com.jcraft.jsch.*; import ...
  • ... import org.junit.Test; import sun.net.ftp.FtpClient; import sun.net.ftp.FtpProtocolException;...import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import j.
  • java实现上传文件,删除文件操作,通过sftp实现,上传文件到服务器上
  • java实现sftp操作工具类

    热门讨论 2012-03-12 17:43:31
    1分让你得到sftp常用操作工具,工具实现如下操作: 1)得到当前工作目录地址 2)改变目录为配置的远程目录 3)取文件目录列表 4)取文件列表 5)下载文件 6)复制文件 7)删除文件 8)目录是否存在,文件是否存在 9)移动文件 ...
  • 现象:线上sftp下载文件解析入库,平时都可以正常解析入库,突然出现文件解析异常,手工下载打开文件格式是符合要求的。 原因:约定文件使用的是utf-8编码,一般文件都是正常的utf-8的文件, 但UTF-8的文件有BOM和...
  • 最近做SFTP连接获取文件,遇到好多坑,记录一下防止以后重复踩坑 无效秘钥文件 1.版本低导致文件无效 2.windows系统不支持ppk秘钥文件,必须转换成pem秘钥文件 ...(IdentityFile.java:302) ...
  • java连接Sftp,实现文件上传下载

    千次阅读 2020-04-06 06:42:26
    import java.io.File; /** * 文件工具类 * @author Peter * */ public class FileUtils { /** * 传入文件夹路径,该方法能够实现创建整个路径 * @param path 文件夹路径,不包含文件名称及...
  • java访问linux;通过linux主机ip,端口,用户名,密码,获取linux链接,输入文件路径可批量的下载linux文件,mian函数为测试代码
  • 查看jsch包中列出文件名的方法 通过jsch获取ChannelSftp。ChannelSftp中有相应的列出,删除等一系列文件操作。找出其中的列出文件方法。包含l
  • 最近工作中用到了JSch去操作SFTP文件的上传和下载,本文记录一下封装的一个工具类,以及实际遇到的两个问题。 SFTP(Secure File Transfer Protocol,安全文件传送协议)一般指SSH文件传输协议(SSH File Transfer ...
  • 在FileZilla 中: - 用sftp协议连接Server ,需要用port 22 - 用ftp协议连接Server, 用port21如果你的目标主机port是22,则是用sftp方式发送,下载文件,见下图,该主机端口为22一、连接目标主机下载目标文件到本...
  • 这个呢也是项目中用到的,最近啊用了好多新的东西,都是基于java调用shell脚本,sftp,hive,hdfs等等,如果有需要了大家可以在我博客找找对应内容,本次记录一下sftp的使用; 废话不多说,直接上代码,后面也有...
  • Java连接SFTP服务器步骤 调用测试(这里是在service层中进行测试),相关的连接配置信息可在application.yml文件里面配置。 application.yml中的配置信息: 使用@Value注解去进行单个从yml文件获取 1.创建一个...
  • vue文件下载,java读取SFTP文件通过流的方式输出到前端 java后台Controller层代码 @RequestMapping("downloadFile") public void downLoadFile(HttpServletRequest req, HttpServletResponse response) { String...
  • Java实现从sftp批量下载文件并打包到浏览器 首先声明: 该项目会先在本地创建一个临时文件夹,将文件下载到本地后打包发送到浏览器,发送完成后将本地文件删除。 jsp页面部分 <div class="queryCondition"> ...
  • java实现sftp远程下载文件、文件夹

    万次阅读 2019-01-11 18:53:34
    JSch(Java Secure Channel)是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。 SFTP(Secure File Transfer Protoco....
  • java SFTP下载,读取linux服务器文件

    千次阅读 2019-07-13 19:21:11
    SFTP下载,读取linux服务器文件 1 导入依赖 <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ftp</artifactId> <version&g...
  • SFTP 获取 文件内容

    千次阅读 2020-08-31 15:58:26
    SFTP 获取远程文件的存入的属性 application.properties ftp.host=xxx.xxx.xxx.xxx ftp.port=22 ftp.username=username ftp.passwd=password ftp.characterset=UTF-8 获取文件配置: @Value("${ftp.host}") ...
  • java实现多级目录的遍历及技术,作为javaIO流学习的练手作品
  • Java并发编程 3、什么是多线程中的上下文切换? 4、死锁与活锁的区别,死锁与饥饿的区别? 5、Java中用到的线程调度算法是什么? 6、什么是线程组,为什么在Java中不推荐使用? 》7、为什么使用Executor框架? 8、在Java...
  • 用户可以通过各种不同的FTP客户端程序,借助FTP协议,来连接FTP服务器,以上传或者下载文件。 默认端口: 21 在此协议中SSH2服务器起了一个桥梁作用,把数据在客户端和ftp之间转发。ftp协议本身包括两个通道,一个...
  • java sftp工具类 引用: jsch-0.1.54.jar <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </...
  • 最近有个需求是上传一个压缩包到服务器并实现解压缩,网上找了几个使用ftp上传的例子但是没有实现,各方面总结加上自己的理解编写,最后使用sftp进行涉及,最后实现了文件的上传、下载、删除、解压缩以及文件夹的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,787
精华内容 1,914
关键字:

java通过sftp获取文件

java 订阅