0
点赞
收藏
分享

微信扫一扫

FTP文件上传

才德的女子 2022-04-02 阅读 260
java

添加依赖

<!--FTP包-->
		<dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
			<version>3.5</version>
		</dependency>

书写代码

package com.yqjr.treasury.plan.busi.utils;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;

import javax.swing.*;
import java.io.*;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 86138
 */
public class FtpStaticUtils {

    private static String ftpHost = "";  //ip
    private static int port =21;  //默认端口号21
    private static String userName = "root";   //登录名
    private static String passWord = "";   //密码
    private static String ftpEncode = "GBK";
    private static int defaultTimeout =3000;


    /**
     * ftp上传文件
     * @throws IOException
     * @throws SocketException
     */
    public static boolean uploadFile(String path,  //上传ftp的路径
                                  InputStream is,    //用流读取文件
                                  String fileNewName   //文件名
     ) throws SocketException, IOException {

        boolean flag = true;
        //is = new FileInputStream(localFile);
        // 保存至Ftp
        FTPClient ftpClient = createFtpClient();// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
        ftpClient.setBufferSize(1024 * 1024);// 设置缓存区,默认缓冲区大小是1024,也就是1K
        List<String> list = getPathList(path);
        for(int i=0; i<list.size(); i++){
            if(!ftpClient.changeWorkingDirectory(list.get(i))){//若路径未存在则创建路径
                if(!ftpClient.makeDirectory(list.get(i))){//若路径创建失败则不再继续处理
                    System.out.println("create dir fail --> " + list.get(i));
                    //close(ftpClient);
                }
            }
        }
        // 上传至Ftp
        ftpClient.changeWorkingDirectory(path);
        flag = ftpClient.storeFile(fileNewName, is);
        is.close();
        // 关闭连接
        ftpClient.logout();
        ftpClient.disconnect();

        return flag;
    }

    //分割路径
    private static List<String> getPathList(String path){
        String[] dirs = path.split("/");
        List<String> list = new ArrayList<>();
        String pathname = "";
        for(String str : dirs){
            if(StringUtils.isEmpty(str)){
                continue;
            }
            pathname = pathname + "/" + str;
            list.add(pathname);
        }
        return list;
    }

    /**
     * 创建ftp链接
     * @throws IOException
     * @throws SocketException
     */
    public static FTPClient createFtpClient() throws SocketException, IOException {
        FTPClient ftpClient = new FTPClient();// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
        ftpClient.setControlEncoding(ftpEncode); // 中文支持

        ftpClient.connect(ftpHost);
        ftpClient.login(userName, passWord);// userName、passWord分别为FTP服务器的登陆用户名和密码
        ftpClient.setDefaultPort(port);
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
        ftpClient.enterLocalPassiveMode(); // 用被动模式传输,解决linux服务长时间等待,导致超时问题
        ftpClient.setDefaultTimeout(defaultTimeout);// 设置默认超时时间
        return ftpClient;
    }

    /**
     * 关闭ftp
     */
    public static void closeFtpClient(FTPClient ftpClient) throws IOException{
        ftpClient.logout();
        ftpClient.disconnect();
    }

    /**
     * 创建文件夹
     */
    public static boolean addFoder(String path, String foderName) throws SocketException, IOException {
        boolean flag = true;
        // 保存至Ftp
        FTPClient ftpClient = createFtpClient();// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。

        // 切换目录,目录不存在创建目录
        //ftpClient.changeWorkingDirectory(path);
        flag = ftpClient.makeDirectory(path + "/" +foderName);
        // 关闭连接
        closeFtpClient(ftpClient);

        return flag;
    }


}

注意事项

1. 创建连接
ftpClient.connect(hostname, port);
2. 检查上传的工作目录是否存在--不存在并创建
ftpClient.changeWorkingDirectory(workingPath)
3. 上传文件
ftpClient.storeFile(saveName, fileInputStream)
4. 断开连接
ftpClient.disconnect()

建议: 

在SpringBoot项目中不要像我这种傻子写静态的工具类  可以通过

@Component
@ConfigurationProperties(prefix = "ftp")

这两个注解写一个配置类   通过注入的方式调用 ,端口什么的值可以在配置文件中配置,方便修改,不说了,给去改代码了.

举报

相关推荐

0 条评论