java实现ftp文件操作的方式有哪些?

由于时间问题,这里尝试了两种方式:Apache组织提供的org.apache.commons.net.ftp、edtFTPj

一、org.apache.commons.net.ftp

要使用org.apache.commons.net.ftp实现功能需要项目内引入commons-net-1.4.1.jar、jakarta-oro-2.0.8.jar(不引入此包, FTPClient.listFiles()会报错,具体原因没有细究,当然希望高手给予补充)。

1、可以留意一下checkDirectory方法,因为之前做的时候想做一个校验:“java判断指定文件夹是否存在,如果不存在就自动创建”。然后在网上找了以下三种方案:

①ftpClient.makeDirectory(目录地址); 返回结果true或false
②ftpClient.cd(dir);  通过异常控制,报异常则为无。
③用changeWorkingDirectory,返回 false 没有 true 是有 。

个人感觉上述方法都不靠谱,所以采用了遍历文件夹的方式进行验证,当然如果你ftp服务器上的目录太多,用这个方法最好慎重一下。

2、中文乱码解决采用的是:http://www.linuxidc.com/Linux/2014-10/107585.htm给出的解决方案。

package com.cf.mytest.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class ApacheFtp {

	
	/** 本地字符编码 */
	private static String LOCAL_CHARSET = "GBK";
	
	// FTP协议里面,规定文件名编码为iso-8859-1
	private static String SERVER_CHARSET = "ISO-8859-1";

	//检查ftp目录
	public static boolean checkDirectory(FTPClient ftp, String dirName) {
		boolean _flag = false;
		try {
	        FTPFile[] files = ftp.listFiles();
			for (int i = 0; i < files.length; i++) {
				FTPFile file = files[i];
				if (file.isDirectory()) {
					if (dirName.equalsIgnoreCase(file.getName())) {
						_flag = true;
						break;
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return _flag;
	}
	
	


	/** 
	 * Description: 向FTP服务器上传文件 
	 * @param url FTP服务器hostname 
	 * @param port FTP服务器端口 
	 * @param username FTP登录账号 
	 * @param password FTP登录密码 
	 * @param path FTP服务器保存目录 
	 * @param filename 上传到FTP服务器上的文件名 
	 * @param input 输入流 
	 * @return 成功返回true,否则返回false 
	 */  
	public static int uploadFile(String path, String filename, InputStream input) {  
	    int success = 0;  
	    //ftp连接参数
		String ftpServer = "192.168.1.254";
		int ftpPort = 21;
		String ftpUser = "lmss";
		String ftpPassword = "test123";
	    FTPClient ftp = new FTPClient();  
	    try {
	        int reply;
	        // 连接FTP服务器 
	        ftp.connect(ftpServer, ftpPort); 
	        // 登录ftp
	        ftp.login(ftpUser, ftpPassword);
	        // 看返回的值是不是230,如果是,表示登陆成功
	        reply = ftp.getReplyCode(); 
	        // 以2开头的返回值就会为真 
	        if (!FTPReply.isPositiveCompletion(reply)) {
	            ftp.disconnect();
	            return success;
	        }
	        // 检查路径目录,没有就创建
	        path = StringUtils.removeStart(path, "/");
    		String[] typeArray = path.split("/");
    		for (int i = 0; i < typeArray.length; i++) {
    			if (!checkDirectory(ftp, typeArray[i])){
    				ftp.makeDirectory(typeArray[i]);
    			}
    			ftp.changeWorkingDirectory(typeArray[i]);
    		}
	        // 转到指定上传目录  
//	        ftp.changeWorkingDirectory(path);
    		//设置每次读取文件流时缓存数组的大小
			ftp.setBufferSize(1024); 
			//设置编码格式,解决中文乱码问题
			if (FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
    			LOCAL_CHARSET = "UTF-8";
    		}
    		ftp.setControlEncoding(LOCAL_CHARSET);
	        // 设置文件类型(二进制) 
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 
	        // 将上传文件存储到指定目录
	        ftp.storeFile(new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET), input);  
	        // 退出ftp 
	        ftp.logout();
	        success = 1;
	    } catch (IOException e) {
	        e.printStackTrace();  
	    } finally {
	    	try{
	    		if(input != null){
	    			input.close();
	    		}
	    		if (ftp.isConnected()) {
		        	 ftp.disconnect();  
		        }
	    	}catch(Exception e){
	    		e.printStackTrace();
	    	}
	    }
	    return success;
	}
	
	
	/** 
	 * Description: 删除ftp上的文件
	 * @return 成功返回true,否则返回false 
	 */  
	public static boolean deleteFileFtp(String path) {
		boolean success = false;
		//ftp连接参数
		String ftpServer = "192.168.1.254";
		int ftpPort = 21;
		String ftpUser = "lmss";
		String ftpPassword = "test123";
	    FTPClient ftp = new FTPClient();  
	    try {
	    	 int reply;
	        // 连接FTP服务器 
	        ftp.connect(ftpServer, ftpPort); 
	        // 登录ftp
	        ftp.login(ftpUser, ftpPassword);
	        // 看返回的值是不是230,如果是,表示登陆成功
	        reply = ftp.getReplyCode(); 
	        // 以2开头的返回值就会为真 
	        if (!FTPReply.isPositiveCompletion(reply)) {
	            ftp.disconnect();
	            return success;
	        }
	        success = ftp.deleteFile(path);
	    } catch (IOException e) {
	    	e.printStackTrace();
	    } finally {  
	        if (ftp.isConnected()) {
	            try {  
	                ftp.disconnect();  
	            } catch (IOException ioe) {
	            }
	        }
	    }
	    return success;
	}
	
	
	public static void main(String[] args) throws Exception {
		File file = new File("d:\\3.png");
		FileInputStream fis = new FileInputStream(file);
		ApacheFtp.uploadFile("/resource/png","4.png",fis);
	}
	

}

二、edtFTPj

要使用edtFTPj实现功能,项目需要引入edtftpj.jar。

package com.cf.mytest.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.commons.lang.StringUtils;

import com.enterprisedt.net.ftp.FTPFile;
import com.enterprisedt.net.ftp.FileTransferClient;
import com.enterprisedt.net.ftp.FileTransferOutputStream;

public class EdtFTPjTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		File file = new File("d:\\3.png");
		FileInputStream fis = new FileInputStream(file);
		EdtFTPjTest.writeFileToFtp("resource/png","4.png",fis);
	}
	
	// 连接到ftp,创建文本目录,指定最后一级目录
	public static FileTransferClient connect(String directory) {
		FileTransferClient ftp = new FileTransferClient();
		ftp.getAdvancedSettings().setControlEncoding("gb2312");
		//ftp配置信息
		String ftpServer = "192.168.1.254";
		int ftpPort = 21;
		String ftpUser = "lmss";
		String ftpPassword = "test123";
		try {
			ftp.setRemoteHost(ftpServer);
			ftp.setRemotePort(ftpPort);
			ftp.setUserName(ftpUser);
			ftp.setPassword(ftpPassword);
			ftp.connect();
			
			/*
			 * 循环创建文件夹目录
			 */
			
			//判断路径开始是否是/,如果是就删除掉
			directory = StringUtils.removeStart(directory, "/");
			String[] typeArray = directory.split("/");
			for (int i = 0; i < typeArray.length; i++) {
				if (!checkDirectory(ftp, typeArray[i]))
					ftp.createDirectory(typeArray[i]);
				ftp.changeDirectory(typeArray[i]);
			}
			
		} catch (Exception e) {
			ftp = null;
			e.printStackTrace();
		}
		return ftp;
	}
	

	// 更改ftp的路径
	public static boolean checkDirectory(FileTransferClient ftp, String dirName) {
		boolean _flag = false;
		try {
			FTPFile[] files = ftp.directoryList();
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDir()) {
					if (dirName.equalsIgnoreCase(files[i].getName())) {
						_flag = true;
						break;
					}
				}
			}
		} catch (Exception e) {
		}
		return _flag;
	}
	
	
	
	/*
	 * 写文件到ftp
	 * param: dec:文件所在目录,name:文件名称,in:输入流
	 */
	public static int writeFileToFtp(String dec, String name, InputStream in) {
		int flag = 0;
		FileTransferClient ftp = null;
		FileTransferOutputStream output = null;
		try {
			//创建目录,指向最后一级目录
			ftp = connect(dec);
			//设置文件名
			output = ftp.uploadStream(name);
			byte[] buf = new byte[1024]; 
		    int hasRead=0;
		    while((hasRead=in.read(buf))>0){
		    	output.write(buf, 0, hasRead);
		    }
		    output.flush();
		    flag = 1;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			 try{
				 if(output != null){
					 output.close();
				 }
				 if(ftp!=null && ftp.isConnected()){
					 ftp.disconnect();
				 }
			 }catch(Exception e){
				 e.printStackTrace();
			 }
		}
		return flag;
	}
	


}

以上代码,亲测好用!

所需jar文件如下:点击打开链接

最后希望各位大神能够给我指出代码中的缺陷,还有将来可能遇到的问题,多谢!

posted @ 2022-01-20 18:32  zero-cnblogs  阅读(523)  评论(0)    收藏  举报