使用 Commons.net FTPClient 上传 文件打不开。
原因,FTPClient 默认使用 ASCII 传输文件,FTP.ASCII_FILE_TYPE;
需要在登录代码后重新指定传输方式。
public static void main(String[] args) { FTPClient ftpClient = new FTPClient(); try { // 连接指定服务器,默认端口为21 ftpClient.connect("XXX.XXX.XXX.XXX",921); System.out.println("connect to server"); // 默认是 ISO-8859-1 设置成 UTF-8 读文件时防止文件名出现乱码 ftpClient.setControlEncoding("UTF-8"); // 获取响应字符串(FTP服务器上可设置) String replyString = ftpClient.getReplyString(); System.out.println("replyString: " + replyString); // 获取响应码用于验证是否连接成功 int reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { System.out.println(reply); System.exit(1); } // 登录服务器 boolean login = ftpClient.login("iron", "iron"); //不知道空用户名密码怎么使用。 if (login) { System.out.println("登录成功!"); } else { System.out.println("登录失败!"); } //默认为ASCII_FILE_TYPE,修改成BINARY_FILE_TYPE防止文件打不开 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 获取所有文件和文件夹的名字 // 生成InputStream用于上传本地文件 InputStream in = new FileInputStream("D:\\Libraries\\Desktop\\QQ截图20170321150849.jpg"); // 上传文件--防止中文名出现乱码。需要将文件名做特殊处理 boolean result = ftpClient.storeFile(new String("QQ截图3.jpg".getBytes("UTF-8"),"iso-8859-1"), in); //框架提供了多种上传方法 //ftpClient.appendFileStream(String remote) throwsIOException //ftpClient.appendFile(String remote,InputStream local) throws IOException //ftpClient.storeFileStream(String remote) throwsIOException //ftpClient.storeFile(String remote,InputStream local) throws IOException if (result) { System.out.println("上传成功!"); } in.close(); //查看FTP中的文件 FTPFile[] files = ftpClient.listFiles(); for (FTPFile file : files) { if (file.isDirectory()) { System.out.println(file.getName() + " 是文件夹"); } if (file.isFile()) { System.out.println(file.getName() + " 是文件"); } } // 注销登录 boolean logout = ftpClient.logout(); if (logout) { System.out.println("注销成功!"); } else { System.out.println("注销失败!"); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭链接需要放在finally语句块中 if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } }