文章目录
概要
SFTP
(Secure File Transfer Protocol)是一种基于SSH(Secure Shell)协议的
安全文件传输协议
,它提供了在安全信道上进行数据传输的能力。相比传统的FTP(File Transfer Protocol),SFTP具有更高的安全性和更多的功能。
FTP SFTP区别
FTP和SFTP之间的一些主要区别:
特征FTPSFTP协议基于传统的FTP协议(File Transfer Protocol)基于SSH的安全文件传输协议(Secure File Transfer Protocol)安全性不安全,数据传输未加密安全,所有数据均经过SSH加密传输端口默认端口为21默认端口为22认证可以使用用户名和密码进行简单认证通过SSH密钥或用户名密码进行认证加密不支持加密所有数据传输都通过SSH加密保护目录访问控制依赖FTP服务器的权限和文件系统权限依赖SSH服务器的权限和文件系统权限使用场景用于需要简单文件传输,无需考虑安全性的场景用于需要安全文件传输和操作的场景适用性适用于内部网络和不涉及敏感信息的场景适用于需要加密和安全性要求较高的场景
封装一个工具类
importcom.jcraft.jsch.*;importjava.io.*;importjava.util.Properties;importjava.util.Vector;publicclassSftpUtil{publicstaticfinalStringNO_FILE="No such file";publicenumUploadStatus{Create_Directory_Fail,Create_Directory_Success,Upload_New_File_Success,Upload_New_File_Failed,File_Exits,Remote_Bigger_Local,Upload_From_Break_Success,Upload_From_Break_Failed,Delete_Remote_Faild;}privateChannelSftp sftp =null;privateSession sshSession =null;privateString username;privateString password;privateString host;privateint port;publicSftpUtil(String host,int port,String username,String password){this.username = username;this.password = password;this.host = host;this.port = port;}/**
* 连接到sftp服务器
*/publicChannelSftpconnect()throwsException{JSch jsch =newJSch();try{
jsch.getSession(username, host, port);
sshSession = jsch.getSession(username, host, port);
sshSession.setPassword(password);Properties properties =newProperties();
properties.put("StrictHostKeyChecking","no");
sshSession.setConfig(properties);
sshSession.connect();Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp =(ChannelSftp)channel;}catch(JSchException e){thrownewException("FtpUtil-->connect异常"+ e.getMessage());}return sftp;}/**
* 关闭连接
*/publicvoiddisconnect(){if(this.sftp !=null){if(this.sftp.isConnected()){this.sftp.disconnect();this.sftp =null;}}if(this.sshSession !=null){if(this.sshSession.isConnected()){this.sshSession.disconnect();this.sshSession =null;}}}/**
* 上传文件
* 用于将本地文件上传到指定的远程目录,并且使用给定的文件名。适用于将现有的本地文件上传到SFTP服务器的情况。
*
* @param directory 远程上传目录
* @param uploadFilePath 本地文件路径
* @param fileName 远程文件名
* @throws Exception 可能抛出的异常
*/publicvoiduploadFile(String directory,String uploadFilePath,String fileName)throwsException{FileInputStream in =null;connect();try{
sftp.cd(directory);}catch(SftpException e){try{
sftp.mkdir(directory);
sftp.cd(directory);}catch(SftpException e1){thrownewException("ftp创建文件路径失败,路径为"+ directory);}}File file =newFile(uploadFilePath);try{
in =newFileInputStream(file);
sftp.put(in, fileName);}catch(FileNotFoundException e){thrownewException("文件不存在-->"+ uploadFilePath);}catch(SftpException e){thrownewException("sftp异常-->"+ e.getMessage());}finally{if(in !=null){try{
in.close();}catch(IOException e){thrownewException("Close stream error."+ e.getMessage());}}disconnect();}}/**
* 上传文件
* 将文件从一个输入流上传到指定的远程路径和文件名。适用于需要从内存中的输入流直接上传文件的情况。
*
* @param filePath 远程文件路径
* @param filename 文件名
* @param in 输入流
* @return 上传状态
*/publicUploadStatusuploadFile(String filePath,String filename,InputStream in){try{
sftp.put(in, filePath + filename,ChannelSftp.OVERWRITE);}catch(SftpException e){
e.printStackTrace();}returnUploadStatus.Upload_From_Break_Success;}/**
* 获取文件列表
*
* @param filePath 远程文件路径
* @return 文件列表
*/publicVector<LsEntry>getFileList(String filePath){Vector<LsEntry> list =newVector<>();try{Vector veItem = sftp.ls(filePath);for(Object obj : veItem){if(obj instanceofLsEntry){
list.add((LsEntry)obj);}}}catch(SftpException e){
e.printStackTrace();}return list;}/**
* 下载文件
*
* @param directory 远程下载目录
* @param remoteFileName 远程文件名
* @param localFile 本地文件路径
* @return 下载的文件对象
* @throws Exception 可能抛出的异常
*/publicFiledownloadFile(String directory,String remoteFileName,String localFile)throwsException{connect();File file =null;OutputStream output =null;try{
file =newFile(localFile);if(file.exists()){
file.delete();}
file.createNewFile();
sftp.cd(directory);
output =newFileOutputStream(file);
sftp.get(remoteFileName, output);}catch(SftpException e){if(e.toString().equals(NO_FILE)){thrownewException("FtpUtil-->downloadFile--ftp下载文件失败"+ directory + remoteFileName +"不存在");}thrownewException("ftp目录或者文件异常,检查ftp目录和文件"+ e.toString());}catch(FileNotFoundException e){thrownewException("本地目录异常,请检查"+ file.getPath()+ e.getMessage());}catch(IOException e){thrownewException("创建本地文件失败"+ file.getPath()+ e.getMessage());}finally{if(output !=null){try{
output.close();}catch(IOException e){thrownewException("Close stream error."+ e.getMessage());}}disconnect();}return file;}}
解释代码:
connect()
函数:
- 创建
JSch
对象。 - 通过
getSession
方法获取会话,并设置用户名、主机、端口和密码。 - 创建属性对象,并将
StrictHostKeyChecking
设置为no
,然后应用到会话配置中。 - 连接会话。
- 打开
sftp
通道并进行连接。 - 将通道强转为
ChannelSftp
类型并赋值给sftp
。 - 最后返回
sftp
对象。
disconnect()
函数:
- 检查
sftp
对象是否不为空且已连接,如果是,则断开连接并将其置为null
。 - 检查
sshSession
对象是否不为空且已连接,如果是,则断开连接并将其置为null
。
public void uploadFile(String directory, String uploadFilePath, String fileName) throws Exception {}
方法:
- 调用
connect
方法建立连接。 - 尝试切换到指定的目录,如果目录不存在则创建目录后再切换。
- 读取要上传的文件,并通过
sftp.put
方法将文件上传。 - 处理可能出现的文件未找到、
SFTP
异常等情况。 - 在
finally
块中,若文件输入流不为空则关闭,并调用disconnect
方法断开连接。
downloadFile
函数:
- 调用
connect
方法建立连接。 - 创建本地文件,如果文件已存在则先删除再创建新文件。
- 切换到指定目录。
- 创建文件输出流。
- 通过
sftp.get
方法从远程获取文件并写入本地输出流。 - 处理可能出现的
SFTP
异常、文件未找到异常、本地目录异常、创建本地文件异常等情况。 - 在
finally
块中,若输出流不为空则关闭,并调用disconnect
方法断开连接。 - 最后返回下载的本地文件。
❤觉得有用的可以留个关注~❤
版权归原作者 hac1322 所有, 如有侵权,请联系我们删除。