jsch上传(基于sftp协议)

public class FtpFileUpload extends BaseController {
    private ChannelSftp sftp = null;
    private Session sshSession = null;
    private Channel channel = null;

    /**
     * 连接sftp服务器
     * @return
     */
    public boolean connectFtpServer(String ip) {
        try {
            JSch jsch = new JSch();
            sshSession = jsch.getSession(Const.USER, ip, Const.PORT);
            sshSession.setPassword(Const.PASSWORD);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp)channel;
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public Map<String, String> fileUpload(String pathName, HttpServletRequest request) {

        /**
         * 存放返回信息
         */
        Map<String,String> map = new HashMap<>();

        /**
         * 处理上传
         */

        if(!ServletFileUpload.isMultipartContent(request)) {
            map.put("error", "请选择要上传的文件!");
            return map;
        }

        if(!CommTool.checkStr(pathName)) {
            map.put("error", "文件目录名不可为空!");
            return map;
        }

        /**
         * 文件目录层次创建
         */
        String localPath = pathName + "/";
        if (!"temp".equals(pathName)) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            String ymd = format.format(new Date());
            localPath += ymd + "/";
        }

        /**
         * 最大文件大小
         */
        long maxSize = 1000000000;

        /**
         * 上传
         */
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("utf-8");
        List<?> items = null;
        try {
            //若上传的文件是多个的话,设置键的标志
            int flag = 1;

            items = upload.parseRequest(request);
            Iterator<?> iterator = items.iterator();
            while(iterator.hasNext()) {
                FileItem item = (FileItem) iterator.next();
                String fileName = item.getName();

                if(!item.isFormField()) {
                    //文件大小检查
                    if(item.getSize() > maxSize) {
                        map.put("errorInfo", "上传文件大小超过限制!");
                        return map;
                    }
                    /*
                     * 检查扩展名
                     */
                    String fileExt = fileName.substring(fileName.lastIndexOf(".")+1).toLowerCase();

                    //将工作空间转移到相应的目录下
                    String[] folders = localPath.split("/");
                    for(String folder:folders) {
                        if(folder.length() > 0) {
                            try {
                                sftp.cd(folder);
                            } catch(SftpException e) {
                                try {
                                    sftp.mkdir(folder);
                                    sftp.cd(folder);
                                } catch (SftpException e1) {
                                    map.put("errorInfo", "服务器端文件夹操作错误");
                                    return map;
                                }
                            }
                        }
                    }

                    //重新设置文件名称
                    String newFileName = YMDTools.currentTimestamp() + "." + fileExt;
                    //进行文件上传
                    try {
                        sftp.put(item.getInputStream(), newFileName);

                        //读取Excel时返回的地址
                        String resultPath = Const.BASE_PATH + localPath + newFileName;
                        map.put("eUrl"+flag, resultPath);

                        flag++;
                    } catch (Exception e1) {
                        e1.printStackTrace();
                        map.put("errorInfo", "写文件错误");
                    }
                    //文件上传完毕,工作目录回调,以便其他文件上传
                    for(int i=0; i<folders.length-1; i++) {
                        try {
                            sftp.cd("..");
                        } catch (SftpException e) {
                            map.put("errorInfo", "文件夹回调发生错误");
                            return map;
                        }
                    }
                }
            }
        } catch (FileUploadException e) {
            map.put("errorInfo", "接收文件异常!");
            return map;
        } finally {
            releaseResource();
        }

        return map;
    }

    /**
     * 释放资源
     * @param sftp
     * @param sshSession
     * @param channel
     */
    public void releaseResource() {
        if (channel != null) {
            channel.disconnect();
        }
        if (sshSession != null) {
            sshSession.disconnect();
        }
        if (sftp != null) {
            sftp.disconnect();
        }
    }

