• FTP文件上传和下载(JAVA)


    前文

          1、使用FTP的方式进行文件的上传和下载(非SFTP)

          2、本人手打,亲测,代码是最简单的,清晰易懂,需要的同学请结合自己的实际添加业务逻辑

          2、第三方的jar包:import org.apache.commons.net.ftp.FTPClient;

    代码

    package Main;
    
    import java.io.BufferedOutputStream;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.Writer;
    import java.util.List;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    
    import Domain.FileInfoList;
    import Domain.FtpConfig;
    import Util.LoggerUtil;
    
    public class FTPUtils {
    	public static final String ftp_IP = "192.168.0.6";
    	public static final Integer ftp_port = 9001;
    	public static final String ftp_user = "Administrator";
    	public static final String ftp_psw = "123";
    
    	public static void main(String args[]) {
    		//download from FTP
    		downloadFromFTP(ftp_IP,ftp_port,ftp_user,ftp_psw,"/","新建文本文档.txt","E:");
    		//upload from FTP
    		uploadFromFTP(ftp_IP,ftp_port,ftp_user,ftp_psw,"/","E://新建文本文档.txt","新建文本文档.txt");
    	}
    	/**
    	 * @param url        IP
    	 * @param port       端口
    	 * @param username   用户名
    	 * @param password   密码
    	 * @param remotePath 服务器上的路径
    	 * @param fileName   要下载的文件
    	 * @param localPath  保存到本地的文件
    	 */
    	public static boolean downloadFromFTP(String url, int port, String username, String password, String remotePath,
    			String fileName, String localPath) {
    		boolean success = false;
    		FTPClient ftp = new FTPClient();
    		InputStream input=null;
    		BufferedOutputStream writer=null;
    		byte[] by=null;
    		try {
    			int reply;
    			ftp.connect(url, port);
    			// ftp.connect(url);
    			// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
    			ftp.login(username, password);// 登录
    			ftp.enterLocalPassiveMode();
    			ftp.setControlEncoding("gbk");
    			reply = ftp.getReplyCode();
    			if (!FTPReply.isPositiveCompletion(reply)) {
    				ftp.disconnect();
    				return success;
    			}
    			ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
    			FTPFile[] fs = ftp.listFiles(); // 获取当前目录下的所有文件
    
    			for (FTPFile ff : fs) {
    				if (new String(ff.getName().getBytes(),"utf-8").equals(fileName)) {
    					//防止出现中文文件名是返回null,强制设置成ISO-8859-1的编码方式进行获取输入流
    					input=ftp.retrieveFileStream("/"+(new String(ff.getName().getBytes("gbk"), "ISO-8859-1")));
    					by=new byte[(int)ff.getSize()];
    					//把文件流保存到byte数组中
    					input.read(by);
    					//文件输出到目标目录,不需要判断本地目录是否有相同文件,会自动覆盖
    					writer=new BufferedOutputStream(new FileOutputStream(localPath+"/"+fileName));
    					writer.write(by);
    					System.out.println("输出指定文件【"+fileName+"】到本地目录:"+localPath+"/"+fileName+"成功");
    				}
    			}
    			//断开FTP连接
    			ftp.logout();
    			success = true;
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			
    			if (ftp.isConnected()) {
    				try {
    					if(writer!=null) {
    						writer.close();
    					}
    					if(input!=null) {
    						input.close();
    					}
    					ftp.disconnect();
    				} catch (IOException ioe) {
    				}
    			}
    		}
    		return success;
    	}
    	
    	/**
    	 * ftp上传单个文件
    	 * 
    	 * @param ftpIP      ftp地址
    	 * @param port        端口号
    	 * @param userName    ftp的用户名
    	 * @param password    ftp的密码
    	 * @param directory   上传至ftp的路径名不包括文件名
    	 * @param localFilePath 要上传的本地文件全路径名
    	 * @param destName    上传至ftp后存储的文件名
    	 * @throws IOException 
    	 */
    	public static boolean uploadFromFTP(String ftpIP,Integer port,String userName,String password,String directory,String localFilePath,String destName) {
    
    
    		FTPClient ftpClient = new FTPClient();
    		FileInputStream fis = null;
    		boolean result = false;
    		try {
    			ftpClient.connect(ftpIP, port);
    			ftpClient.login(userName, password);
    			ftpClient.enterLocalPassiveMode();
    			// 设置上传目录
    			ftpClient.changeWorkingDirectory(directory);
    			ftpClient.setBufferSize(1024);
    			ftpClient.setConnectTimeout(10*1000);
    			ftpClient.setControlEncoding("gbk");
    			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
    			//防止出现中文文件名是返回null,强制把文件名设置成ISO-8859-1的编码方式进行删除指定文件
    			ftpClient.deleteFile(directory+new String(destName.getBytes("gbk"),"ISO-8859-1"));
    			File srcFile = new File(localFilePath);
    			fis = new FileInputStream(srcFile);
    			//上传到FTP服务器==防止出现中文文件名是返回null,强制把文件名设置成ISO-8859-1的编码方式进行上传
    			result = ftpClient.storeFile((directory + new String(destName.getBytes("gbk"),"ISO-8859-1")), fis);
    
    		} catch (NumberFormatException e) {
    			System.err.println("FTP端口配置错误:不是数字:");
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			IOUtils.closeQuietly(fis);
    			try {
    				ftpClient.disconnect();
    			} catch (IOException e) {
    				throw new RuntimeException("关闭FTP连接发生异常!", e);
    			}
    		}
    		return result;
    	}
    }
    

      

  • 相关阅读:
    线程的取消/撤销 (转)
    Linux 3.0发布有感(转)
    Linux下挂载与解除挂载U盘
    Ubuntu 中文编码设置
    Linux Kernel 3.0新特性概览(转)
    pthread_cond_wait()用法分析
    brk和sbrk及内存分配函数介绍
    [转]Vmware ESX 4上虚拟机 Redhat 5.2(CentOS 5.2)启动在Starting udev 停几个小时
    [贺]通过Oracle 10g OCP的三门考试
    [原]Oracle外部表结合游标完成统计一例
  • 原文地址:https://www.cnblogs.com/hzb462606/p/11084820.html
Copyright © 2020-2023  润新知