Java实现FTP文件上传下载及文件转byte数组(接口调用方式)

Java接口实现对远端FTP服务器上传和下载

依赖Apache FTPClient

1. FtpUtil工具类

包含1.获取FTPClient对象的方法 2.对ftp服务器上传和下载文件的方法


import java.io.*;
import java.net.SocketException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class FtpUtil {
    private final static Log logger = LogFactory.getLog(FtpUtil.class);

    /**
     * 获取FTPClient对象
     * @param ftpHost       FTP主机服务器
     * @param ftpPassword   FTP 登录密码
     * @param ftpUserName   FTP登录用户名
     * @param ftpPort       FTP端口 默认为21
     * @return
     */
    public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient = new FTPClient();

            // 连接FTP服务器
            ftpClient.connect(ftpHost, ftpPort);
            // 登陆FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);
            // 中文支持
            ftpClient.setControlEncoding("UTF-8");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                logger.info("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");
            }
        } catch (SocketException e) {
            e.printStackTrace();
            logger.info("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("FTP的端口错误,请正确配置。");
        }
        return ftpClient;
    }

    /**
     * 从FTP服务器下载文件
     * @param ftpHost             FTP IP地址
     * @param ftpUserName         FTP 用户名
     * @param ftpPassword         FTP用户名密码
     * @param ftpPort             FTP端口
     * @param ftpPath             FTP服务器中文件所在路径 格式: ftptest/aa
     * @param localPath           下载到本地的位置 格式:H:/download
     * @param fileName            FTP服务器上要下载的文件名称
     * @param targetFileName      下载到本地的文件名称
     */
    public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName, String targetFileName) {

        FTPClient ftpClient = null;
        try {
            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
            ftpClient.changeWorkingDirectory(ftpPath);
            System.out.println("连接成功,改变目录中...");
            ftpClient.makeDirectory("summer");

            //编码文件格式,解决中文文件名
            String f_ame = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);

            File localFile = new File(localPath + File.separatorChar + targetFileName);
            OutputStream os = new FileOutputStream(localFile);
            ftpClient.retrieveFile(f_ame, os);
            os.close();
            ftpClient.logout();

        } catch (FileNotFoundException e) {
            logger.error("没有找到" + ftpPath + "文件");
            e.printStackTrace();
        } catch (SocketException e) {
            logger.error("连接FTP失败.");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

            logger.error("文件读取错误。");
            e.printStackTrace();
        }
    }
    /**
     * 根据名称获取文件,以字节数组返回
     *
     * @param ftpPath FTP服务器文件相对路径,例如:test/123
     * @param fileName 文件名,例如:test.xls
     * @return byte[] 字节数组对象
     */
    public static byte[] getFileBytesByName(String ftpPath, String fileName) {
        // 登录
        FTPClient ftpClient = null;
        //创建byte数组输出流
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        try {
            //获取FTPClient
            ftpClient = getFTPClient();

            ftpClient.changeWorkingDirectory(ftpPath);

            //创建文件夹
            ftpClient.makeDirectory("summer");

            // 设置被动模式,开通一个端口来传输数据
            ftpClient.enterLocalPassiveMode();
            String[] fs = ftpClient.listNames();
            // 判断该目录下是否有文件
            if (fs == null || fs.length == 0) {
                logger.error(ftpPath + "该目录下没有文件");
                return byteStream.toByteArray();
            }

            for (String ff : fs) {
                String ftpName = new String(ff.getBytes("ISO-8859-1"), "GBK");
                if (ftpName.equals(fileName)) {
                    try (InputStream is = ftpClient.retrieveFileStream(ff);) {
                        byte[] buffer = new byte[1024 * 1024 * 4];
                        int len = -1;
                        while ((len = is.read(buffer, 0, 1024 * 1024 * 4)) != -1) {
                            byteStream.write(buffer, 0, len);
                        }
                    } catch (Exception e) {
                        logger.error(e.getMessage(), e);
                    }
                    break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return byteStream.toByteArray();
    }

    /**
     * Description:             向FTP服务器上传文件
     * @param ftpHost              FTP服务器hostname
     * @param ftpPort              FTP服务器端口
     * @param ftpUserName          FTP登录账号
     * @param ftpPassword          FTP登录密码
     * @param ftpPath          FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
     * @param filename          上传到FTP服务器上的文件名
     * @param input             输入流
     * @return                  成功返回true,否则返回false
     */
    public static boolean uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftpClient = new FTPClient();
        try {
            int reply;
            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
            ftpClient.changeWorkingDirectory(ftpPath);

            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                return result;
            }
            //编码文件名,支持中文文件名
            filename = new String(filename.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
            //上传文件
            if (!ftpClient.storeFile(filename, input)) {
                return result;
            }
            input.close();
            ftpClient.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }
}

2. 接口调用

这里仅展示下载

import io.choerodon.core.iam.ResourceLevel;
import io.choerodon.swagger.annotation.Permission;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.hbcm.sap.config.SwaggerTags;
import org.hbcm.sap.infra.util.FtpUtil;
import org.hzero.core.base.BaseController;
import org.hzero.core.util.Results;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: hbcm-sap
 * @description: ftp
 * @author: Summer
 * @create: 2019-10-24 17:43
 **/

@Api(tags = SwaggerTags.TEST)
@RestController("ftpController.v1")
@RequestMapping("/v1/{organizationId}/ftp")
public class FtpController extends BaseController {


    @ApiOperation(value = "获取文件")
    @Permission(level = ResourceLevel.ORGANIZATION)
    @GetMapping
    /**
	*返回值类型自行设置,ResponseEntity是我司封装返回类型,可改为void及其他
	*/
    public ResponseEntity<String> uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName, String targetFileName){
        FtpUtil.downloadFtpFile(ftpHost,ftpUserName,ftpPassword,ftpPort,ftpPath,localPath,fileName,targetFileName);

        return Results.success();
    }

}

3. swagger测试

在这里插入图片描述
各参数在方法描述里已做说明,此处不做赘述

执行结果:
在这里插入图片描述

4. 至此,FTP工具类测试完毕,可通过接口调用.

有问题可在评论区与博主互动,共同学习共同进步.
干,就完事了嗷!

引用: https://blog.csdn.net/xqq580231/article/details/80046411

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值