    /**
     * 删除文件
     * @param directory
     * @throws Exception
     */
    public void delete(String directory) {
        int index = directory.lastIndexOf("/");
        String dir = directory.substring(0, index);
        String deleteFile = directory.substring(index + 1);
        System.out.println("dir  "+dir);
        System.out.println("deleteFile   "+ deleteFile);
        try {
            sftp.cd(dir);
            sftp.rm(deleteFile);
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }
}
时间: 2024-11-01 20:52:28

jsch上传(基于sftp协议)的相关文章

Android Http POST文件上传之-----RFC1867协议

RFC1867协议介绍 RFC1867协议主要是在HTTP协议的基础上为INPUT标签添加了file属性.同一时候限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data. 其他属性标签, <INPUT TYPE=file>标记能够有一个VALUE属性来指定默认的文件名 ,能够用"SIZE=宽,高"来指定SIZE属性 . multipart/form-data multipart/form-data的媒体内容遵从RFC 1521

linus jsch上传文件

package com.osplat.util; import java.io.*; import com.jcraft.jsch.*;import com.osplat.bean.Resultmodel;import org.springframework.web.multipart.MultipartFile; /** * @Company:wftdlx * @Author: wjf * @Description: linus 文件上传 * @Date: Created in 10:33 2

socket 上传 -- 异常处理--UDP协议 --自定义socket #29

1.异常处理 1 '''''' 2 """ 3 异常处理 4 """ 5 """ 6 1.什么是异常? 7 程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,就会以异常的形式表现出来 8 造成的影响就是整个程序无法再正常运行 9 """ 10 """ 11 2.异常的结构:类型+信息+位置 12 1.异常的类型:NAMEERROR 13 2

tus-一个可续传文件上传的开放协议(1)

tus tus是一个可续穿文件上传协议,它以Http协议为载体,统一了一个文件断点续传的标准. 这篇文章翻译自https://tus.io/ 目前该协议版本信息如下: Version: 1.0.0 (SemVer) Date: 2016-03-25 Authors: Felix Geisendörfer, Kevin van Zonneveld, Tim Koschützki, Naren Venkataraman, Marius Kleidl Collaborators: Bruno de C

文件上传--基于Spring MVC框架+SmartUpload

这篇文章是介绍文件上传的,由于在spring MVC上实现起来和直接在servlet中写有些不同,所以特地写了一下这篇文章,关于不同点,大家可以先阅读一下上一篇文章.好了,下面直接上代码. jab包是jspSmartUpload.jar,如果有类似的jar包如:commons-fileupload-1.2.2,留一个即可,否则会冲突报错 首先是一个简单的页面(jsp),比较丑,但能用: <%@ page language="java" contentType="text

java web文件上传 基于commons-fileupload-1.3.1.jar

上传文件的方法有很多种,我现在做的项目是使用Apache的fileupload. 首先我们需要commons-fileupload-1.3.1.jar的包. maven在pom.xml导入,普通web项目放在WEB-INF的lib目录下 然后 commons-fileupload.jar 依赖于commons-io.jar,所以同理加入commons-fileupload.jar 下面是代码. 用的是spring mvc,功能在controller里实现 重新写了一遍注释,代码应该能看的很清楚了

xml文件加密上传和sftp下载解密基本思路

AES对称加密效率高,对大文件加密适合.RSA非对称加密效率低,更安全,对小文件加密适合. 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml.md5摘要 /n aeskey)RSA公钥加密 解密:1.(xml)aes加密 (xml.md5摘要 /n aeskey)RSA私钥加密 2.(xml)aes加密 (xml.md5摘要 /n aeskey) 3.(xml)aeskey解密 xml.md5摘要 4.xml xml.md5摘要 5.x

Java中使用jcraft进行SFTP的上传下载

如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉.ssh是一个安全协议,用来在不同系统或者服务 器之间进行安全连接.ssh 在连接和传送的过程中会加密所有的数据.具体的解释,大家可以参考百度百科的文 档.地址为:http://baike.baidu.com/view/16184.htm 但是SSH一般是基于客户端的或者Linux命令行的.比如客户端的工具:OpenSSH,putty,SSH Tectia:在linux上大家可以通过ssh [email protected]

java通过sftp上传文件

转载:http://blog.csdn.net/yhl_jxy/article/details/72633034 Linux操作系统我们经常使用ssh中的ftp,sftp连接服务器,做相应操作. 如何通过java代码的形式采用sftp连接到服务器,进行文件上传下载等操作呢? 第一步,引入依赖包 [html] view plain copy <!-- sftp上传依赖包 --> <dependency> <groupId>com.jcraft</groupId>