|
|
package com.gaotao.modules.ftp.util;
import com.gaotao.common.utils.ConfigConstant;import com.gaotao.common.utils.R;import com.gaotao.common.utils.SpringContextUtils;import com.gaotao.modules.oss.cloud.CloudStorageConfig;import com.gaotao.modules.pda.utils.ResponseData;import com.gaotao.modules.sys.service.SysConfigService;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.springframework.beans.factory.annotation.Value;
import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.URLEncoder;
/*** * @ClassName: FTPUtils * @Description: TODO(这里用一句话描述这个类的作用) * @author lirui * @date 2018年4月29日 **/@Slf4jpublic class FTPUtils { private static String serverUrl = "192.168.1.84"; @Value("${com.ftp.ftpPort}") private static int port = 21; private static String username = "ftpadmin"; private static String password = "XJerp123"; private static SysConfigService sysConfigService; private static CloudStorageConfig config; static { sysConfigService = (SysConfigService) SpringContextUtils.getBean("sysConfigService"); //获取储配置信息
config = sysConfigService.getConfigObject(ConfigConstant.FTP_CONFIG_KEY, CloudStorageConfig.class);
} /** * @throws IOException * @Title: getFTPClient * @Description: 获取ftp链接 * @author lirui * @date 2018年4月29日 * @param @param serverUrl * @param @param username * @param @param passWord * @param @return 参数 * @return FTPClient 返回类型 * @throws */ public static FTPClient getFTPClient() { FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(config.getFtpHost(), config.getFtpPort()); ftpClient.login(config.getFtpUser(), config.getFtpPassword()); int replay = ftpClient.getReplyCode(); //状态码有误关闭链接
if(!FTPReply.isPositiveCompletion(replay)){ ftpClient.disconnect(); log.info("ftp链接有误,状态码:"+replay); } ftpClient.setFileType(FTP.BINARY_FILE_TYPE); } catch (IOException e) { log.info("ftp链接有误,错误信息:"+e.getMessage()); e.printStackTrace(); } return ftpClient; } /** * @throws IOException * * @Title: changeToDir * @Description: 切换工作目录 * @author lirui * @date 2018年4月30日 * @param @return 参数 * @return boolean 返回类型 * @throws */ public static void changeToDir(FTPClient ftpClient,String path) throws IOException{// 中文转码
path = new String(path.toString().getBytes("GBK"),"iso-8859-1"); /*该部分为逐级创建*/ String[] split = path.split("/"); String newPath = ""; for (String str : split) { if(StringUtils.isBlank(str)) { continue; } newPath = newPath + "/" + str;// 判断是否已有该文件夹
if (!ftpClient.changeWorkingDirectory(newPath)) { boolean makeDirectory = ftpClient.makeDirectory(newPath); System.err.println(str + "创建:" + makeDirectory); }// 切换文件夹
boolean changeWorkingDirectory = ftpClient.changeWorkingDirectory(newPath); System.err.println(";切换:" + changeWorkingDirectory); } } /** * @throws IOException * * @Title: changeToParentDir * @Description: 切换到父级目录 * @author lirui * @date 2018年4月29日 * @param @return 参数 * @return boolean 返回类型 * @throws */ public static void changeToParentDir(FTPClient ftpClient) throws IOException{ ftpClient.changeToParentDirectory(); } /** * * @Title: uploadFile * @Description: 上传文件 * @author lirui * @date 2018年4月29日 * @date 2018年4月30日 * @return 参数 * @return ResponseData 返回类型 * @throws */ public static R uploadFtpFile( File file){ R r = new R(); FTPClient ftpClient = getFTPClient(); //判断链接是否关闭
if(!ftpClient.isConnected()){ log.info("ftp链接出错!链接已关闭!"); r.error(300,"ftp链接出错!链接已关闭!"); return r; } //上传操作
FileInputStream fis = null; try { fis = new FileInputStream(file); ftpClient.setBufferSize(10000); //切换目录
ftpClient.setControlEncoding("UTF-8"); changeToDir(ftpClient, config.getFtpDir()); boolean flag = ftpClient.storeFile(new String(file.getName().getBytes("gbk"), "iso-8859-1"), fis); if(!flag){ log.info("ftp上传失败!"); r.error(303,"ftp上传失败!"); return r; } ftpClient.logout(); r.ok("ftp上传成功!"); r.put("url",config.getFtpDir()+"//"+file.getName()); return r; } catch (FileNotFoundException e) { log.info("ftp上传出错!错误信息:"+e.getMessage()); r.error(301,"ftp上传出错!错误信息:"+e.getMessage()); e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fis.close(); ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } return r; } /** * * @Title: getFtpFile * @Description: 下载文件 * @author lirui * @date 2018年4月30日 * @param serverUrl ftp路径 * @param username 用户名 * @param password 密码 * @param path 当前目录 * @param fileName 当前目录下下载的文件名称 * @return 参数 * @return File 返回类型 * @throws */ public static ResponseData downFtpFile(String serverUrl,String username,String password,String path,String fileName){ ResponseData responseData = new ResponseData(); FTPClient ftpClient = getFTPClient(); //判断链接是否关闭
if(!ftpClient.isConnected()){ log.info("ftp链接出错!链接已关闭!"); responseData.setCode("300"); responseData.setMsg("链接出错!"); return responseData; } //进入工作空间
boolean flag = true; FileOutputStream fos = null; try { ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); flag = ftpClient.changeWorkingDirectory("/"); if(!flag){ log.info("ftp链接出错!文件夹不存在!"); responseData.setCode("300"); responseData.setMsg("ftp链接出错!文件件不存在!"); return responseData; } //获取当前目录下的所有文件名称
ftpClient.sendCommand("OPTS UTF8 ON"); FTPFile[] ftpFiles = ftpClient.listFiles(); //文件存在是否存在的标记
boolean isExist = false; //循环判断文件
for(int i = 0; i<ftpFiles.length; i++){ String temp_name = new String(ftpFiles[i].getName().getBytes("iso-8859-1"), "UTF-8"); if(fileName.equals(temp_name)){ isExist = true; File temp_file = new File(fileName); fos = new FileOutputStream(temp_file); ftpClient.retrieveFile(ftpFiles[i].getName(), fos); responseData.setObj(temp_file); ftpClient.logout(); break; } } if(isExist){ responseData.setCode("200"); responseData.setMsg("ftp下载成功!"); }else{ responseData.setCode("301"); responseData.setMsg("ftp下载失败!"); } } catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); }finally { //关闭流和链接
try { if(fos!=null){ fos.close(); } if(ftpClient!=null){ ftpClient.disconnect(); } } catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); } } return responseData; }
/** * * @Title: delFile * @Description: 删除文件 * @author lirui * @date 2018年4月30日 * @param serverUrl ftp路径 * @param username 用户名 * @param password 密码 * @param path 当前目录 * @param fileName 当前目录下删除文件名称 * @param @return 参数 * @return ResponseData 返回类型 * @throws */ public static ResponseData delFtpFile(String serverUrl,String username,String password,String path,String fileName){ ResponseData responseData = new ResponseData(); FTPClient ftpClient = getFTPClient(); //判断链接是否关闭
if(!ftpClient.isConnected()){ log.info("ftp链接出错!链接已关闭!"); responseData.setCode("300"); responseData.setMsg("链接出错!"); return responseData; } //进入工作空间
boolean flag = true; try { flag = ftpClient.changeWorkingDirectory(path); if(!flag){ log.info("ftp链接出错!文件夹不存在!"); responseData.setCode("300"); responseData.setMsg("ftp链接出错!文件件不存在!"); return responseData; } //获取当前目录下的所有文件名称
ftpClient.sendCommand("OPTS UTF8 ON"); FTPFile[] ftpFiles = ftpClient.listFiles(); //文件存在是否存在的标记
boolean delFlag = false; //循环判断文件
for(int i = 0; i<ftpFiles.length; i++){ String temp_name = new String(ftpFiles[i].getName().getBytes("iso-8859-1"), "UTF-8"); if(fileName.equals(temp_name)){ delFlag = ftpClient.deleteFile(ftpFiles[i].getName()); ftpClient.logout(); } } if(delFlag){ responseData.setCode("200"); responseData.setMsg("ftp文件删除成功!"); }else{ responseData.setCode("301"); responseData.setMsg("文件不存在,请检查后再试!"); } } catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); }finally { //关闭流和链接
try { if(ftpClient!=null){ ftpClient.disconnect(); } } catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); } } return responseData; } /** * * @Title: delFtpDir * @Description: TODO(这里用一句话描述这个方法的作用) * @author lirui * @date 2018年4月30日 * @param serverUrl ftp路径 * @param username 用户名 * @param password 密码 * @param path 当前目录 * @param dir 当当前目录下删除文件夹名称 * @return 参数 * @return ResponseData 返回类型 * @throws */ public static ResponseData delFtpDir(String serverUrl,String username,String password,String path,String dir){ ResponseData responseData = new ResponseData(); FTPClient ftpClient = getFTPClient(); //判断链接是否关闭
if(!ftpClient.isConnected()){ log.info("ftp链接出错!链接已关闭!"); responseData.setCode("300"); responseData.setMsg("链接出错!"); return responseData; } //进入工作空间
boolean flag = true; try { flag = ftpClient.changeWorkingDirectory(path+"\\"+dir); if(!flag){ log.info("ftp链接出错!文件夹不存在!"); responseData.setCode("300"); responseData.setMsg("ftp链接出错!文件件不存在!"); return responseData; } //返回父级目录
ftpClient.changeToParentDirectory(); //删除文件夹
boolean delFlag = ftpClient.removeDirectory(dir); if(delFlag){ responseData.setCode("200"); responseData.setMsg("ftp文件删除成功!"); }else{ responseData.setCode("301"); responseData.setMsg("文件不存在,请检查后再试!"); } } catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); }finally { //关闭流和链接
try { if(ftpClient!=null){ ftpClient.disconnect(); } } catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); } } return responseData; }
public static R downFtpFile( String path, String fileName, String newFileName, HttpServletResponse response){ R r = new R(); FTPClient ftpClient = getFTPClient(); //判断链接是否关闭
if(!ftpClient.isConnected()){ log.info("ftp链接出错!链接已关闭!"); r.put("msg" ,"ftp链接出错!"); r.put("success", false); return r; } //进入工作空间
boolean flag = true; try { ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); if(path == null || "".equals(path)){ path = "/"; } String name=new String(path.getBytes("UTF-8"),"iso-8859-1"); flag = ftpClient.changeWorkingDirectory(name);// flag = ftpClient.changeWorkingDirectory("/");
if(!flag){ log.info("ftp链接出错!文件夹不存在!"); r.put("msg" ,"文件件不存在!"); r.put("success", false); return r; } //获取当前目录下的所有文件名称
ftpClient.sendCommand("OPTS UTF8 ON"); FTPFile[] ftpFiles = ftpClient.listFiles(); //文件存在是否存在的标记
boolean isExist = false; //循环判断文件
for(int i = 0; i<ftpFiles.length; i++){ String temp_name = new String(ftpFiles[i].getName().getBytes("iso-8859-1"), "UTF-8"); if(fileName.equals(temp_name)){ log.info("文件开始下载!文件名称:"+fileName); isExist = true; InputStream fis = ftpClient.retrieveFileStream(ftpFiles[i].getName()); byte[] buffer = new byte[fis.available()]; // 清空response
response.reset(); if(newFileName != null && !"".equals(newFileName)){ fileName = newFileName; } // 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.addHeader("Content-Length", "" + ftpFiles[i].getSize()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("UTF-8"); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); int length; while((length=fis.read(buffer))>0){ //把文件流写到缓冲区里
toClient.write(buffer,0,length); } toClient.write(buffer); toClient.flush(); fis.close(); toClient.close(); log.info("文件下载完成!文件名称:"+fileName); break; } } ftpClient.completePendingCommand(); if(isExist){ r.put("msg" ,"ftp下载成功!"); r.put("success", true); }else{ r.put("msg" ,"ftp下载失败!"); r.put("success", false); } } catch (IOException e) { log.info("ftp下载出错!错误信息:"+e.getMessage()); // TODO Auto-generated catch block
e.printStackTrace(); }finally { //关闭流和链接
try {// if(fos!=null){
// fos.close();
// }
if(ftpClient!=null){ ftpClient.logout(); } } catch (IOException e) { log.info("关闭流和链接出错!错误信息:"+e.getMessage()); e.printStackTrace(); } }
return r; }
/**` * @Desc ftp文件下载 * @param response * @param path * @param fileName */ public static void downFile( HttpServletResponse response, String path, String fileName){ FTPClient ftpClient = getFTPClient(); //判断链接是否关闭
if(!ftpClient.isConnected()){ log.info("ftp链接出错!链接已关闭!"); } //进入工作空间
boolean flag = true; try { ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); if(path == null || "".equals(path)){ path = "/"; } String name=new String(path.getBytes("UTF-8"),"iso-8859-1"); flag = ftpClient.changeWorkingDirectory(name);
if(!flag){ log.info("ftp链接出错!文件夹不存在!"); } //获取当前目录下的所有文件名称
ftpClient.sendCommand("OPTS UTF8 ON"); FTPFile[] ftpFiles = ftpClient.listFiles(); //文件存在是否存在的标记
boolean isExist = false; //循环判断文件
for(int i = 0; i<ftpFiles.length; i++){ String temp_name = new String(ftpFiles[i].getName().getBytes("iso-8859-1"), "UTF-8"); if(fileName.equals(temp_name)){ log.info("文件开始下载!文件名称:"+fileName); isExist = true; InputStream fis = ftpClient.retrieveFileStream(ftpFiles[i].getName()); byte[] buffer = new byte[fis.available()]; // 清空response
response.reset(); // 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.addHeader("Content-Length", "" + ftpFiles[i].getSize()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("UTF-8"); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); int length; while((length=fis.read(buffer))>0){ //把文件流写到缓冲区里
toClient.write(buffer,0,length); } toClient.write(buffer); toClient.flush(); fis.close(); toClient.close(); ftpClient.completePendingCommand(); log.info("下载完成!文件名称:"+fileName); } } ftpClient.completePendingCommand(); if(isExist){ log.info("下载完成!文件名称:"+fileName); }else{ log.info("下载失败!文件名称:"+fileName); } } catch (IOException e) { log.info("ftp下载出错!错误信息:"+e.getMessage()); // TODO Auto-generated catch block
e.printStackTrace(); }finally { //关闭流和链接
try { if(ftpClient!=null){ ftpClient.logout(); } } catch (IOException e) { log.info("关闭流和链接出错!错误信息:"+e.getMessage()); // TODO Auto-generated catch block
e.printStackTrace(); } } }
// 本地盘直接读取
public static void downFile1(String path, String fileName){ String ipPath = config.getFtpDir()+fileName; File file = new File(ipPath); try { OutputStream os = new FileOutputStream(file);
} catch (FileNotFoundException e) { e.printStackTrace(); } }}
|