当前位置: 首页 > 编程笔记 >

java使用apache commons连接ftp修改ftp文件名失败原因

巫马修为
2023-03-14
本文向大家介绍java使用apache commons连接ftp修改ftp文件名失败原因,包括了java使用apache commons连接ftp修改ftp文件名失败原因的使用技巧和注意事项,需要的朋友参考一下

今天被ftp上中文名修改坑了好久

项目用的是 apache commons 里的 FtpClient 实现的对ftp文件的上传下载操作,今天增加了业务要修改ftp上的文件名,然后就一直的报错,问题是它修改名字的方法只返回一个boolean,没有异常,这就很蛋疼了,找了好久才发现是中文的名字的原因

改名

直接上代码

package net.codejava.ftp;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
public class FTPRenamer {
  public static void main(String[] args) {
    String server = "www.ftpserver.com";
    int port = 21;
    String user = "username";
    String pass = "password";
    FTPClient ftpClient = new FTPClient();
    try {
      ftpClient.connect(server, port);
      ftpClient.login(user, pass);
      // renaming directory
      String oldDir = "/photo";
      String newDir = "/photo_2012";
      boolean success = ftpClient.rename(oldDir, newDir);
      if (success) {
        System.out.println(oldDir + " was successfully renamed to: "
            + newDir);
      } else {
        System.out.println("Failed to rename: " + oldDir);
      }
      // renaming file
      String oldFile = "/work/error.png";
      String newFile = "/work/screenshot.png";
      success = ftpClient.rename(oldFile, newFile);
      if (success) {
        System.out.println(oldFile + " was successfully renamed to: "
            + newFile);
      } else {
        System.out.println("Failed to rename: " + oldFile);
      }
      ftpClient.logout();
      ftpClient.disconnect();
    } catch (IOException ex) {
      ex.printStackTrace();
    } finally {
      if (ftpClient.isConnected()) {
        try {
          ftpClient.logout();
          ftpClient.disconnect();
        } catch (IOException ex) {
          ex.printStackTrace();
        }
      }
    }
  }
}
如果修改的名字里没有中文,用上面的代码就够了,但如果有中文就要对文件名进行转码了,转码代码如下
// renaming file
String oldFile = "/work/你好.png";
String newFile = "/work/世界.png";
success = ftpClient.rename(
  new String(oldFile.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1),
  new String(newFile.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)
);

这样再修改名字就没有问题了

顺便记录一下上传、下载、删除、检查文件是否存在, 同样的,如果有中文名,最好先转一下码再进行操作

上传

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
/**
 * A program that demonstrates how to upload files from local computer
 * to a remote FTP server using Apache Commons Net API.
 * @author www.codejava.net
 */
