zoukankan      html  css  js  c++  java
  • 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;
    	}
    }
    

      

  • 相关阅读:
    SharePoint 2013 商务智能报表发布
    sharepoint designer web 服务器似乎没有安装microsoft sharepoint foundation
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 入门教程之创建及修改母版页
    SharePoint 2013 入门教程之创建页面布局及页面
    SharePoint 2010 级联下拉列表 (Cascading DropDownList)
    使用SharePoint Designer定制开发专家库系统实例!
    PL/SQL Developer 建立远程连接数据库的配置 和安装包+汉化包+注册机
  • 原文地址:https://www.cnblogs.com/hzb462606/p/11084820.html
Copyright © 2011-2022 走看看