美文网首页
FTP上传文件

FTP上传文件

作者: 程序员小杰 | 来源:发表于2020-09-13 13:18 被阅读0次

加入依赖

      <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>
        

代码

          private FTPClient ftpClient = null;
        
        /**
         * 初始化ftp服务器
         */
        public void initFtpClient(String host, int port, String username, String password) {
            ftpClient = new FTPClient();
            try {
                log.info("准备连接ftp服务器:【{}】:【{}】",host,port); 
               //连接ftp服务器
                ftpClient.connect(host, port); 
              //登录ftp服务器
                ftpClient.login(username, password); 
              //是否成功登录服务器
                int replyCode = ftpClient.getReplyCode(); 
                if(!FTPReply.isPositiveCompletion(replyCode)){
                    log.info("ftp服务器连接失败:【{}】:【{}】",host,port); 
                }
                log.info("ftp服务器连接成功:【{}】:【{}】",host,port); 
            }catch (MalformedURLException e) { 
               e.printStackTrace(); 
            }catch (IOException e) { 
               e.printStackTrace(); 
            } 
        }

        /**
        * 上传文件
        * @param host ip
        * @param port 端口
        * @param username 用户名
        * @param password 用户密码
        * @param pathname ftp服务保存地址
        * @param fileName 上传到ftp的文件名
        * @param originfilename 待上传文件的名称(绝对地址) * 
        * @return
        */
        public boolean uploadFile(String host, int port, String username, String password,String pathname, String fileName,File originfilename,boolean isDelete){
            boolean flag = false;
            InputStream inputStream = null;
            try{
                log.info("开始上传文件");
               // inputStream = originfilename.getInputStream();
                inputStream = new FileInputStream(originfilename);
                //登录ftp服务器
                initFtpClient(host, port, username, password);
                //这句话不加只能在服务器创建文件,但是大小始终是0
                ftpClient.enterLocalPassiveMode();
                //上传文件类型  二级制文件
                ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
                //创建文件夹 拼接上当前年月日时分秒
                String folder = DateUtil.format(new Date(), new SimpleDateFormat("yyyy-MM-dd"));
                String currentTime = DateUtil.format(new Date(), new SimpleDateFormat("yyyyMMddHHmmssSSS"));
                pathname =  pathname + "/" + folder + "/" + currentTime;
                createDirecroty(pathname);
                //切换目录
                ftpClient.changeWorkingDirectory(pathname);
                //把流持久化到硬盘上
                ftpClient.storeFile(new String(fileName.getBytes("GBK"),"ISO-8859-1"), inputStream);
                inputStream.close();
                ftpClient.logout();
                flag = true;
                log.info("上传文件成功");
            }catch (Exception e) {
                log.error("上传文件失败");
                e.printStackTrace();
            }finally{
                if(ftpClient.isConnected()){ 
                    try{
                        ftpClient.disconnect();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                } 
                if(null != inputStream){
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } 
                } 
            }
            return flag;
        }
        
        /**
         * 改变目录路径
         * @param directory
         * @return
         */
         public boolean changeWorkingDirectory(String directory) {
                boolean flag = true;
                try {
                    flag = ftpClient.changeWorkingDirectory(directory);
                    if (flag) {
                      log.info("进入文件夹:【{}】成功",directory);
                    } else {
                         log.info("进入文件夹:【{}】失败!开始创建文件夹",directory);
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
                return flag;
            }

        /**
         * 创建多层目录文件,如果ftp服务器已存在该文件,则不创建,如果无,则创建
         * @param remote
         * @return
         * @throws IOException
         */
        public boolean createDirecroty(String remote) throws IOException {
            boolean success = true;
            String directory = remote + "/";
            // 如果远程目录不存在,则递归创建远程服务器目录
            if (!changeWorkingDirectory(directory)) {
                int start = 0;
                int end = 0;
                if (directory.startsWith("/")) {
                    start = 1;
                } else {
                    start = 0;
                }
                end = directory.indexOf("/", start);
                String path = "";
                StringBuilder paths = new StringBuilder();
                while (true) {
                    String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "ISO-8859-1");
                    path = path + "/" + subDirectory;
                    if (!existFile(path)) {
                        if (makeDirectory(subDirectory)) {
                            changeWorkingDirectory(subDirectory);
                        } else {
                            log.info("创建目录【{}】",subDirectory);
                            changeWorkingDirectory(subDirectory);
                        }
                    } else {
                        changeWorkingDirectory(subDirectory);
                    }

                    paths.append("/").append(subDirectory);
                    start = end + 1;
                    end = directory.indexOf("/", start);
                    // 检查所有目录是否创建完毕
                    if (end <= start) {
                        break;
                    }
                }
            }
            return success;
        }

        /**
         * 判断ftp服务器文件是否存在    
         * @param path
         * @return
         * @throws IOException
         */
        public boolean existFile(String path) throws IOException {
                boolean flag = false;
                FTPFile[] ftpFileArr = ftpClient.listFiles(path);
                if (ftpFileArr.length > 0) {
                    flag = true;
                }
                return flag;
            }

        /**
         * 创建目录
         * @param dir
         * @return
         */
        public boolean makeDirectory(String dir) {
            boolean flag = true;
            try {
                flag = ftpClient.makeDirectory(dir);
                if (flag) {
                    log.info("创建文件夹:【{}】成功",dir);
                } else {
                    log.info("创建文件夹:【{}】失败",dir);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return flag;
        }

相关文章

网友评论

      本文标题:FTP上传文件

      本文链接:https://www.haomeiwen.com/subject/fxvnektx.html