使用apache实现ftp功能demo

使用apache的ftpserver搭建ftp服务器 不用框架的话,可以用windows自带的ftp工具搭建,不过要下载i386之类的组件。apache提供了一套ftp服务器工具。下载apache-ftpserver-1.0.6. 解压到ftpserver就行了。如果不配置的话,启动bin下的ftpd.bat就行了,浏览器输入ftp://localhost:2121就行了。 打开该文件,可以看到: rem ----- Create CL 阅读详情

ftp客户端类        FtpClient.java:

package org.crm.ftp;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.hi.framework.HiConfigHolder;

public class FtpClient {

	/**
	 * 在hiFrameworkConfig.properties配置文件中可设置ip、ftp的用户名、ftp的密码、root
	 */
	private final static String FTPIP = HiConfigHolder.getProperty("hi.upload.ftp.ip");
	private static int port = 21;
	private final static String FTPUSER = HiConfigHolder.getProperty("hi.upload.ftp.userName");
	private final static String FTPPWD = HiConfigHolder.getProperty("hi.upload.ftp.password");
	private final static String FTPROOT = HiConfigHolder.getProperty("hi.upload.ftp.root");
	private final static int CLIENTSIZE = Integer.parseInt(HiConfigHolder.getProperty("hi.upload.ftp.clientSize"));
	
	private static List<FTPClient> ftpLists = new ArrayList<FTPClient>();
	private static HashMap<FTPClient, Integer> ftpStatus = new HashMap<FTPClient, Integer >();// 0表示可用 1 表示不可用
	
	static { }
	
	/**
	* FunName:	连接服务器
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public static void connect(FTPClient ftp) throws IOException {//必要时,可以设置编码为gbk
		try {
			ftp.connect(FTPIP, port);
			int reply = ftp.getReplyCode();//连接ftp后返回值类型
			if(!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				System.exit(0);//throw new IOException("服务器拒绝连接.");
			} else if(!ftp.login(FTPUSER, FTPPWD)) {
				ftp.logout();
				throw new IOException("FTP用户名或密码!");
			}
			ftp.setFileType(FTP.BINARY_FILE_TYPE);//使用二进制
			if(FTPROOT != null && !"".equals(FTPROOT.trim())) {
				ftp.changeWorkingDirectory(FTPROOT);//改变目录路径
			}
		} catch(IOException ex) {
			if(ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch(IOException ioex) {
					System.err.println("断开服务器连接失败");
				}
			}
			System.err.println(ex.getMessage());
		}
	}

	/**
	* FunName:	断开重新连接
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public static void reConnect(FTPClient ftp) throws IOException {
		try{
			disConnect(ftp);
		}catch(IOException e){}
		connect(ftp);
	}
	
	/**
	* FunName:	断开连接
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public static void disConnect(FTPClient ftp) throws IOException {
		try {
			ftp.noop(); // check that control connection is working OK
			ftp.logout();
		} catch(IOException ioe) {
			System.err.println(ioe.getMessage());
		} finally {
			if(ftp.isConnected()) System.err.println("FTP未断开连接");
		}
	}
	
	/**
	* FunName:	关闭ftp
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public static void closeFtp(FTPClient ftp) throws IOException {
		if(ftpLists.indexOf(ftp) < 0) {
			disConnect(ftp);
		} else {
			ftpStatus.put(ftp, 0);
		}
	}

	/**
	* FunName:	获得一个ftp
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public synchronized static FTPClient getFtpClient() throws IOException {
		FTPClient ftp = null;
		for(FTPClient client : ftpLists) {
			//判断当前client是否已经有连接
			if(ftpStatus.get(client) != null && ftpStatus.get(client).equals(new Integer(1))) {
				ftpStatus.put(client, 1);
				ftp = client;
				break;
			}
		}
		if(ftp == null) {
			//新建一个连接,放到ftpDownloads连接池
			try {
				FTPClient newClient = new FTPClient();
				connect(newClient);
				if(ftpLists.size() < CLIENTSIZE) {
					ftpLists.add(newClient);
					ftpStatus.put(newClient, 1);
					ftp = newClient;
				}
			} catch(IOException ioe) {
				LogFactory.getLog("/").error(ioe.getMessage());
			}
		}
		
		if(!ftp.isAvailable()) {//判断ftp是否还保持连接状态
			reConnect(ftp);
		} else {
			ftp.changeToParentDirectory();
			if(FTPROOT != null && !"".equals(FTPROOT.trim())) ftp.changeWorkingDirectory(FTPROOT);
		}
		return ftp;
	}
}
从ftp服务器下载文件    FtpDownload.java:
package org.crm.ftp;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;


import org.apache.commons.net.ftp.FTPClient;
import org.hi.framework.web.BusinessException;
import org.hi.i18n.util.I18NUtil;


/*
 * ftp文件下载
 */
public class FtpDownload {


