Java使用FTP操作文件
通过java代码连接FTP服务,上传,下载等:
1.1. 导包
将commons-net-3.5.jar包。导入到eclipse的Java项目中。
下载commons-net-3.5.jar包下载地址:
http://commons.apache.org/proper/commons-net/download_net.cgi
1.2. Ftp工具类(java)
1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.net.URLEncoder; 9 import org.apache.commons.net.ftp.FTPClient; 10 import org.apache.commons.net.ftp.FTPReply; 11 import org.slf4j.Logger; 12 import org.slf4j.LoggerFactory; 13 import org.springframework.web.multipart.MultipartFile; 14 15 16 /** 17 * FTP服务工具类 18 * @author limingcheng 19 * 20 */ 21 public class FtpClientUtil { 22 private static final Logger logger = LoggerFactory.getLogger(FtpClientUtil.class); 23 24 // 初始化参数 25 private String username = ""; // 用户名 26 private String password = ""; // 密码 27 private String destPath = ""; // 目标文件路径 28 private String ftpHost = ""; // FTP服务的IP地址 29 private String ftpPort = ""; // FTP端口 30 private FTPClient ftpClient = null; // FTP实例 31 private String localCharset = "GBK"; // 本地编码格式 32 private String serverCharset = "ISO-8859-1"; // FTP服务器编码格式 33 34 35 /** 36 * 创建FTP实例 37 * @param ftpServer 38 * @param ftpPort 39 * @param username 40 * @param password 41 * @throws Exception 42 */ 43 public FtpClientUtil(String ftpHost, String ftpPort, String username, String password) throws Exception{ 44 this.username = username; 45 this.password = password; 46 this.ftpHost = ftpHost; 47 this.ftpPort = ftpPort; 48 this.ftpClient = new FTPClient(); 49 try { 50 this.ftpClient.connect(ftpHost, Integer.parseInt(ftpPort)); // 连接FTP服务器 51 this.ftpClient.setDataTimeout(18000); // 设置超时时间 52 this.ftpClient.login(username, password); // 登陆FTP服务器 53 int reply = this.ftpClient.getReplyCode(); // 返回代码 54 // 根据返回代码判断是否连接成功 55 if (!FTPReply.isPositiveCompletion(reply)) { 56 this.ftpClient.disconnect(); 57 throw new Exception("连接ftp服务器失败"); 58 } 59 this.ftpClient.enterLocalPassiveMode(); 60 this.ftpClient.setBufferSize(4096); 61 // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK) 62 if (FTPReply.isPositiveCompletion(this.ftpClient.sendCommand("OPTS UTF8", "ON"))) { 63 this.localCharset = "UTF-8"; 64 } 65 this.ftpClient.setControlEncoding(this.localCharset); // 设置编码格式 66 this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 67 68 } catch (Exception e) { 69 throw new Exception("连接ftp客户端失败"); 70 } 71 } 72 73 /** 74 * 关闭FTP连接 75 * @throws IOException 76 */ 77 public void close() throws IOException { 78 if (this.ftpClient.isConnected()) { 79 this.ftpClient.disconnect(); 80 } 81 } 82 83 /** 84 * 删除文件 85 * @param sourcePath 86 * @param filename 87 * @throws Exception 88 */ 89 public void deleteFile(String sourcePath, String filename) throws Exception { 90 sourcePath = sourcePath.replace("\\", "/"); // 源文件路径 91 try { 92 boolean cd = this.ftpClient.changeWorkingDirectory(new String(sourcePath.getBytes("GBK"), this.serverCharset)); 93 if (!cd) { 94 throw new Exception("切换到上传文件目录失败或者目录不存在!"); 95 } 96 String[] files = this.ftpClient.listNames(); 97 this.ftpClient.deleteFile(new String(filename.getBytes(this.localCharset), this.serverCharset)); 98 } catch (Exception e) { 99 throw new Exception("删除ftp文件失败,请检查参数配置和ftp服务器状态!"); 100 } 101 } 102 103 /** 104 * 上传文件 105 * @param sourcePath 106 * @throws Exception 107 */ 108 public void uploadFile(String sourcePath) throws Exception { 109 sourcePath = sourcePath.replace("\\", "/"); // 源文件路径 110 this.destPath = this.destPath.replace("\\", "/"); // 目标文件路径 111 FileInputStream fis = null; 112 String fileName = sourcePath.substring(sourcePath.lastIndexOf("/") + 1); // 文件名 113 try { 114 File localFile = new File(sourcePath); 115 fis = new FileInputStream(localFile); 116 String[] destpaths = this.destPath.split("/"); // 文件路径 117 // 根据文件路径长度判断是否需要创建文件夹 118 if (destpaths.length >= 2) { 119 for (int i = 1; i < destpaths.length; i++) { 120 String folderName = new String(destpaths[i].getBytes(this.localCharset), this.serverCharset); 121 this.ftpClient.makeDirectory(folderName); // 创建文件名 122 boolean flag = this.ftpClient.changeWorkingDirectory(folderName); // 跳转到对应的文件路径下 123 if (!flag) { 124 throw new Exception("切换目录失败,请检查目录是否存在!"); 125 } 126 } 127 } else { 128 String folderName = new String(this.destPath.getBytes(this.localCharset), this.serverCharset); 129 130 this.ftpClient.makeDirectory(folderName); 131 boolean flag = this.ftpClient.changeWorkingDirectory(folderName); 132 if (!flag) { 133 throw new Exception("切换目录失败,请检查目录是否存在!"); 134 } 135 } 136 // 保存文件 137 this.ftpClient.storeFile(new String(fileName.getBytes(this.localCharset), this.serverCharset), fis); 138 fis.close(); 139 } catch (Exception e) { 140 throw new Exception("上传ftp文件失败,请检查参数配置和ftp服务器状态!"); 141 } finally { 142 try { 143 if (fis != null) 144 fis.close(); 145 } catch (IOException e) { 146 e.printStackTrace(); 147 } 148 } 149 } 150 151 /** 152 * 上传文件 153 * @param ftpHost 154 * @param ftpUserName 155 * @param ftpPassword 156 * @param ftpPort 157 * @param ftpPath 158 * @param fileName 159 * @return 160 * @throws Exception 161 */ 162 public void uploadFile(String fileName, String ftpPath, MultipartFile file) throws Exception { 163 InputStream fis = null; 164 ftpPath = ftpPath.replace("\\", "/"); 165 ftpPath = ftpPath.substring(1, ftpPath.length()); 166 this.destPath = ftpPath; 167 try { 168 fis = file.getInputStream(); 169 String[] destpaths = this.destPath.split("/"); // 文件路径 170 // 根据文件路径长度判断是否需要创建文件夹 171 if (destpaths.length >= 2) { 172 for (int i = 1; i < destpaths.length; i++) { 173 String folderName = new String(destpaths[i].getBytes(this.localCharset), this.serverCharset); 174 this.ftpClient.makeDirectory(folderName); // 创建文件名 175 boolean flag = this.ftpClient.changeWorkingDirectory(folderName); // 跳转到对应的文件路径下 176 if (!flag) { 177 throw new Exception("切换目录失败,请检查目录是否存在!"); 178 } 179 } 180 } else { 181 String folderName = new String(this.destPath.getBytes(this.localCharset), this.serverCharset); 182 183 this.ftpClient.makeDirectory(folderName); 184 boolean flag = this.ftpClient.changeWorkingDirectory(folderName); 185 if (!flag) { 186 throw new Exception("切换目录失败,请检查目录是否存在!"); 187 } 188 } 189 // 保存文件 190 this.ftpClient.storeFile(new String(fileName.getBytes(this.localCharset), this.serverCharset), fis); 191 192 } catch (FileNotFoundException e) { 193 logger.error("没有找到" + ftpPath + File.separatorChar + fileName + "文件"); 194 e.printStackTrace(); 195 } catch (IOException e) { 196 e.printStackTrace(); 197 logger.error("文件读取错误。"); 198 e.printStackTrace(); 199 } finally { 200 if(fis!=null) { 201 try { 202 fis.close(); 203 } catch (IOException e) { 204 e.printStackTrace(); 205 } 206 } 207 } 208 } 209 210 211 212 /** 213 * 下载文件 214 * @param sourcePath 215 * @param filename 216 * @return 217 * @throws Exception 218 */ 219 public File downFile(String sourcePath, String filename) throws Exception { 220 sourcePath = sourcePath.replace("\\", "/"); // 源文件路径 221 OutputStream os = null; 222 File localFile = null; 223 try { 224 // 跳转到对应的文件路径中 225 boolean cd = this.ftpClient.changeWorkingDirectory(new String(sourcePath.getBytes(this.localCharset), 226 this.serverCharset)); 227 if (!cd) { 228 throw new Exception("切换到上传文件目录失败或者目录不存在!"); 229 } 230 localFile = new File(URLEncoder.encode(filename, "UTF-8")); 231 os = new FileOutputStream(localFile); 232 this.ftpClient.retrieveFile(new String(filename.getBytes(this.localCharset), this.serverCharset), os); 233 File localFile1 = localFile; 234 return localFile1; 235 } catch (Exception e) { 236 throw new Exception("下载ftp文件失败,请检查参数配置和ftp服务器状态!"); 237 } finally { 238 try { 239 if (os != null) 240 os.close(); 241 } catch (IOException e) { 242 throw new Exception("关闭输出流出错!"); 243 } 244 } 245 } 246 247 248 }