在 Java 中从 FTP 服务器上传文件

使用  Apache Commons Net API,可以很容易地编写一个程序,以便从FTP服务器下载文件。在本文中,您将学习如何正确实现 java 代码以通过 FTP.

Apache Commons Net API 和 FTP

org.apache.commons.net.ftp.FTPClient提供了两种从FTP服务器下载文件的方法:

1) boolean retrieveFile(String remote, OutputStream local):此方法通过在参数 remote,并使用 OutputStream。此方法返回 true如果成功,否则 false。当您不需要知道有关传输的信息以及如何将文件保存到磁盘时,此方法适用于我们的程序。在下载结束时,我们必须关闭输出流 OutputStream 在下载的末尾.

2) InputStream retrieveFileStream(String remote):此方法仅将远程文件路径作为参数,不需要 OutputStream,但它返回 InputStream这对于读取从文件接收的字节很有用。这种方法使我们能够更好地控制字节写入本地磁盘的方式。使用此方法有两个要点:
  • completePendingCommand() 才能完成下载,并检查返回的值以查看下载是否已发生。
  • 播放流必须关闭 InputStream.
问题是应该使用哪种方法?这里有一些技巧:
  • 第一种方法是通过传递参数 OutputStream 我们要保存到 disk.
  • 第二种方法让我们可以更好地控制传输的完成方式,因此需要通过创建 InputStream读取接收到的字节和 输出流  以保存读取的字节数。如果您想知道已传输了多少字节以及还剩下多少字节,此方法非常有用。方法 completePendingCommand() 必须调用 
  • 两种方法都会引发异常 IOException 或以下两个之一例外:FTPConnectionClosedExcceptionCopyStreamException。因此,请确保在调用 .
此外,必须在 methods retrieveFile() 和  retrieveFileStream()

- void enterLocalPassiveMode():此方法将连接模式从服务器到客户端更改为客户端到服务器,从而避免了防火墙禁令问题。

- void setFileType(int fileType):此方法会更改要传输的文件类型,建议将类型更改为 FTP。BINARY_FILE_TYPE,而不是 FTP。ASCII_FILE_TYPE即使它是一个文本文件.

在 Java

以下是使用 Apache Commons Net:
  • 连接并登录服务器。
  • 使用被动连接模式。
  • 将传输类型更改为binary.
  • 创建outputStream 将下载的文件保存到 disk.
  • 指定录制路径到 disk.
  • 如果使用 retriveFile()
    • Pass outputStream 和文件路径作为参数.
    • 关闭写入流 outputStream.
    • 读取返回的值以检查下载是否成功。
  • 如果使用 retriveFileStream()
    • 检索时间 InputStream 返回方法 retriveFileStream().
    • 创建一个设置大小(通常为 4096)的字节数组(缓冲区)来读取字节并使用 a outputStream.
    • 调用方法 completePendingCommand() 完成下载并检查返回值,查看传输是否成功。
    • 关闭读写流 InputStreamoutputStream.
  • 断开与服务器的连接,disconnect().

    用于在 Java

    此代码显示了如何使用以下两种方法从 FTP 服务器下载文件:
    • boolean retrieveFile(String remote, InputStream local)
    • inputStream retrieveFileStream(String remote)
    完整代码:

    import java.io.BufferedOutputStream;
    导入 java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    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;
    import org.apache.commons.net.ftp.FTPFile;

    public class FTPDownloadFile {

    public static void main(String[] args) {
    Server String = ServerAddress”;
    int 端口 = 21;
    字符串 username = YourUserName”;
    字符串密码 = 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(plugins and styles.txt”);

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

    System.out.println(开始下载”);
    //下载结果
    boolean res = ftpClient.storeFile(filename, inputStream);
    //关闭播放流
    inputStream.close();

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

    // 方法二:使用 OutputStream
    String 上传文件 FileName2 = Track 2.mp3”;
    字符串 RemoteFilePath = /songs/”+FileName2;
    文件 filelocal = new File(C:/Track 2.mp3”);

    // 列出文件所在的文件夹 and
    // 然后用名字搜索它以获得
    // 它的大小,用于计算
    // download
    FTPFile[] files1 = ftpClient.listFiles(/songs”);
    long size = 0;
    for(int i = 0;我<文件1.长度;i++){
    if(files1[i].getName().equals(FileName2))
    //获取文件大小
    size = files1[i].getSize();
    }

    OutputStream outputStream2 = new BufferedOutputStream(
    new FileOutputStream(local file));
    InputStream inputStream2 = ftpClient.retrieveFileStream(
    RemoteFilePath);

    byte[] bytesArray = 新字节[4096];
    int bytesRead = -1;
    //只要我们还没有到达终点
    int transfer = 0;
    int 百分比 = 0;
    while ((bytesRead = inputStream2.read(bytesArray)) != -1) {
    //字节写入指定位置
    outputStream2.write(bytesArray, 0, bytesRead);
    转发 += bytesRead;
    percent = (int) (transferred*100/size);
    System.out.println(百分比+%”);
    }
    //close write read streams
    inputStream2.close();
    outputStream2.close();

    //br //
    res = ftpClient.completePendingCommand();
    if (res) {
    System.out.println(文件”+FileName2+
    已成功下载”);
    }

    } 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%
    .
    .
    98%
    99%
    99%
    100%
    2.mp3 Track file 已成功下载