public class FTPUploadFileDemo {
  public static void main(String[] args) {
    String server = "www.myserver.com";
    int port = 21;
    String user = "user";
    String pass = "pass";
    FTPClient ftpClient = new FTPClient();
    try {
      ftpClient.connect(server, port);
      ftpClient.login(user, pass);
      ftpClient.enterLocalPassiveMode();
      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
      // APPROACH #1: uploads first file using an InputStream
      File firstLocalFile = new File("D:/Test/Projects.zip");
      String firstRemoteFile = "Projects.zip";
      InputStream inputStream = new FileInputStream(firstLocalFile);
      System.out.println("Start uploading first file");
      boolean done = ftpClient.storeFile(firstRemoteFile, inputStream);
      inputStream.close();
      if (done) {
        System.out.println("The first file is uploaded successfully.");
      }
      // APPROACH #2: uploads second file using an OutputStream
      File secondLocalFile = new File("E:/Test/Report.doc");
      String secondRemoteFile = "test/Report.doc";
      inputStream = new FileInputStream(secondLocalFile);
      System.out.println("Start uploading second file");
      OutputStream outputStream = ftpClient.storeFileStream(secondRemoteFile);
      byte[] bytesIn = new byte[4096];
      int read = 0;
      while ((read = inputStream.read(bytesIn)) != -1) {
        outputStream.write(bytesIn, 0, read);
      }
      inputStream.close();
      outputStream.close();
      boolean completed = ftpClient.completePendingCommand();
      if (completed) {
        System.out.println("The second file is uploaded successfully.");
      }
    } catch (IOException ex) {
      System.out.println("Error: " + ex.getMessage());
      ex.printStackTrace();
    } finally {
      try {
        if (ftpClient.isConnected()) {
          ftpClient.logout();
          ftpClient.disconnect();
        }
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
}

下载

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
/**
 * A program demonstrates how to upload files from local computer to a remote
 * FTP server using Apache Commons Net API.
 * @author www.codejava.net
 */
public class FTPDownloadFileDemo {
  public static void main(String[] args) {
    String server = "www.myserver.com";
    int port = 21;
    String user = "user";
    String pass = "pass";
    FTPClient ftpClient = new FTPClient();
    try {
      ftpClient.connect(server, port);
      ftpClient.login(user, pass);
      ftpClient.enterLocalPassiveMode();
      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
      // APPROACH #1: using retrieveFile(String, OutputStream)
      String remoteFile1 = "/test/video.mp4";
      File downloadFile1 = new File("D:/Downloads/video.mp4");
      OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
      boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
      outputStream1.close();
      if (success) {
        System.out.println("File #1 has been downloaded successfully.");
      }
      // APPROACH #2: using InputStream retrieveFileStream(String)
      String remoteFile2 = "/test/song.mp3";
      File downloadFile2 = new File("D:/Downloads/song.mp3");
      OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile2));
      InputStream inputStream = ftpClient.retrieveFileStream(remoteFile2);
      byte[] bytesArray = new byte[4096];
      int bytesRead = -1;
      html" target="_blank">while ((bytesRead = inputStream.read(bytesArray)) != -1) {
        outputStream2.write(bytesArray, 0, bytesRead);
      }
      success = ftpClient.completePendingCommand();
      if (success) {
        System.out.println("File #2 has been downloaded successfully.");
      }
      outputStream2.close();
      inputStream.close();
    } catch (IOException ex) {
      System.out.println("Error: " + ex.getMessage());
      ex.printStackTrace();
    } finally {
      try {
        if (ftpClient.isConnected()) {
          ftpClient.logout();
          ftpClient.disconnect();
        }
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
}

删除

import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FTPDeleteFileDemo {
  public static void main(String[] args) {
    String server = "www.myserver.com";
    int port = 21;
    String user = "user";
    String pass = "pass";
    FTPClient ftpClient = new FTPClient();
    try {
      ftpClient.connect(server, port);
      int replyCode = ftpClient.getReplyCode();
      if (!FTPReply.isPositiveCompletion(replyCode)) {
        System.out.println("Connect failed");
        return;
      }
      boolean success = ftpClient.login(user, pass);
      if (!success) {
        System.out.println("Could not login to the server");
        return;
      }
      String fileToDelete = "/repository/video/cool.mp4";
      boolean deleted = ftpClient.deleteFile(fileToDelete);
      if (deleted) {
        System.out.println("The file was deleted successfully.");
      } else {
        System.out.println("Could not delete the file, it may not exist.");
      }
    } catch (IOException ex) {
      System.out.println("Oh no, there was an error: " + ex.getMessage());
      ex.printStackTrace();
    } finally {
      // logs out and disconnects from server
      try {
        if (ftpClient.isConnected()) {
          ftpClient.logout();
          ftpClient.disconnect();
        }
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
}

检查文件/文件夹是否存在

package net.codejava.ftp;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
/**
 * This program demonstrates how to determine existence of a specific
 * file/directory on a remote FTP server.
 * @author www.codejava.net
 *
 */
public class FTPCheckFileExists {
  private FTPClient ftpClient;
  private int returnCode;
  /**
   * Determines whether a directory exists or not
   * @param dirPath
   * @return true if exists, false otherwise
   * @throws IOException thrown if any I/O error occurred.
   */
  boolean checkDirectoryExists(String dirPath) throws IOException {
    ftpClient.changeWorkingDirectory(dirPath);
    returnCode = ftpClient.getReplyCode();
    if (returnCode == 550) {
      return false;
    }
    return true;
  }
  /**
   * Determines whether a file exists or not
   * @param filePath
   * @return true if exists, false otherwise
   * @throws IOException thrown if any I/O error occurred.
   */
  boolean checkFileExists(String filePath) throws IOException {
    InputStream inputStream = ftpClient.retrieveFileStream(filePath);
    returnCode = ftpClient.getReplyCode();
    if (inputStream == null || returnCode == 550) {
      return false;
    }
    return true;
  }
  /**
   * Connects to a remote FTP server
   */
  void connect(String hostname, int port, String username, String password)
      throws SocketException, IOException {
    ftpClient = new FTPClient();
    ftpClient.connect(hostname, port);
    returnCode = ftpClient.getReplyCode();
    if (!FTPReply.isPositiveCompletion(returnCode)) {
      throw new IOException("Could not connect");
    }
    boolean loggedIn = ftpClient.login(username, password);
    if (!loggedIn) {
      throw new IOException("Could not login");
    }
    System.out.println("Connected and logged in.");
  }
  /**
   * Logs out and disconnects from the server
   */
  void logout() throws IOException {
    if (ftpClient != null && ftpClient.isConnected()) {
      ftpClient.logout();
      ftpClient.disconnect();
      System.out.println("Logged out");
    }
  }
  /**
   * Runs this program
   */
  public static void main(String[] args) {
    String hostname = "www.yourserver.com";
    int port = 21;
    String username = "your_user";
    String password = "your_password";
    String dirPath = "Photo";
    String filePath = "Music.mp4";
    FTPCheckFileExists ftpApp = new FTPCheckFileExists();
    try {
      ftpApp.connect(hostname, port, username, password);
      boolean exist = ftpApp.checkDirectoryExists(dirPath);
      System.out.println("Is directory " + dirPath + " exists? " + exist);
      exist = ftpApp.checkFileExists(filePath);
      System.out.println("Is file " + filePath + " exists? " + exist);
    } catch (IOException ex) {
      ex.printStackTrace();
    } finally {
      try {
        ftpApp.logout();
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }
}

参考

https://www.codejava.net/java-se/ftp/how-to-start-ftp-programming-with-java

总结

以上所述是小编给大家介绍的java使用apache commons连接ftp修改ftp文件名失败原因,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

 类似资料:
  • 自上次更新以来,启动应用程序后,“Project Explorer”中的FTP-Server-Connections丢失。通常我可以很容易地选择服务器和浏览文件,但现在一秒钟后,所有的列表条目都丢失了,它只显示“本地文件系统”了。 (之前在Local Filesystem下列出的是我的服务器:http://d.pr/I/zbc1)昨天我重新添加了它,我以为它可以工作,但今天它又丢失了... 编辑:

  • 我一直在使用ftp在android应用程序的服务器上上传图像,我正在使用以下代码连接ftp。它在Wi-fi中工作正常,但如果我切换到3G或2G连接,就会出现连接超时错误。那么,你能告诉我如何处理这种情况吗。我的客户在Veriozon也面临这个问题,Sprint,ATT网络提供商。它的iPhone版本在所有网络中都运行良好。 代码: 错误: JAVA网ConnectException:无法连接到主机

  • 使用Apache Camel插件for Grails。使用ftpendpoint并希望通过修改的日期处理文件。这与使用“...&sortby=file:modified”url参数的预期效果不一样。它忽略日期并按文件名排序。我试过几个版本,比如“reverse:file:modified”和“date:file:yyyymmddmmssssss”。平台是运行在Linux上的Grails 2.3.5

  • 我试图存储一个文件到一个ftp服务器使用apache共享java库。我正在使用commons-net-3.0.1.jar.问题是当我试图将文件推入服务器时,调用 存储文件() 始终返回false。它不会抛出任何异常。没什么,只是默默地回答错误。如果我尝试手动推送文件,即在linux系统中使用普通的“ftp”客户端(我的意思是使用ftp命令连接到ftp服务器,并使用put命令存储文件),那么它会将文

  • 我做了一个小写的骆驼来消耗一个ftp服务器。 这是我使用Java DSL进行的路由: 我能做些什么来避免这种af行为吗?它真的很难测试,所以我希望有人发现我的代码中的一个缺陷。我已经找了很长一段时间,但我没有找到任何坚实的东西。也许我可以用什么方法来调试这个问题? 也许有几件事我发现有人可以说: 使用OnException时使用已处理(true) 可以设置使用者的最大批处理大小吗?(我可以为此使用

  • 我正在IIS服务器上使用网站面板。我想使用ftp上载文件 我使用了以下代码: 这段代码运行没有错误。当我使用网站面板的文件管理器时,一个文件创建了“Name.ext”,但这个文件大小是0 KB。为什么?我有什么问题?! 我确信windows防火墙允许我这么做。 更新:我正在使用UploadFileTask和UploadFile(unasync)进行操作,但结果与async相同:(