	private FTPClient ftp;
	
	public FtpDownload() {//下载构造函数
		try {
			ftp = FtpClient.getFtpClient();
		} catch (IOException ioe) {
			throw new BusinessException(I18NUtil.getString("连接FTP服务器失败,原因:") + ioe.getMessage());
		}
	}
	
	/**
	* FunName:	以文件流形式下载
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public InputStream getDownloadIS(String path) throws IOException {
		ByteArrayInputStream bais = null;
		
		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();
			ftp.retrieveFile(path, baos);
			bais = new ByteArrayInputStream(baos.toByteArray());
		} catch (IOException e) {//抛异常时,重新连接
			FtpClient.reConnect(ftp);
			baos = new ByteArrayOutputStream();
			ftp.retrieveFile(path, baos);
			bais = new ByteArrayInputStream(baos.toByteArray());
		} finally {
			bais.close();
			baos.flush();
			baos.close();
			FtpClient.closeFtp(ftp);
		}
		
		return bais;
	}
	
	/**
	* FunName:	以文件形式下载
	* @Author: sam
	* @Create Date: 2011-11-16
	 */
	public void getDownloadFile(String path, File file) throws IOException {
		FileOutputStream fos = new FileOutputStream(file);
		try {
			ftp.retrieveFile(path, fos);
		} catch (IOException e) {
			FtpClient.reConnect(ftp);
			ftp.retrieveFile(path, fos);
		} finally {
			fos.flush();
			fos.close();
			FtpClient.closeFtp(ftp);
		}
	}
}




上传文件到ftp服务器类    FtpUpload.java:
package org.crm.ftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.hi.framework.web.BusinessException;
import org.hi.i18n.util.I18NUtil;

public class FtpUpload {

	private FTPClient ftp;
	
	public FtpUpload() {
		try {
			ftp = FtpClient.getFtpClient();
		} catch (IOException ioe) {
			throw new BusinessException(I18NUtil.getString("连接FTP服务器失败,原因:") + ioe.getMessage());
		}
	}
	
	/**
	 * 将文件保存到ftp并返回文件在ftp的地址
	 * @param is 要保存的文件的字节流
	 * @param fileName 文件名
	 * @param moduleName 保存在哪个目录中
	 * @throws IOException
	 */
	public String saveUploadIS(InputStream is, String fileName, String moduleName) throws IOException {
		if(moduleName == null || moduleName.equals("")) moduleName = "common";
		try {
			changeDir(moduleName);
			fileName = formateName(URIUtil.encodeQuery(fileName));//url编码
			ftp.storeUniqueFile(fileName, is);
		} catch (IOException ioe) {//出现异常,重新连接ftp
			FtpClient.reConnect(ftp);
			changeDir(moduleName);
			fileName = formateName(URIUtil.encodeQuery(fileName));//url编码
			ftp.storeUniqueFile(fileName, is);
		} finally {
			is.close();
			FtpClient.closeFtp(ftp);
		}
		
		return moduleName + "/" + fileName;
	}
	
