使用 Java 将文件上传到 FTP 服务器

要编写将文件从本地磁盘上传到在线 FTP 服务器的 Java 代码,Apache Commons Net API 是 Java 开发人员的一个非常好的选择。它很简单,使使用 FTP 编程变得容易。

1- 下载 Apache Commons Net

API下载 Apache Commons Net API 它包含一组网络工具并支持多种协议,例如:FTP、Telnet、SMTP......上传后,.jar 文件应嵌入到项目的 classpath.

2- 用于通过 FTP

类 FTP 提供了通过 FTP:
  • boolean storeFile(String remote, InputStream local)
  • OutputStream storeFileStream(String remote)
  • boolean storeUniqueFile(InputStream local)
  • boolean storeUniqueFile(String remote, InputStream local)
  • OutputStream storeUniqueFileStream()
  • OutputStream storeUniqueFileStream(String remote)
这些方法之间有什么区别?井!它们可以分类如下:
  • 通过给 a InputStream 的本地文件(这些是具有 InputStream 作为参数)。当您不需要知道如何操作时,会采用这种类型的方法。 字节 从本地文件传输到服务器。我们让系统来做这件事。processing.
  • 通过写入 来存储文件输出流 (这些是将 OutputStream 作为输出的方法)。当您想要控制字节的使用方式时,这些类型的方法是必需的。是 转发,通过编写我们自己的代码来读取字节 通过将保存在远程文件路径中的本地文件,通过对象 OutputStream。如果您想显示进展 ,计算在文件大小上传输了多少字节 .
以上两种方法可以结合使用:
  • 清楚地命名远程文件(那些接受名为 remote 的 String 参数的方法)。
  • 将服务器名称和远程文件保留为唯一名称(这些没有 String 参数的方法)。
尽管这些方法很复杂, 在实践中主要使用两种方法:
  • boolean storeFile(String remote,InputStream local)
  • OutputStream storeFileStream(String remote)
除了这六种方法,还有另外两种方法需要在文件下载前后调用:
  • boolean setFileType(int fileType):确定文件的类型,即FTP的。ASCII_FILE_TYPE 或 FTP。BINARY_FILE_TYPE,用于传输文件。默认类型是 ASCII(纯文本),但必须将其设为二进制文件才能适用于所有文件。在文件传输开始之前,必须调用此方法。
  •  boolean completePendingCommand():下载完成后必须调用该方法才能完成事务。她回来了true 如果转移成功完成,如果没有;false。必须检查此方法的返回值,以确保上传已发生。
    默认情况下,FTP 通过为客户端打开一个端口来建立连接,并允许服务器连接到该端口。这是活动模式,但有时会被防火墙阻止,文件传输不起作用。幸运的是,FTP协议还有另一种模式,即建立连接的被动模式,通过在服务器中打开一个端口供客户端连接。此模式不会被防火墙阻止。

    因此,建议在数据传输开始之前通过调用 FTPClient 类方法切换到被动模式 enterLocalPassiveMode().

    3- 在 Java

    中传输文件的步骤要正确编写代码以使用 Apache Commons Net API 将文件传输到 FTP 服务器,必须遵循以下步骤:
    • 连接并登录服务器。
    • 连接使用被动模式。
    • 修改要传输的文件类型。
    • 创建 InputStream 对于本地文件.
    • 调用以下方法之一 商店...()开始传输文件。有两种场景:
      • 使用 InputStream:这是最简单的方法,因为您让系统负责发送和接收。没有额外的代码,只需传递项目即可InputStream 在相应的方法中,例如 storeFile(String remote, InputStream local).
      • Using OutputStream:这更复杂,但您可以更好地控制传输的数据。一般来说,必须编写几行代码才能从中读取字节 InputStream 并将这些字节写入 OutputStream由存储方法...(),例如 storeFileStream(String remote).
    • 关闭数据流 输入流 et OutputStream.
    • 调用方法 completePendingCommand() 完成事务。
    • 断开与服务器的连接。
    方法返回值 商店...()completePendingCommand() 以确保上传已完成。

    4- Java

    此代码显示如何使用以下两种方法将文件从机器发送到 FTP 服务器:
    • boolean storeFile(String remote, InputStream local)
    • OutputStream storeFileStream(String remote)
    调用 storeFile(),则不强制调用 completePendingCommand()。以下是完整的代码:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    导入org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;

    public class FTPUploadFile {

    public static void main(String[] args) {
    Server String = ServerAddress”;
    int 端口 = 21;
    字符串 user = 用户名”;
    字符串密码 = yourPassword”;

    FTPClient ftpClient = new FTPClient();
    try {

    ftpClient.connect(server, port);
    ftpClient.login(用户,密码);
    ftpClient.enterLocalPassiveMode();

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

    // 方法一:使用 InputStream
    File file = new File(C:/plugins and styles.txt”);

    String path = 插件和styles.txt”;
    InputStream inputStream = new FileInputStream(file);

    System.out.println(开始上传”);
    //upload
    boolean res = ftpClient.storeFile(path, inputStream);
    //关闭读取的 stream
    inputStream.close();

    if (res==true) {
    System.out.println(文件”+path+下载成功”);
    }

    // 方法二:使用 OutputStream
    file = new File(C:/track 1.wma”);
    path = 音频/音轨1.wma”;
    inputStream = new FileInputStream(file);

    System.out.println(开始上传”);
    OutputStream outputStream = ftpClient.storeFileStream(路径);
    byte[] bytesIn = 新字节[4096];
    int 缓冲区 = 0;

    //只要我们还没有到达文件的末尾
    System.out.println(正在下载...”);
    int 传输 = 0;
    int 百分比 = 0;
    //只要我们还没有到达文件的末尾
    while ((buffer = inputStream.read(bytesIn)) != -1) {
    //用 4096 bytes
    outputStream.write(bytesIn, 0, buffer);
    传输 += 缓冲区;
    percent = (int) (transferred*100/file.length());
    System.out.println(百分比+%”);
    }
    //close write read streams
    inputStream.close();
    outputStream.close();

    //上传结果
    res = ftpClient.completePendingCommand();
    if (res) {
    System.out.println(+path+” 文件已成功下载);
    }

    } catch (IOException e) {
    System.out.println(e.getMessage());
    e.printStackTrace();
    } finally {
    try {
    if (ftpClient.isConnected()) {
    //close FTP
    ftpClient.logout();
    ftpClient.disconnect();
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    }
    }
    执行此代码返回传输成功:

    上传开始
    插件和styles.txt文件已成功下载
    上传开始
    1%
    2%
    3%
    .
    .
    97%
    98%
    98%
    99%
    99%
    100%
    1.wma track 文件下载成功