FTP上传下载及FTP不支持中文目录解决方法

直接上代码: ftp上传文件

/**
* 上传文件到ftp服务器
* @param host ftp服务器ip地址
* @param port ftp服务器端口号
* @param username ftp服务器账号
* @param password ftp服务器密码
* @param filePath 文件上传地址格式 files/file/dd
* @param filename 文件名称
* @param input 文件流
* @return true:上传成功 false : 上传失败
*/
public static boolean uploadFile(String host, int port, String username, String password, String filePath, String filename, InputStream input) throws IOException {
boolean result = false;
FTPClient ftp = new FTPClient(); //创建ftp操作对象
try {
ftp.enterLocalPassiveMode(); //被动模式:服务端开放端口给客户端用
ftp.setControlEncoding(“iso-8859-1”); //设置编码格式
ftp.connect(host, port); //连接ip端口号
ftp.login(username, password); //登录
int reply = ftp.getReplyCode(); //返回响应码:230 登录成功
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
log.info(“链接不合法”);
return result;
}
if (!ftp.changeWorkingDirectory(filePath)) {//切换目录,不成功则创建该目录
String[] dirs = filePath.split(“/”);//根据/切割
String tempPath = “”;
for (int i= 0; i String dir = dirs[i]; //循环创建目录
if (dir != null && !“”.equals(dir)) {
tempPath =tempPath+ “/” + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {

	            	ftp.makeDirectory(new String(tempPath.getBytes("GBK"),"iso-8859-1"));//创建目录(使用new String(tempPath.getBytes("GBK"),"iso-8859-1"))可以解决创建和切换中文目录问题
	            	ftp.changeWorkingDirectory(new String(tempPath.getBytes("GBK"),"iso-8859-1"));   //切换目录
	            }
	            
	          } 
	        } 
	        
	      } 
	      
	      ftp.setFileType(2);
	      if (!ftp.storeFile(new String(filename.getBytes("GBK"),"iso-8859-1"),input)) {//上传数据的同时设置以下编码 
			  log.info("上传文件失败");
	         return result; //上传失败返回false
	      } 
	      result = true;	 //上传成功 将返回值设置为true
	      input.close(); //关闭流
	      ftp.logout();//登出
	    } catch (IOException e) {
	      e.printStackTrace();
	    } finally {
	      if (ftp.isConnected()){
	    	  try {
		          ftp.disconnect();
		        } catch (IOException iOException) {} 
	       }
	      if(input!=null){
			  input.close();
		  }
	     } 
	    return result;
	  }

直接上代码: ftp下载文件
/**
* 从ftp服务器下载文件
* @param host ip地址
* @param port 端口号
* @param loginname 账号
* @param password 密码
* @param DownloadTag FTP服务器下载目录标识 /files
* @param downloadLocalTag 文件下载到本机的目录标识
* @return true: 下载成功 flse :下载失败
*/
public static boolean downloadFile(String host, int port, String loginname, String password, String DownloadTag,String downloadRootPath, String downloadLocalTag) throws IOException {

			boolean result = false;

			FTPClient ftp = new FTPClient();   //创建ftp连接对象
			ftp.setConnectTimeout(100000);//设置超时时间
			OutputStream out = null;
			try {
				ftp.enterLocalPassiveMode();  //被动模式:服务端开放端口给客户端用
				ftp.setControlEncoding("GBK");  //设置编码格式
				ftp.connect(host, port); // 连接至服务器
				ftp.login(loginname, password);  // 登录服务器
				int reply = ftp.getReplyCode();  //返回220:链接成功   230:登录成功
				if (!FTPReply.isPositiveCompletion(reply)) { // 判断返回码是否合法
					ftp.disconnect();// 不合法时断开连接
					log.info("链接不合法");
					return result; // 结束程序
				}
				boolean flag = ftp.changeWorkingDirectory(DownloadTag);// 设置文件操作目录  (切换)
				if(flag){
					log.info("切换"+DownloadTag+"目录成功");
				  }else{
					log.info("切换"+DownloadTag+"目录失败");
					return result ;
				}
				FTPFile[] files = ftp.listFiles();// 获取该目录下所有文件
				if(files.length <= 0){
					log.info(DownloadTag+"目录下没有文件,无法下载");
					return result ;
				}

                for(int i = 0 ; i < files.length ; i++){
					FTPFile file = files[i];   //获取单个文件
					log.info("获取到的第"+i+"个文件为:"+file.getName());
					if (file.isFile()) {//判断是否为文件
						String localFilePath = String.valueOf(downloadRootPath) + "/" + downloadLocalTag + "/" + file.getName();//下载到本机的地址目录
						log.info("文件备份到本地目录为-----"+localFilePath);
						File localFile = new File(localFilePath); //创建文件对象
						FtpUtil.isChartPathExist(String.valueOf(downloadRootPath) + "/" + downloadLocalTag);//检查是否存在不存在则创建
						out = new FileOutputStream(localFile); // 将文件转成流
						log.info("文件下载中-----");
						result = ftp.retrieveFile(file.getName(), out); // 下载文件  ture 下载成功  false 下载失败
						out.close();//关闭输出流
						if (result){ //下载成功之后,删除ftp文件
							log.info("文件下载成功,文件已经从ftp服务器地址"+DownloadTag+"/" + file.getName()+"下载到 :"+localFilePath);
							ftp.deleteFile(String.valueOf(DownloadTag) + "/" + file.getName());
							log.info("ftp服务器上---"+DownloadTag+"/" + file.getName()+"---文件删除成功");
						}
					 }
				}
				ftp.logout(); //登出
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (ftp.isConnected()){//ftp如果还有连接,断开连接
					try {
						ftp.disconnect();
					} catch (IOException iOException) {}
				}
				if(out!=null){
					out.close();//关闭输出流
				}
			}
			return result;// 返回结果
		}

你可能感兴趣的:(ftp,java)