	/**
	 * 将文件保存到ftp并返回文件在ftp的地址
	 * @param file 要保存的文件
	 * @param fileName 文件名
	 * @param moduleName 保存在哪个目录中
	 * @throws IOException
	 */
	public String saveUploadFile(File file, String fileName,String moduleName) throws IOException {
		FileInputStream fis = new FileInputStream(file);
		return saveUploadIS(fis, fileName, moduleName);
	}
	
	/**
	 * 将文件保存到ftp并返回文件在ftp的地址
	 * @param file 要保存的文件
	 * @throws IOException
	 */
	public String saveUploadFile(File file) throws IOException {
		String name = file.getName();
		return saveUploadFile(file, name, "attachment");
	}
	
	/*
	 * 文件上传到该目录
	 */
	private void changeDir(String dir) throws IOException {
		String sdir = serverDirs(dir);
		if(sdir == null || sdir.equals("")) {//目录不存在
			ftp.makeDirectory(dir);
			ftp.changeWorkingDirectory(dir);
		} else {
			ftp.changeWorkingDirectory(sdir);
		}
	}
	public String serverDirs(String dir) throws IOException {
		FTPFile[] dirs = ftp.mlistDir();
		if(dirs == null || dirs.length == 0) return "";
		for(FTPFile oldDir : dirs) {
			if(dir.equalsIgnoreCase(oldDir.getName())) return oldDir.getName();//这里不返回dir
		}
		return "";
	}
	
	private String formateName(String fileName) {
		String preName = "";//文件名,前缀
		String extName = "";//文件格式,后缀
		if(fileName.indexOf(".") < 0) preName = fileName;//没有格式文件
		else {
			preName = fileName.substring(0,fileName.lastIndexOf("."));
			extName = fileName.substring(fileName.lastIndexOf("."));
		}
		List<String> names = getFtpFiles("");
		int num = 1;
		while(names != null && names.contains(fileName)) {//重复文件改名
			fileName = preName + "(" + num + ")" + extName;
			num ++;
		}
		
		return fileName;
	}
	/*
	 * 获得相应目录下的所有文件
	 */
	public List<String> getFtpFiles(String path) {
		List<String> names = new ArrayList<String>();
		try {
			FTPFile[] ftpf = ftp.listFiles(path);
			for(FTPFile ff : ftpf) {
				names.add(ff.getName());
			}
		} catch (IOException ioe) {
			System.err.println(ioe.getMessage());
		}
		return names;
		
	}
}



一个测试类FtpTest.java:
package org.crm.ftp;


import java.io.File;
import java.io.IOException;


import org.junit.Test;


public class FtpTest{
	
