import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import com.hikvision.cms.modules.crossing.domain.UploadParameter;
import com.hikvision.cms.scaffolding.util.string.StringUtil;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
*
*
* @author 2012-6-14 上午10:21:46
* @version V1.0
* @modificationHistory=========================逻辑或功能性重大变更记录
* @modify by user: {修改人} 2012-6-14
* @modify by reason:{方法名}:{原因}
*/
public class AppcheFTP {
private static Logger logger = Logger.getLogger(AppcheFTP.class);
private static MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();//http下载支持多线程
private static HttpClient client = new HttpClient(connectionManager);
/**
* 连接登录FTP服务器,获取ftp对象
* @author 刘卓 2012-6-15 上午11:20:43
* @param ipAddr
* @param port
* @param username
* @param password
* @return
*/
public static FTPClient login(String ipAddr, int port, String username, String password) {
FTPClient client = new FTPClient();
try {
client.setConnectTimeout(1800000);// 设置超时时间
client.connect(ipAddr, port);// 连接ftp
client.login(username, password);// 登录ftp
if (FTPReply.isPositiveCompletion(client.getReplyCode())) {
// 设置编码,避免中文乱码
client.setControlEncoding("GBK");
FTPClientConfig config = new FTPClientConfig(FTPClientConfig.SYST_NT);
config.setServerLanguageCode("zh");
client.setFileType(FTPClient.BINARY_FILE_TYPE);//设置2进制传输
logger.info("FTP连接成功。");
return client;
} else {
logger.info("未连接到FTP,用户名或密码错误。");
client.disconnect();
}
} catch (SocketException e) {
logger.info("FTP的IP地址可能错误,请正确配置。" + e.getMessage());
// TODO: handle exception
} catch (IOException e) {
// TODO: handle exception
logger.info("FTP的端口错误,请正确配置。" + e.getMessage());
}
return null;
}
/**
* 检查文件夹是否存在
* @param dir
* @param ftpClient
* @return
*/
public static Boolean isDirExist(String dir, FTPClient ftpClient) {
try {
ftpClient.changeWorkingDirectory(dir);
} catch (Exception e) {
//e.printStackTrace();
return false;
}
return true;
}
/**
* 遍历ftp指定路径下的文件夹
* @author 2012-6-15 上午11:30:28
* @param client
* @param pathName
* @param ext
* @param idexsString
* @param arFiles
* @throws IOException
*/
public static void List(FTPClient client, String pathName, String ext, String idexsString, List<String> arFiles)
throws IOException {
if (pathName.startsWith("/") && pathName.endsWith("/")) {
String directory = pathName;
// 更换目录到当前目录
client.changeWorkingDirectory(directory);
FTPFile[] files = client.listFiles();
for (FTPFile file : files) {
if (file.isDirectory()) {//如果是目录
if (!file.getName().equals(".") && (!file.getName().equals(".."))) { // 注意这里的判断,否则会出现死循环!!!!
if (idexsString.indexOf(file.getName()) > -1 && file.getName().length() == 10) {
arFiles.add(directory + file.getName());
}
List(client, directory + file.getName() + "/", ext, idexsString, arFiles);//遍历
}
}
}
client.changeToParentDirectory();
}
}
/**
* 读取指定文件夹下的inf文件
* @author 2012-6-15 上午11:35:58
* @param ftpClient
* @param ftpPath
* @return
* @throws UnsupportedEncodingException
* @throws Exception
*/
public static String readConfigFileForFTP(FTPClient ftpClient, String ftpPath) throws UnsupportedEncodingException, Exception {
StringBuffer resultBuffer = new StringBuffer();
try {
ftpClient.changeWorkingDirectory(ftpPath);
FTPFile[] fs = ftpClient.listFiles();
System.out.println(fs.length);
for (FTPFile file : fs) {
InputStream in = null;
if (file.isFile() && file.getName().endsWith("inf")) {
ftpClient.enterLocalPassiveMode();
in = ftpClient.retrieveFileStream(file.getName());
ftpClient.completePendingCommand();
if (in != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(in, "GBK"));
String data = null;
try {
while ((data = br.readLine()) != null) {
resultBuffer.append(data + "\n");
}
resultBuffer.append("&" + ftpPath+",");
br.close();
} catch (IOException e) {
logger.error("文件读取错误。"+e.getMessage());
e.printStackTrace();
return null;
}
} else {
logger.error("in为空,不能读取。");
return null;
}
try {
if (null != in) {
in.close();
}
// 主动调用一次getReply()把接下来的226消费掉. 这样做是可以解决这个返回null问题
System.out.println("---------" + ftpClient.getReplyCode());
if (ftpClient.getReplyCode() == 226) {
//ftpClient.getReply();
}
} catch (Exception e2) {
logger.error("错误"+e2.getMessage());
}
}
}
} catch (FileNotFoundException e) {
return null;
} catch (SocketException e) {
logger.error("连接FTP失败."+e.getMessage());
//e.printStackTrace();
} catch (IOException e) {
logger.error("读取文件错误"+e.getMessage());
return null;
}
return resultBuffer.toString();
}
/**
* 在服务器上创建一个文件夹
* @param dir 文件夹名称,不能含有特殊字符,如 \ 、/ 、: 、* 、?、 "、 <、>...
* @throws IOException
*/
public static boolean makeDirectory(String dir,FTPClient ftpClient) throws IOException {
boolean flag = true;
flag = ftpClient.makeDirectory(dir); //创建文件夹
if (flag) {
logger.error("创建文件夹" + new String(dir.getBytes("iso-8859-1"), "GBK") + " 成功");
} else {
logger.error("创建文件夹" + new String(dir.getBytes("iso-8859-1"), "GBK") + " 失败");
}
return flag;
}
/**
* 从图片服务器下载图片
* @author 2012-5-7 下午03:37:06
* @param httpAddr
* @return
* @throws Exception
*/
public static byte[] downLoadPicture(String httpAddr){
GetMethod get = null;
try {
get = new GetMethod(httpAddr);
client.getHttpConnectionManager().getParams().setConnectionTimeout(3000);
client.executeMethod(get);
} catch (HttpException e) {
logger.info("连接图片服务器异常。");
get.releaseConnection();
client.getHttpConnectionManager().closeIdleConnections(0);
return null;
} catch (IOException e) {
logger.info("连接图片服务器异常。");
get.releaseConnection();
client.getHttpConnectionManager().closeIdleConnections(0);
return null;
}
byte[] data = null;
try {
data = get.getResponseBody();
} catch (IOException e) {
logger.info("下载图片异常。");
get.releaseConnection();
client.getHttpConnectionManager().closeIdleConnections(0);
return null;
}
get.releaseConnection();
client.getHttpConnectionManager().closeIdleConnections(0);
return data;
}
/**
*
* 关闭FTP服务
* @param ftpClient
* 客户端
* @throws IOException
*
*/
public static void closeFTPClient(FTPClient ftpClient) throws IOException {
if (ftpClient != null)
ftpClient.disconnect();
}
//判断是否有该文件
private static boolean pdFile(String filename,FTPClient ftpClient) throws IOException{
boolean flag=false;
String filenameString = new String(filename.getBytes("GBK"),"iso-8859-1");
if(ftpClient.isConnected()){
try{
FTPFile[] file=ftpClient.listFiles(filenameString);
if(file.length>0){
flag=true;
}
}catch (Exception e) {
// TODO: handle exception
}
}
return flag;
}
/**
* 上传文件
* @author 2012-7-12 下午02:14:27
* @param filename
* @param input
* @param ftpClient
* @return
* @throws Exception
*/
public static int upLoadFile(String filename,InputStream input,FTPClient ftpClient) throws Exception{
int i=0;
String filenameString = new String(filename.getBytes("GBK"),"iso-8859-1");//转码
if(ftpClient.isConnected()){
ftpClient.enterLocalPassiveMode();
try{
ftpClient.storeFile(filenameString, input);
}
catch (Exception e) {
// TODO: handle exception
logger.error("上传"+filename+"失败:",e);
i=1;
}
}else{
logger.error("未连接FTP服务器");
i=2;
}
return i;
}
public static String changTotimeString(String str){
StringBuffer stringBuffer = new StringBuffer();
if(StringUtil.isNotNullOrEmpty(str)){
String temp = str.substring(10, str.length()-1);
stringBuffer.append(temp.substring(0, 4)+"-"+temp.substring(4,6)+"-"+temp.substring(6,8));
stringBuffer.append(" "+temp.substring(8, 10)+":"+temp.substring(10, 12)+":"+temp.substring(12, 14)+":"+temp.substring(14, temp.length()));
}
return stringBuffer.toString();
}
/**
* 读取xml配置文件
* @author 2012-7-12 下午02:15:53
* @return
*/
public static UploadParameter readXmlConfig(){
Document configDoc = null;
String defaultPath = "";
try {
defaultPath = URLDecoder.decode(XmlUtil.class.getResource("/")
.getFile()
+ "upLoadVehiclealarmdata.xml", "gbk");
} catch (UnsupportedEncodingException e) {
logger.error("文件路径转码失败!", e);
}
SAXBuilder sb = new SAXBuilder();
try {
configDoc = sb.build("file:///"+defaultPath);//如果是中文路径,必须加file:///
} catch (Exception e) { // 构造文档对象
logger.error("xml文件读取失败!", e);
}
Element root = configDoc.getRootElement(); // 获取根元素
Element enable = root.getChild("EnableTask");
UploadParameter uploadParameter = new UploadParameter();
uploadParameter.setEnableTask(enable.getText().equals("true"));
uploadParameter.setFtpIP(root.getChild("ftpIP").getText());
uploadParameter.setFtpPort(root.getChild("ftpPort").getText());
uploadParameter.setUsername(root.getChild("userName").getText());
uploadParameter.setDbPasswd(root.getChild("passWd").getText());
return uploadParameter;
}
/**
* 压缩图片到固定的尺寸
* @author 2012-7-26 下午01:55:42
* @param inputStream
* @param width
* @param height
* @return
*/
public static ByteArrayInputStream imageScale(InputStream inputStream, int width, int height) {
try {
Image image = javax.imageio.ImageIO.read(inputStream); //从输入流读取图片
image = image.getScaledInstance(width, height,
Image.SCALE_FAST);
BufferedImage mBufferedImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
mBufferedImage.getGraphics().drawImage(
image, 0, 0, null);
OutputStream out = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); //以流的方式输出图片
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(mBufferedImage);
param.setQuality(0.5f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(mBufferedImage);
/**
* 将outputStream 转为inputStream
*/
ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos=(ByteArrayOutputStream) out;
ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray()); //将输出流转为输入流
out.close(); //关闭流
out=null;
return swapStream;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
try{
String server = "10.64.52.15";
String user = "admin";
String passWord = "12345";
System.out.println("begin connect!");
FTPClient ftpClient = AppcheFTP.login("10.64.52.15", 21, "admin", "12345");
System.out.println("connect success!");
try{
// 设置编码,避免中文乱码
String savefilename = new String("20110101".getBytes("GBK"),"iso-8859-1");
if(ftpClient.changeWorkingDirectory(savefilename)){
System.out.println("weee");
}else{
AppcheFTP.makeDirectory(savefilename, ftpClient);
}
//createDir(savefilename,ftpClient);
}catch (Exception e) {
e.printStackTrace();
}
AppcheFTP.closeFTPClient(ftpClient);
System.out.println("close success!");
}catch(UnknownHostException e){
System.out.println("java.net.UnknownHostException");
}catch(IOException e){
System.out.println("test!");
}
}
分享到:
相关推荐
4. **多平台支持**:Apache FTPServer可以在多种操作系统上运行,包括Windows、Linux、Unix等。 5. **强大的配置能力**:通过XML配置文件,管理员可以精细地控制FTP服务器的行为,例如设置用户权限、限制速度、配置...
Apache FTPServer:Apache 软件基金会开发的一款 FTP 服务器,支持多种操作系统,功能强大、灵活。 FileZilla Server:一个免费的 FTP 服务器,支持多种操作系统,易于使用。 VSFTP:一个安全、稳定的 FTP 服务器...
这个库提供了丰富的API,支持基本的FTP操作,如连接、登录、上传、下载、删除文件,以及断点续传和处理中文文件名的功能。断点续传在大文件传输中尤为重要,它可以避免因网络问题中断传输后从头开始。实现断点续传的...
你可以查看并学习如何实现FTP协议,如何处理用户认证,以及如何处理文件上传和下载等操作。 在深入研究Apache Ftpserver时,你还需要了解以下关键概念: 1. **模块化设计**:Apache Ftpserver的模块化结构允许你...
使用这些JAR文件,开发者可以构建一个功能齐全的FTP客户端,能够方便地执行各种FTP操作。例如,通过`commons-net-1.4.1.jar`中的`FTPClient`对象,可以建立与FTP服务器的连接,然后使用`login()`方法登录,`change...
例如,对于 Apache FTP Server 1.0.5 版本,可以根据不同的操作系统选择对应的安装包。 2. **安装** - **Linux/Unix系统**:使用命令 `tar -xzvf ftpserver-1.0.5.tar.gz` 进行解压安装。 - **Windows系统**:...
Apache Ftp Server是一款开源的FTP服务器软件,基于Java平台,由Apache软件基金会开发。它提供了高度可配置性和灵活性,使得用户可以根据自身需求定制FTP服务。本文将深入探讨Apache Ftp Server的使用方法,包括安装...
这个库提供了FTP客户端功能,允许Java程序连接到FTP服务器,执行上传、下载、列表文件等操作。它的使用方式与Apache FtpServer类似,需要添加依赖并调用相应的API方法。 总结起来,Apache FtpServer是Java开发人员...
启动Apache FTP Server的方法因操作系统而异: - **Linux**: ```bash cd %FTP_HOME% bin/ftpd.sh res/conf/ftpd-full.xml ``` - **Windows**: ```bash cd %FTP_HOME% bin/ftpd.bat res/conf/ftpd-full.xml ...
Apache FTP Server是一个开源的FTP服务器,它允许用户通过FTP协议上传、下载文件。这个服务器是用Java语言编写的,因此可以在任何支持Java的平台上运行,包括Windows、Linux、Unix等操作系统。Apache FTP Server的...
这个特定的压缩包“apache-ftpserver-1.1.1.zip”包含了该服务器软件的v1.1.1版本,适用于Linux和Windows操作系统。FTP服务器的主要作用是为用户提供一个安全、可靠的文件上传和下载服务。 Apache FTPServer的特性...
Apache FTPServer是一个开源的FTP服务器项目,它提供了一个强大、灵活且可扩展的平台来管理文件传输服务。这个服务器是基于Java实现的,因此具备跨平台性,可以在多种操作系统上运行,包括Windows、Linux和Mac OS等...
然后,可以通过Apache Commons Net提供的`FTPClient`和`FTPSClient`类来创建FTP客户端,实现文件上传、下载、删除等操作。对于服务器端,可以利用FTPServer API来配置和启动FTP服务,设置用户权限,以及处理客户端...
Java中的Apache FtpServer库为开发人员提供了一个强大的框架,用于在Java应用程序中轻松地创建和管理FTP服务器。Apache FtpServer提供了丰富的API,可以定制服务器的行为,满足各种需求。本篇文章将深入探讨如何利用...
Apache FTP工具库提供了丰富的API,支持基本的FTP操作,如连接、断开、登录、列出目录内容、上传文件、下载文件、创建删除目录等。此外,它还支持更高级的功能,如被动模式、主动模式、二进制或文本模式的文件传输,...
Apache FTPServer是一个开源的FTP服务器项目,源自Apache MINA项目,提供了一种高效且可扩展的方式来实现FTP(文件传输协议)服务。这个"apache-ftpserver-1.0.6"版本是该软件的一个特定发布版,包含了在该版本中所...
Apache FTPClient操作FTP工具类
总结,Apache Commons Net的FTP工具类为Java开发者提供了便利的FTP操作接口,可以轻松地进行文件传输和目录管理。通过阅读`FtpUtil.java`和`FtpConfig.java`源码,我们可以了解如何在实际项目中利用这些功能来实现...
Apache Camel 提供了 FTP 组件,使得在 Camel 路由中集成 FTP 功能变得简单高效。 在 Apache Camel 的 FTP 组件中,你可以实现以下功能: 1. **连接到 FTP 服务器**:通过配置 FTP 客户端参数,如主机名、端口、...