通过FTP实现文件的上传、重命名、移动文件

Maven依赖引用:
<!-- httpclient begin -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.6</version>
</dependency>

<!-- ftp begin -->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.5</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.9.RELEASE</version>
    <scope>compile</scope>
</dependency>
=================================================================================================

package com.common.util;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Description ftp文件上传工具类
 * @Author FangYN
 * @Date 2019/12/25
 **/
public class FtpFileUtil {

    public static void main(String[] args) throws IOException {
        String host = "127.0.0.1";
        int port = 30;// 所在服务器FTP的端口(默认21,可配置)
        String username = "admin";
        String password = "admin";
        String savePath = "/uploads/";
        String filePath = "image";
        String newFileName = UUIDUtils.getUUID()+".jpg";
        System.out.println("文件名:"+newFileName);
        File pdfFile = new File("C:\\Users\\ww\\Pictures\\Saved Pictures\\1111.jpg");
        FileInputStream fileInputStream = new FileInputStream(pdfFile);
        MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),
                ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
        Boolean resultBoolean = FtpFileUtil.uploadFile(host, port, username, password, savePath, filePath, newFileName, multipartFile.getInputStream());
        System.out.println(resultBoolean);
        // System.out.println("访问地址:http://"+host+":90/uploads"+savePath+"/"+filePath+"/"+newFileName);
    }

    /**
     * 上传文件
     * @param host ftp的ip
     * @param port ftp的端口
     * @param username
     * @param password
     * @param projectPath 保存路径的路径(以项目名为主)
     * @param filePath 文件夹名称
     * @param fileName 保存的文件名
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    public static Boolean uploadFile(String host, int port, String username, String password,
                                     String projectPath, String filePath, String fileName, InputStream inputStream) throws IOException {
        //1、创建FTPClient对象(对于连接ftp服务器,以及上传和上传都必须要用到一个对象)
        FTPClient ftp = getConnect(host, port, username, password);
        if (ftp == null) return false;
        try{
            // 2、changWorkingDirectory(linux上的文件夹):检测所传入的目录是否存在,如果存在返回true,否则返回false
            // basePath+filePath-->/uploads/601159
            String path = projectPath+filePath;
            if(!ftp.changeWorkingDirectory(path)) createDir(path, ftp);
            // 3.把文件转换为二进制字符流的形式进行上传
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            // 4、这才是真正上传方法storeFile(filename,input),返回Boolean雷类型,上传成功返回true
            if (!ftp.storeFile(fileName, inputStream)) return false;
            // 5.关闭输入流
            inputStream.close();
            // 6.退出ftp
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
            throw new IOException(e);
        } finally {
            closeFtp(ftp);
        }
        return true;
    }

    /**
     * 重命名/移动 文件
     * @param host
     * @param port
     * @param username
     * @param password
     * @param oldPath 原有文件路径及文件名
     * @param projectPath 项目名路径
     * @param newPath 文件新路径 不含文件名 文件夹不变动时,传null值  移动文件时必传
     * @param newFileName 新的文件名字,必传
     * @return
     * @throws IOException
     */
    public static Boolean renameFile(String host, int port, String username, String password,
                                     String oldPath, String projectPath, String newPath, String newFileName) throws IOException {
        //1、创建FTPClient对象(对于连接ftp服务器,以及上传和上传都必须要用到一个对象)
        FTPClient ftp = getConnect(host, port, username, password);
        if (ftp == null || StringUtils.isEmpty(oldPath)) return false;
        String path = "";
        try{
            // 2.判断文件名是否修改 思路:先根据旧的文件路径更改文件名后,再判断修改路径
            String oldFileName = oldPath.substring(oldPath.lastIndexOf(File.separator)+1);
            if (!oldFileName.equals(newFileName)) {// 更改文件名
                path = oldPath.substring(0, oldPath.lastIndexOf(File.separator));
                ftp.changeWorkingDirectory(path);//将目录切换至指定路径
                path = path+"/"+newFileName;
                ftp.rename(oldPath, path);
            }
            // 3.判断修改保存的文件夹--即移动文件
            if (!StringUtils.isEmpty(newPath)) {// 更改路径
                if (StringUtils.isEmpty(path)) path = oldPath;
                ftp.enterLocalPassiveMode();
                ftp.setFileType(FTP.BINARY_FILE_TYPE);
                InputStream inputStream = ftp.retrieveFileStream(new String(path.getBytes("UTF-8"), "ISO-8859-1"));
                uploadFile(host, port, username, password, projectPath, newPath, newFileName, inputStream);
                ftp.deleteFile(path);
            }
            // 4.退出ftp
            ftp.logout();
        } catch (IOException e) {
            e.printStackTrace();
            throw new IOException(e);
        } finally {
            closeFtp(ftp);
        }
        return true;
    }

    /**
     * 请求连接Ftp
     * @param host
     * @param port
     * @param username
     * @param password
     * @return
     * @throws IOException
     */
    private static FTPClient getConnect(String host, int port, String username, String password) throws IOException {
        FTPClient ftp = new FTPClient();
        //1、定义返回的状态码
        int reply;
        try {
            //2、连接ftp(当前项目所部署的服务器和ftp服务器之间可以相互通讯,表示连接成功)
            ftp.connect(host, port);
            //3、输入账号和密码进行登录
            ftp.login(username, password);
            //4、接受状态码(如果成功,返回230,如果失败返回503)
            reply=ftp.getReplyCode();
            //5、根据状态码检测ftp的连接,调用isPositiveCompletion(reply)-->如果连接成功返回true,否则返回false
            if(!FTPReply.isPositiveCompletion(reply)){
                ftp.disconnect();//说明连接失败,需要断开连接
                return null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ftp;
    }

    /**
     * 关闭ftp连接
     * @param ftp
     */
    private static void closeFtp(FTPClient ftp) {
        try {
            if (ftp != null && ftp.isConnected())
                ftp.disconnect();// 断开ftp的连接
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    /**
     * 创建目录(有则切换目录,没有则创建目录)
     * @param dir
     * @return
     */
    private static boolean createDir(String dir, FTPClient ftp) {
        if (StringUtils.isBlank(dir))
            return true;
        String d;
        try {
            //目录编码,解决中文路径问题
            d = new String(dir.toString().getBytes("GBK"),"iso-8859-1");
            //尝试切入目录
            if(ftp.changeWorkingDirectory(d))
                return true;
            String[] arr = dir.split("/");
            StringBuffer sbfDir=new StringBuffer();
            //循环生成子目录
            for(String s : arr){
                sbfDir.append("/");
                sbfDir.append(s);
                //目录编码,解决中文路径问题
                d = new String(sbfDir.toString().getBytes("GBK"),"iso-8859-1");
                //尝试切入目录
                if(ftp.changeWorkingDirectory(d))
                    continue;
                if(!ftp.makeDirectory(d)){
                    System.out.println("[失败]ftp创建目录:"+sbfDir.toString());
                    return false;
                }
                System.out.println("[成功]创建ftp目录:"+sbfDir.toString());
            }
            //将目录切换至指定路径
            return ftp.changeWorkingDirectory(d);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Slyar FTPServer是一个功能强大的FTP服务器软件,它提供了多种上传文件的方法。 首先,你需要在Slyar FTPServer的设置中配置FTP账户和权限。登录到Slyar FTPServer的管理界面,选择“用户”或“账户”选项,创建一个账号并设置相应的权限,确保账户具有文件上传的权限。 然后,你可以使用FTP客户端软件连接到Slyar FTPServer。打开FTP客户端,输入Slyar FTPServer的IP地址和端口号,以及你之前创建的账户和密码,点击连接。 连接成功后,你可以在FTP客户端的本地文件夹中选择要上传文件。在FTP客户端界面上一般有一个“上传”或“上传文件”的按钮,点击它。 接下来,你需要指定要将文件上传到Slyar FTPServer的路径。这可以是Slyar FTPServer的根目录,或者是某个特定的文件夹。在FTP客户端界面上,你可以浏览到你想要上传文件的目录,在目录上右键点击并选择“上传”或“将文件上传到此处”。 上传文件可能需要一些时间,具体时间取决于文件大小和网络连接状况。一旦文件上传完成,你将在FTP客户端上收到上传成功的提示。 需要注意的是,上传文件之前,你可能需要对Slyar FTPServer进行相应的配置,例如设置最大上传文件大小限制或者设置文件上传速度限制,以保证服务器的安全和稳定运行。 总之,Slyar FTPServer可以通过FTP客户端软件来上传文件。连接到Slyar FTPServer,选择要上传文件,指定上传目录,等待上传完成即可。 ### 回答2: Slyar FTP Server 是一种用于建立和管理 FTP 服务器的工具。要上传文件到 Slyar FTP Server,可以按照以下步骤进行操作: 1. 首先打开 Slyar FTP Server。确保服务器已经启动并正常运行。 2. 在客户端中,打开一个支持 FTP 协议的应用程序,例如 FileZilla 或者 Windows 资源管理器。 3. 在 FTP 客户端中,输入 Slyar FTP Server 的 IP 地址和端口号。如果是在本地使用,可以输入“localhost”作为 IP 地址。默认的 FTP 端口号为 21,可以根据需要进行调整。 4. 输入用户名和密码,以登录到 Slyar FTP Server。确保提供的用户名和密码与 Slyar FTP Server 配置文件中设置的相匹配。 5. 成功登录后,FTP 客户端将会显示 Slyar FTP Server 上的服务器文件列表。可以在本地电脑的文件夹中找到要上传文件。 6. 在 FTP 客户端中,浏览到要上传文件的目标文件夹。可以使用 FTP 客户端提供的导航工具,导航到正确的目标文件夹。 7. 在 FTP 客户端中,选择要上传文件。这可以通过单击文件名或者使用鼠标拖放的方式来完成。 8. 在选中要上传文件后,可以通过右键单击并选择 "Upload" 或者 "Send" 来将文件上传到 Slyar FTP Server。 9. 上传的进度将显示在 FTP 客户端的界面上,可以根据文件大小和网络速度来估计上传的时间。 10. 完成后,可以在 Slyar FTP Server 上的目标文件夹中找到已经上传文件。 通过上述步骤,就可以使用 Slyar FTP Server 成功上传文件。请注意,确保服务器的设置和连接正确,以及提供正确的登录凭据,都是成功上传文件的关键。 ### 回答3: Slyar FTP服务器是一款免费的FTP服务器软件,用于在计算机之间进行文件传输。以下是使用Slyar FTP服务器上传文件的步骤: 1. 首先,您需要下载并安装Slyar FTP服务器软件,并进行必要的配置。在配置文件中,您可以设置FTP服务器的监听IP地址、端口号以及允许访问的用户等信息。 2. 运行Slyar FTP服务器,并确保FTP服务器处于运行状态。您可以在任务管理器或者系统托盘中查看Slyar FTP服务器的运行状态。 3. 启动一个支持FTP协议的客户端软件,例如FileZilla、CuteFTP等,并连接到Slyar FTP服务器。在客户端软件中,需要输入正确的服务器IP地址、端口号、用户名和密码等登录信息。 4. 成功连接到Slyar FTP服务器后,您可以在客户端软件的界面中看到服务器上的文件文件夹列表。在本地文件夹中,选择您要上传文件。 5. 在客户端软件中,找到上传文件的功能按钮或选项,并点击上传文件。根据客户端软件的不同,可能需要选择上传文件的路径和目标文件夹。 6. 等待文件上传完成。这可能需要一段时间,取决于文件的大小和网络连接的速度。 7. 一旦上传完成,您可以在Slyar FTP服务器的文件目录中看到刚刚上传文件。您还可以在客户端软件中进行相应的操作,例如重命名移动或者删除文件。 通过以上步骤,您可以使用Slyar FTP服务器上传文件。请注意确保FTP服务器的配置和网络连接的稳定性,以确保文件传输的顺利进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值