	@Test
	public void test() {
		FtpDownload fd = new FtpDownload();
		try {
			fd.getDownloadFile("/attachment/675760a8gw1dl6d334nnxj(1).jpg", new File("d:/org.jpg"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	@Test
	public void upload() {
		FtpUpload fu = new FtpUpload();
		try {
			String path = fu.saveUploadFile(new File("d:/org.jpg"));
			System.err.println(path);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}


}





        
Android开发 之 利用commons-net-3.0.1.jar包实现FTP上传下载功能 原文链接地址: http://blog.youkuaiyun.com/ljphhj/article/details/11859593#comments 感谢作者:胖虎 无私的提供Demo,以及其在我实现过程中的指导!谢谢! 1、搭建环境 本文实现的Android访问FTP服务器,实现上传和下载的功能,是利用的Apache公司出的commons-net-3.0.1.jar包。 关于ja 阅读详情

相关推荐

Java实现FTP文件上传下载完整Demo(含可运行JAR包)

简介:在Java开发中,FTP文件传输是常见的网络操作需求。本项目提供一个基于Apache Commons Net库的完整FTP上传下载示例,包含可运行的JAR文件,帮助开发者快速掌握Java如何连接FTP服务器、进行文件上传下载、目录操作及模式设置等核心功能。通过实际代码演示,涵盖连接管理、被动模式配置、异常处理等关键环节,适用于初学者学习和集成到实际项目中。

weixin_42592399的博客 1012

jihigh自己总结

1.配置文件。

FastThinking的专栏 797

FtpClientDemo

FtpClientDemo可以上传和下载,删除等动作,非常方便。

apache提供的FTP功能

apache提供的FTP功能还算强大,最近研究了一下它的断点续传功能,写下我的收获,以供大家参考。   首先需要引入commons-net-1.4.1.jar包,该包可在http://commons.apache.org/downloads/download_net.cgi下载。   断点续传的类ContinueFTP如下: import java.io.*; import org.ap...

iteye_17234的博客 455

FTPClient使用的demo

FTPClient使用的demo,包含文档等

ftp上传案例demo(java)

ftp上传案例demo(java),实现文件上传下载,匿名文件上传下载功能。

org.apache.commons.net.ftp.FTPClient使用

org.apache.commons.net.ftp.FTPClient 暂时记录几个函数使用中的注意事项,其他以后再整理 1.  changeWorkingDirectory(String pathname) 改变工作目录,执行CWD命令这里路径名可以是包含‘/’的连续路径,如 data/upload/ 2.  storeUniqueFile(String remot

leon 5788

【电商风控】电商风控标注是什么

本篇文章给大家谈谈。

866

Android实现FTP下载文件的Demo

上一篇博客我写到了用QucikFTP在本地搭建FTP 服务器。今天,我会就写一个简单的FTP Demo 实现从本地FTP 服务器上下载文件的功能。 搭建好FTP服务器,获FTP服务器设置的参数

Maxwell的博客 1875

学习笔记( 11 ) - 解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

烟溪彭于晏的博客 2万+

Python批量注册脚本开发详细

开发一个Python批量注册脚本需要考虑多个方面,包括目标网站的注册流程、验证码处理、请求发送、数据存储等。以下是一个详细的开发流程和代码示例,用于实现基本的批量注册功能。

nsp202505的博客 3344

使用java对ftp进行文件的上传下载demo

本文引用了https://www.cnblogs.com/lr393993507/p/5502266.html资源,并做了一些优化 这里有个写好的java项目demo,csdn好像擅自给我的资源加了很多积分,我原来只设置2个,现在要7个,下面是资源的地址,如果不能用,请留言: https://pan.baidu.com/s/11DcCCdgPQKnTIg6Bhvp7Yg ek6...

qq_30307137的博客 7293

Android车载桌面开发实战:从CarLauncher源码解析到自定义Launcher开发(Android 11)

本文深入解析了Android 11中CarLauncher的源码架构与核心模块,并提供了从零开始定制开发车载Launcher的完整实战指南。内容涵盖车载桌面的独特定位、驾驶场景优化、多屏协同、动态内容嵌入等核心挑战,以及如何构建符合安全规范、体验流畅的自定义车载桌面应用,是车载应用开发者提升系统级定制能力的实用参考。

weixin_29266647的博客 515

Android FTP server 用org.apache.ftpserver实现

FtpService.java public class FtpService extends Service { private FtpServer server; private static String rootPath; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public vo...

weixin_42065195的博客 1583

Kettle安装与使用

Pentaho Data Integration作为一个端对端的数据集成平台,可以对多种数据源进行抽取(Extraction)、加载(Loading)、数据落湖(Data Lake Injection)、对数据进行各种清洗(Cleasing)、转换(Transformation)、混合(Blending),并支持多维联机分析处理(OLAP)和数据挖掘(Data mining)。勺子(spoon.bat/spoon.sh):是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。

jnrjian的博客 1万+

TypeScript版LangChain环境配置全攻略:从零搭建AI应用开发环境

大语言模型(LLM)作为当前AI应用开发的核心技术,通过API接口为开发者提供了强大的自然语言处理能力。其工作原理基于Transformer架构,通过预训练和微调实现对人类语言的深度理解与生成。在工程实践中,开发者需要将LLM与外部工具、数据源和业务逻辑有效集成,这正是LangChain框架的技术价值所在——它提供了标准化的组件和接口,简化了复杂AI应用的构建流程。应用场景涵盖智能客服、内容生成、数据分析助手等多个领域。本文聚焦于TypeScript/JavaScript生态下的LangChain开发,详细

weixin_29055699的博客 251

来一个复古的技术FTP

在升级Spring Boot框架的过程中,测试FTP下载业务时遇到问题,最终通过搭建本地FTP服务器解决。本文详细记录了在CentOS 7上安装和配置vsftpd的步骤,包括安装、启动服务、配置防火墙、修改vsftpd配置文件、创建FTP用户等。此外,还提供了Spring Boot 3的FTP-Demo代码,展示了如何通过Java代码实现FTP文件下载功能。文章最后提到,可以根据FtpUtil扩展SftpUtil的代码,以支持Sftp模式。整个过程旨在为类似需求提供参考,避免重复劳动。

窦再兴的博客 1553

Python 爬虫实战:爬取哔哩哔哩知识区,抓取高赞课程信息

哔哩哔哩(Bilibili)是一个广受欢迎的综合性视频社区,其中的知识区汇聚了大量优质的教育、科普、技术等课程内容。本文将指导读者如何使用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息,并进行数据分析。本文深入探究了利用 Python 爬虫技术从哔哩哔哩知识区抓取高赞课程信息的全流程。从前期的环境搭建、模拟登录,到核心的课程数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。通过此方法所获取的数据,能够助力创作者优化内容、用户发现优质课程、平台洞察用户需求。

u014481728的博客 1134

Apache Camel - 12 - FTP组件

Apache Camel FTP 组件 Apache Camel相关代码已经上传GitHub,需要的自取:GitHub - Apache Camel 完整Demo 如果觉得还行,麻烦点个Star   参考资料: 《Camel in Action》 Option Default value Description u...

Simba_cheng的博客 3542

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5542

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用 Apache FTPClient 实现文件上传下载功能

最近工作使用到了ftp来实现文件上传和下载功能,所以在此做一些 java 开发代码总结,以方便以后使用查询。 ftp服务器搭建配置请参考:https://blog.youkuaiyun.com/axing2015/article/details/83755143 下面直接上代码 package com.jin.demo.ftp; import org.apache.commons.net.ftp.FTP...

好记性不如烂笔头 1143

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Apache FtpServer 教程

Apache FtpServer 教程 1. 项目介绍 Apache FtpServer 是一个完全可扩展且基于Java的FTP服务器,由Apache软件基金会维护。它允许开发者自定义各种行为,如用户认证、存储管理等,以满足特定的需求。FtpServer依赖于Mina网络库,提供高性能和低延迟的连接处理。 2. 项目快速启动 安装与配置 首先确保你的系统中安装了Git和Java开发环境(JDK)。...

gitblog_00451的博客 765

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【VFS】Apache VFS: FTP

近期项目 需要同时支持 本地/FTP/SFTP/HDFS 文件系统,需要在目标文件系统 读/写 文件,很可能是 未设置被动模式,默认为主动模式,会分配端口主动连接FTP,但服务器防火墙不允许,有可能是 密码或用户名带有特殊字符,比如有@等,VFS解析时,错误截断,需要先转义。这要对 VFS设置FTP的文件名编码,代码中 getOptions 即是,可以参考。VFS 虚拟文件系统 屏蔽了不同文件系统底层差异,提供统一接口实现,导致一直连接不上,锁一直不释放。因此选用 VFS 实现。连接FTP demo。

羽殇醉月-专栏 683

Ftp服务器文件定时删除,递归删除FTP指定日期之前的文件

日常跑数的文件存放于FTP服务器需要定期删除;写一个删除FTP指定路径指定日期之前文件的工具类,后续或可应用于定时任务调度。使用到的jar包:commons-net-3.8.0.jar入参:FTP指定文件夹路径;指定日期时间代码:package com.example.demo.controller;import org.apache.commons.net.ftp.FTPClient;impor...

weixin_39619170的博客 4230
上一篇: ireport中文手册3.7版(无图)
下一篇: java中实现ftp.pdf
Y叔输得起
博客等级 码龄16年 15粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值