`
huttoncs
  • 浏览: 200901 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 通过sftp服务器上传下载删除文件

    博客分类:
  • 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包


分享到:
评论
1 楼 ibad_boys 2015-09-11  
实践证明,可用!

相关推荐

    JAVA SFTP文件上传、下载及批量下载实例

    2. get():文件下载 3. cd():进入指定目录 4. ls():得到指定目录下的文件列表 5. rename():重命名指定文件或目录 6. rm():删除指定文件 7. mkdir():创建目录 8. rmdir():删除目录 在使用JSch库时,我们需要...

    JAVA实现SFTP上传,下载,删除等方法

    首先,我们需要创建一个`JSch`实例,并通过`Session`对象建立与SFTP服务器的连接。这通常涉及到设置主机名、端口号、用户名和密码。 ```java JSch jsch = new JSch(); Session session = jsch.getSession(...

    java通过sftp模式实现FTP的文件上传下载删除功能

    本篇文章将详细探讨如何使用Java通过SFTP模式实现FTP的文件上传、下载和删除功能。 一、SFTP简介 SFTP与传统的FTP不同,FTP在明文传输数据,存在安全隐患,而SFTP则利用SSH提供的加密机制,确保数据在传输过程中的...

    java上传文件到linux服务器,操作linux服务器上文件,下载linux服务器文件,删除linux服务器文件

    该方法会将服务器上的文件下载到本地。 ```java sftp.get(远程文件路径, 本地保存路径); ``` **删除Linux服务器文件** 删除文件可以使用`rm()`或`rmdir()`方法。前者用于删除单个文件,后者用于删除目录(如果...

    使用Java向服务器上传文件压缩包并实现解压缩

    JSch是一个纯Java实现的SSH2库,它允许用户连接到SFTP服务器,进行文件传输、创建目录、删除文件等操作。首先,我们需要在项目中引入JSch库,然后创建一个`Session`对象,设置用户名、密码或密钥对,并连接到SFTP...

    java操作sftp上传下载

    本文将详细讲解如何使用Java实现SFTP的上传、下载以及相关的批量操作、远程目录创建和文件删除功能。 首先,我们需要一个支持SFTP的Java库,例如JSch(Java Secure Channel)。JSch是一个开放源码的Java库,它实现...

    JSch - Java实现的SFTP(文件上传详解篇)

    JSch 实现 SFTP 核心类,它包含了所有 SFTP 的方法,如:put():文件上传、get():文件下载、cd():进入指定目录、ls():得到指定目录下的文件列表、rename():重命名指定文件或目录、rm():删除指定文件、mkdir():...

    java 监听本地文件自动上传服务器

    通过这些Java技术,你可以构建一个本地文件系统与远程服务器之间的实时同步系统,从而满足文件自动上传的需求。这只是一个基础实现,根据具体业务场景,你可能需要对代码进行适当的调整和扩展。

    Sftp文件上传demo

    SFTP通过SSH连接建立一个安全通道,用于执行文件管理操作,如上传、下载、重命名和删除文件。与FTP(File Transfer Protocol)不同,FTP在明文中传输数据,容易遭受中间人攻击,而SFTP则提供了端到端的安全性。 要...

    java操作sftp的工具类(JSch)

    Java操作SFTP(Secure File Transfer ...总之,JSch库为Java开发者提供了一个强大的工具,使得与SFTP服务器交互变得简单而直观。结合`SftpUtil`工具类,可以方便地集成SFTP操作到Java应用程序中,实现文件的安全传输。

    Java版Linux文件上传下载、windows本地文件上传下载

    对于文件下载,HTML中可以创建一个链接,指向服务器上的文件,当用户点击链接时,浏览器会发起GET请求下载文件。服务器端应提供一个HTTP响应,设置正确的Content-Type和Content-Disposition头,以指示浏览器以下载...

    java实现ftp、sftp的文件上传和下载

    这篇内容将详细介绍如何使用Java实现FTP和SFTP的文件上传与下载,并涉及相关的Apache库。 FTP是一种基于TCP的服务,主要用于在互联网上进行文件传输。Java中可以使用Apache Commons Net库来实现FTP操作。首先,需要...

    java SFTP上传所需jar和秘钥工具

    4. **建立SFTP会话**: 通过SSH连接创建SFTP会话,然后可以进行文件的上传、下载、重命名、删除等操作。 5. **文件上传**: 使用SFTP会话的`put()`方法,指定本地文件路径和远程目标路径,执行文件上传。 6. **关闭...

    Java文件传输工具(SFTP、FTP、HTTP上传下载)

    JSch是一个纯Java实现的SSH2库,它提供了SFTP的接口,可以用来连接到SFTP服务器,进行文件的上传和下载,同时也支持文件权限的修改和目录的操作。 HTTP文件传输通常涉及Web服务器,Java可以通过HttpURLConnection或...

    基于sshd构建sftp服务器

    总结来说,基于sshd构建的SFTP服务器是一种强大的工具,它提供了安全的文件传输和远程命令执行能力。通过定制化配置和扩展,可以满足各种业务需求。在实际应用中,务必注意安全配置,以确保系统的稳定性和数据的安全...

    用java写的SFTP代码源码下载

    在连接建立后,我们可以通过ChannelSftp对象进行文件上传、下载、列表查看等操作。例如,以下代码展示了如何从本地上传文件到远程服务器: ```java public void uploadFile(ChannelSftp sftpChannel, String ...

    java 读取FTP服务器文件

    这个库提供了丰富的FTP功能,包括连接、上传、下载和管理FTP服务器上的文件。 2. **添加依赖**: 在Maven项目中,可以在`pom.xml`文件中添加以下依赖: ```xml &lt;groupId&gt;commons-net&lt;/groupId&gt; &lt;artifactId&gt;...

    基于Java的实例源码-用Java写的SFTP代码.zip

    5. **文件操作**:SFTP会话对象是一个`ChannelSftp`实例,提供了丰富的API进行文件操作,如`cd`改变目录,`ls`列出目录,`put`上传文件,`get`下载文件,`rm`删除文件,`mkdir`创建目录,`chmod`改变文件权限等。...

    FTP与SFTP文件上传Demo

    FtpDemo可能包含了一个或多个程序,这些程序演示了如何使用编程语言(如Java、Python、C#等)连接到FTP或SFTP服务器,并执行文件上传操作。这些示例可能涵盖了以下知识点: 1. FTP连接:创建FTPClient对象,设置...

    下载服务器文件到本地,并删除已下载的服务器文件

    在IT行业中,下载服务器文件到本地以及在下载后删除服务器上的源文件是一项常见的操作,尤其在数据迁移、备份或更新场景下。以下是一些相关的知识点: 1. **FTP(File Transfer Protocol)**:FTP是最传统的文件...

Global site tag (gtag.js) - Google Analytics