向FTP服务器上传、下载和删除文件

1. 获取FTP连接

/**
     * 获取FTP连接
     *
     * @param hostname FTP IP地址
     * @param port FTP端口号
     * @param username FTP用户名
     * @param password FTP密码
     * @return
     */
    public static FTPClient getFTPClient(final String hostname, final int port, final String username,
            final String password) {

        log.info("get ftpClient hostname=" + hostname + ", port=" + port + ", username=" + username);
        FTPClient ftpClient = null;

        final FTPClientConfig config = new FTPClientConfig();
        config.setHost(hostname);
        config.setPort(port);
        config.setUsername(username);
        config.setPassword(password);
        config.setEncoding(ScanConstant.ENCODING_UTF_8);
        factory = new FTPClientFactory(config);

        try {
            pool = new FTPClientPool(factory);
            ftpClient = pool.borrowObject();
        } catch (final Exception e1) {
            log.error("FTP连接池异常", e1);
        }
        // 设置缓冲区
        ftpClient.setBufferSize(BUFFER_SIZE);//之前没有加这一项,总是获取失败

        try {
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
                // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
                LOCAL_CHARSET = "UTF-8";
            }
        } catch (final IOException e1) {
            throw new FtpException("Set sendCommand UTF8 failed.");
        }
        // 设置编码
        ftpClient.setControlEncoding(LOCAL_CHARSET);

        // 设置被动模式
        ftpClient.enterLocalPassiveMode();
        try {
            // 设置文件传输类型
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        } catch (final IOException e) {
            throw new FtpException("Fail to set file Type.");
        }
        try {

            ftpClient.setConnectTimeout(60000);
        } catch (final Exception e) {
            throw new FtpException("Set client timeout error.");
        }

        log.info("return ftpClient " + ftpClient);
        return ftpClient;
    }
2. 上传文件
public static boolean uploadFile(final String hostname, final int port, final String username,
            final String password, final String fileName, final String path, final InputStream in) {
//fileName:文件名称  path:文件所在目录  in:文件输入流
boolean success = false; final FTPClient ftpClient = getFTPClient(hostname, port, username, password); // 获取绝对路径 final String absPath = path; log.info("FTP 上传文件中。。。fileName=" + fileName); try { // 创建文件目录 createDirectory(ftpClient, absPath); // 更改目录 ftpClient.changeWorkingDirectory(absPath); success = ftpClient.storeFile(new String(fileName.getBytes("UTF-8"), "ISO-8859-1"), in); if (!success) { log.info("failed to upload file."); } } catch (final IOException e) { log.error("failed to upload file.", e); } finally { if (in != null) { try { in.close(); } catch (final IOException e) { log.error("failed to close inputStream.", e); } } if (ftpClient != null) { disconnec(ftpClient); } } log.info("FTP文件上传结束。"); return success; }

3. 下载文件

/**
     * @param hostname FTP IP
     * @param port FTP端口
     * @param username FTP用户名
     * @param password FTP 密码
     * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa/a.txt
     */
    public static boolean downloadFile(final String hostname, final int port, final String username,
            final String password, final String ftpPath, final HttpServletResponse response,
            final String scanFileName) {

        log.info("to download file from FTP: " + ftpPath);
        boolean downloaded = false;
        FTPClient ftpClient = null;
        OutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            response.reset();
            response.setCharacterEncoding(ScanConstant.ENCODING_UTF_8);
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(scanFileName, "UTF-8"));

            ftpClient = getFTPClient(hostname, port, username, password);

            downloaded = ftpClient.retrieveFile(
                    new String(ftpPath.getBytes("UTF-8"), "IOS-8859-1"), outputStream);

            outputStream.flush();
        } catch (final IOException e) {
            log.error("download file failed! ftpFile = " + ftpPath + "/" + ftpPath, e);
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (final IOException e) {
                    log.error("failed to close outputStream!", e);
                }
            }
            if (ftpClient != null) {
                disconnec(ftpClient);
            }
        }
        log.info("downloaded file from FTP!");
        return downloaded;
    }

4. 关闭连接

public static void disconnec(final FTPClient ftpClient) {

        log.info("断开ftp连接: " + ftpClient);

        try {
            ftpClient.logout();
        } catch (final IOException e) {
            log.error("ftp failed to log out from server.", e);
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (final IOException e) {
                    log.error("Failed to disconnect from server.", e);
                }
            }
        }
        log.info("ftp断开连接成功!");
    }

获取项目路径

System.getProperty("user.dir")

5. 判断文件是否存在

 /**
     * 检验指定路径的文件是否存在ftp服务器中
     * @param filePath--指定绝对路径的文件
     * @return
     */
    public static boolean isFTPFileExist(final String hostname, final int port, final String username,
									final String password, final String filePath) {
    	log.info("判断文件在ftp上是否存在!");
        boolean exists = false;
            final FTPClient ftpClient = FtpForSoftScan.getFTPClient(hostname, port, username, password);
            try {
                final FTPFile[] files = ftpClient.listFiles(new String(filePath.getBytes("UTF-8"), "ISO-8859-1"));
                if (files != null && files.length > 0) {
                    exists = true;
                }
            } catch (final IOException e) {
                log.error("failed to judge whether the file (" + filePath + ") is existed");
            }
        log.info("文件" + filePath + "在ftp上是否存在?" + exists);
        return exists;
    }

6. 删除文件

public static boolean deleteFile (final String hostname, final int port, final String username,
            						final String password, final String ftpPath) {
    	if (ftpPath != null && ftpPath != "") {
    		final FTPClient ftpClient = getFTPClient(hostname, port, username, password);
    		if (ftpPath.endsWith("/")) {
    			log.info("错误的文件路径");
    			return false;
    		}
    		try {  
    			final boolean exists = isFTPFileExist(hostname, port, username, password, ftpPath);
    			if (exists) {
    				ftpClient.deleteFile(new String(ftpPath.getBytes(ScanConstant.ENCODING_UTF_8), ScanConstant.SERVER_CHARSET_IOS));
    			} else {
    				log.info("文件" + ftpPath + "已经不存在");
    				return true;
    			}
    		} catch (IOException e) {
    			log.error("FTP上文件删除失败!", e);
    			return false;
    		}
    	} else {
    		log.info("没有需要删除的文件!");
    	}
        return true;
    }

猜你喜欢

转载自blog.csdn.net/u012843873/article/details/80580680