SFTP多文件上传,删除
公司项目中需要把项目的相关文件上传到服务器的tomcat中,需要在项目中进行以下几步操作:
1.添加项目信息,包括名称,描述,服务器ip,sftp的用户名,密码,端口号等,存在配置,部署,删除等操作
2.配置:显示出文件信息,包括文件路径,目标路径,类型(上传,删除),状态(是否部署),
3.点击部署时进行自动的部署,可以是文件上传,也可以是相关文件的删除
结合网上有关sftp完成的sftp工具类,只使用了多文件上传和文件删除功能,其他没有进行测试,多文件上传需要本地路径和远程路径参数,文件夹删除需要远程路径参数
1 package MyUtils; 2 3 import com.jcraft.jsch.*; 4 import org.apache.log4j.Logger; 5 6 import java.io.*; 7 import java.util.ArrayList; 8 import java.util.Iterator; 9 import java.util.List; 10 import java.util.Vector; 11 12 /** 13 * sftp工具类 14 * 15 16 */ 17 public class SFTPUtils { 18 private static Logger log = Logger.getLogger(SFTPUtils.class.getName()); 19 private static ChannelSftp sftp = null; 20 private static Session sshSession = null; 21 private static Integer i = 0; 22 23 24 /** 25 * 通过SFTP连接服务器 26 */ 27 public static void connect(String ip, String username, String password, Integer port) throws Exception { 28 29 JSch jsch = new JSch(); 30 try { 31 if (port <= 0) { 32 // 连接服务器,采用默认端口 33 sshSession = jsch.getSession(username, ip); 34 } else { 35 // 采用指定的端口连接服务器 36 sshSession = jsch.getSession(username, ip, port); 37 } 38 39 // 如果服务器连接不上,则抛出异常 40 if (sshSession == null) { 41 throw new Exception("服务器异常"); 42 } 43 44 // 设置登陆主机的密码 45 sshSession.setPassword(password);// 设置密码 46 // 设置第一次登陆的时候提示,可选值:(ask | yes | no) 47 sshSession.setConfig("StrictHostKeyChecking", "no"); 48 // 设置登陆超时时间 49 sshSession.connect(300000); 50 Channel channel = sshSession.openChannel("sftp"); 51 channel.connect(); 52 53 sftp = (ChannelSftp) channel; 54 55 } catch (Exception e) { 56 e.printStackTrace(); 57 throw e; 58 } 59 } 60 61 /** 62 * 关闭连接 63 */ 64 public static void disconnect() { 65 if (sftp != null) { 66 if (sftp.isConnected()) { 67 sftp.disconnect(); 68 if (log.isInfoEnabled()) { 69 log.info("已关闭sftp"); 70 } 71 } 72 } 73 if (sshSession != null) { 74 if (sshSession.isConnected()) { 75 sshSession.disconnect(); 76 if (log.isInfoEnabled()) { 77 log.info("已关闭sshSession"); 78 } 79 } 80 } 81 } 82 83 /** 84 * 批量下载文件 85 * 86 * @param remotePath:远程下载目录(以路径符号结束) 87 * 88 * @param localPath:本地保存目录(以路径符号结束,D:\Duansha\sftp\) 89 * 90 * @param fileFormat:下载文件格式(以特定字符开头,为空不做检验) 91 * 92 * @param fileEndFormat:下载文件格式(文件格式) 93 * @param del:下载后是否删除sftp文件 94 * @return 95 */ 96 public List<String> batchDownLoadFile(String remotePath, String localPath, 97 String fileFormat, String fileEndFormat, boolean del) throws SftpException { 98 List<String> filenames = new ArrayList<String>(); 99 100 Vector v = sftp.ls(remotePath); 101 if (v.size() > 0) { 102 System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size()); 103 Iterator it = v.iterator(); 104 while (it.hasNext()) { 105 ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) it.next(); 106 String filename = entry.getFilename(); 107 SftpATTRS attrs = entry.getAttrs(); 108 if (!attrs.isDir()) { 109 boolean flag = false; 110 String localFileName = localPath + filename; 111 fileFormat = fileFormat == null ? "" : fileFormat 112 .trim(); 113 fileEndFormat = fileEndFormat == null ? "" 114 : fileEndFormat.trim(); 115 // 三种情况 116 if (fileFormat.length() > 0 && fileEndFormat.length() > 0) { 117 if (filename.startsWith(fileFormat) && filename.endsWith(fileEndFormat)) { 118 flag = downloadFile(remotePath, filename, localPath, filename); 119 if (flag) { 120 filenames.add(localFileName); 121 if (flag && del) { 122 deleteSFTP(remotePath); 123 } 124 } 125 } 126 } else if (fileFormat.length() > 0 && "".equals(fileEndFormat)) { 127 if (filename.startsWith(fileFormat)) { 128 flag = downloadFile(remotePath, filename, localPath, filename); 129 if (flag) { 130 filenames.add(localFileName); 131 if (flag && del) { 132 deleteSFTP(remotePath); 133 } 134 } 135 } 136 } else if (fileEndFormat.length() > 0 && "".equals(fileFormat)) { 137 if (filename.endsWith(fileEndFormat)) { 138 flag = downloadFile(remotePath, filename, localPath, filename); 139 if (flag) { 140 filenames.add(localFileName); 141 if (flag && del) { 142 deleteSFTP(remotePath); 143 } 144 } 145 } 146 } else { 147 flag = downloadFile(remotePath, filename, localPath, filename); 148 if (flag) { 149 filenames.add(localFileName); 150 if (flag && del) { 151 deleteSFTP(remotePath); 152 } 153 } 154 } 155 } 156 } 157 } 158 if (log.isInfoEnabled()) { 159 log.info("download file is success:remotePath=" + remotePath 160 + "and localPath=" + localPath + ",file size is" 161 + v.size()); 162 } 163 164 return filenames; 165 } 166 167 /** 168 * 下载单个文件 169 * 170 * @param remotePath:远程下载目录(以路径符号结束)e 171 * @param remoteFileName:下载文件名 172 * @param localPath:本地保存目录(以路径符号结束) 173 * @param localFileName:保存文件名 174 * @return 175 */ 176 public boolean downloadFile(String remotePath, String remoteFileName, String localPath, String localFileName) { 177 FileOutputStream fieloutput = null; 178 try { 179 // sftp.cd(remotePath); 180 File file = new File(localPath + localFileName); 181 // mkdirs(localPath + localFileName); 182 fieloutput = new FileOutputStream(file); 183 sftp.get(remotePath + remoteFileName, fieloutput); 184 if (log.isInfoEnabled()) { 185 log.info("===DownloadFile:" + remoteFileName + " success from sftp."); 186 } 187 return true; 188 } catch (FileNotFoundException e) { 189 e.printStackTrace(); 190 } catch (SftpException e) { 191 e.printStackTrace(); 192 } finally { 193 if (null != fieloutput) { 194 try { 195 fieloutput.close(); 196 } catch (IOException e) { 197 e.printStackTrace(); 198 } 199 } 200 } 201 return false; 202 } 203 204 /** 205 * 上传单个文件 206 * 207 * @param remotePath:远程保存目录 208 * @param localPath:本地上传目录(以路径符号结束) 209 * @return 210 */ 211 public static void uploadFile(String remotePath, String localPath) throws Exception { 212 FileInputStream in = null; 213 File localFile = new File(localPath); 214 sftp.cd(remotePath); 215 in = new FileInputStream(localFile); 216 sftp.put(in, localFile.getName()); 217 218 if (in != null) { 219 in.close(); 220 } 221 } 222 223 /** 224 * 批量上传文件 225 * 226 * @param remotePath:远程保存目录 227 * @param localPath:本地上传目录(以路径符号结束) 228 * @return 229 */ 230 public static boolean bacthUploadFile(String remotePath, String localPath) throws Exception { 231 File localFile = new File(localPath); 232 boolean flag = true; 233 //进入远程路径 234 try { 235 if (!isDirExist(remotePath)) { 236 sftp.mkdir(remotePath); 237 sftp.cd(remotePath); 238 } else { 239 sftp.cd(remotePath); 240 } 241 //本地文件上传 242 File file = new File(localPath); 243 //本地文件上传方法 244 copyFile(file, sftp.pwd()); 245 246 247 } catch (Exception e) { 248 e.printStackTrace(); 249 flag = false; 250 throw e; 251 } 252 253 return flag; 254 } 255 256 private static void copyFile(File file, String pwd) throws Exception { 257 if (file.isDirectory()) { 258 File[] list = file.listFiles(); 259 String fileName = file.getName(); 260 sftp.cd(pwd); 261 System.out.println("正在创建目录:" + sftp.pwd() + "/" + fileName); 262 sftp.mkdir(fileName); 263 System.out.println("目录创建成功:" + sftp.pwd() + "/" + fileName); 264 //远程路径发生改变 265 pwd = pwd + "/" + file.getName(); 266 sftp.cd(file.getName()); 267 268 for (int i = 0; i < list.length; i++) { 269 copyFile(list[i], pwd); 270 } 271 } else { 272 //不是目录,直接进入改变后的远程路径,进行上传 273 sftp.cd(pwd); 274 275 System.out.println("正在复制文件:" + file.getAbsolutePath()); 276 InputStream instream = null; 277 OutputStream outstream = null; 278 outstream = sftp.put(file.getName()); 279 instream = new FileInputStream(file); 280 281 byte b[] = new byte[1024]; 282 int n; 283 while ((n = instream.read(b)) != -1) { 284 outstream.write(b, 0, n); 285 } 286 287 outstream.flush(); 288 outstream.close(); 289 instream.close(); 290 291 } 292 293 } 294 295 /** 296 * 删除本地文件 297 * 298 * @param filePath 299 * @return 300 */ 301 public boolean deleteFile(String filePath) { 302 File file = new File(filePath); 303 if (!file.exists()) { 304 return false; 305 } 306 307 if (!file.isFile()) { 308 return false; 309 } 310 boolean rs = file.delete(); 311 if (rs && log.isInfoEnabled()) { 312 log.info("delete file success from local."); 313 } 314 return rs; 315 } 316 317 /** 318 * 创建目录 319 * 320 * @param createpath 321 * @return 322 */ 323 public static void createDir(String createpath) { 324 try { 325 if (isDirExist(createpath)) { 326 sftp.cd(createpath); 327 } 328 String pathArry[] = createpath.split("/"); 329 StringBuffer filePath = new StringBuffer("/"); 330 for (String path : pathArry) { 331 if (path.equals("")) { 332 continue; 333 } 334 filePath.append(path + "/"); 335 if (isDirExist(filePath.toString())) { 336 sftp.cd(filePath.toString()); 337 } else { 338 // 建立目录 339 sftp.mkdir(filePath.toString()); 340 // 进入并设置为当前目录 341 sftp.cd(filePath.toString()); 342 } 343 344 } 345 } catch (SftpException e) { 346 e.printStackTrace(); 347 } 348 } 349 350 /** 351 * 判断目录是否存在 352 * 353 * @param directory 354 * @return 355 */ 356 public static boolean isDirExist(String directory) { 357 try { 358 Vector<?> vector = sftp.ls(directory); 359 if (null == vector) { 360 return false; 361 } else { 362 return true; 363 } 364 } catch (Exception e) { 365 return false; 366 } 367 } 368 369 /** 370 * 删除stfp文件 371 * 372 * @param directory:要删除文件所在目录 373 */ 374 public static void deleteSFTP(String directory) { 375 try { 376 if (isDirExist(directory)) { 377 Vector<ChannelSftp.LsEntry> vector = sftp.ls(directory); 378 if (vector.size() == 1) { // 文件,直接删除 379 sftp.rm(directory); 380 } else if (vector.size() == 2) { // 空文件夹,直接删除 381 sftp.rmdir(directory); 382 } else { 383 String fileName = ""; 384 // 删除文件夹下所有文件 385 for (ChannelSftp.LsEntry en : vector) { 386 fileName = en.getFilename(); 387 if (".".equals(fileName) || "..".equals(fileName)) { 388 continue; 389 } else { 390 deleteSFTP(directory + "/" + fileName); 391 } 392 } 393 // 删除文件夹 394 sftp.rmdir(directory); 395 } 396 } 397 } catch (Exception e) { 398 e.printStackTrace(); 399 } 400 } 401 402 /** 403 * 如果目录不存在就创建目录 404 * 405 * @param path 406 */ 407 public void mkdirs(String path) { 408 File f = new File(path); 409 410 String fs = f.getParent(); 411 412 f = new File(fs); 413 414 if (!f.exists()) { 415 f.mkdirs(); 416 } 417 } 418 419 420 421 /** 422 * 测试 423 */ 424 public static void main(String[] args) { 425 // 本地存放地址 426 String localPath = "F:\\java\\src\\main\\webapp\\resources"; 427 // Sftp下载路径 428 String sftpPath = "/home/sftp/"; 429 List<String> filePathList = new ArrayList<String>(); 430 try { 431 connect("111.16.123.12", "ftptest1", "123456", 22); 432 //deleteSFTP(sftpPath); 433 // 上传 434 //bacthUploadFile(sftpPath, localPath); 435 //deleteSFTP("/home/ftp/ff"); 436 } catch (Exception e) { 437 e.printStackTrace(); 438 } finally { 439 sftp.disconnect(); 440 } 441 } 442 }