设为首页 收藏本站
查看: 631|回复: 0

[经验分享] FTP上传文件,Apache篇

[复制链接]

尚未签到

发表于 2015-11-14 08:53:53 | 显示全部楼层 |阅读模式
  前段时间做了个任务,是公司liunx机器上有个公司静态网站的文件夹,因为不定期的修改,修改完之后要同步到FTP服务器上,之前一直是手动使用FTP工具来同步,我的任务是开发一个能够同步静态网站的action,集成到ETL工具中,然后每天会自动运行这个action,这样就避免手动同步了。
  之前没有做过FTP上传,百度之,做FTP上传有两个类库,一个sun的FtpClient,不过sun是不推荐使用这个类库的,而且引入的时候要指定rule,另一个是Apache的FTPClient,我先使用了sun的,出现了一些问题,没有找到解决方案,本文主要说明的是使用Apache的工具类,关于sun的FtpClient,会在下一篇文章中说明。
  其实主要就是干4个事情:
  1. 初始化参数
  2. 连接ftp
  3. 拷贝文件,有可能是递归,因为文件夹下包含目录
  4. 断开ftp连接
  每次同步只是同步更新文件,所以我把同步时间记录在一个文件里,放在本地,上传文件的时候判断该文件的更新时间是否大于上次的同步时间。
  还有就是FTPClient的storeFile()方法,需要两个参数,一个是文件名,另一个是输入流,这样我就无法控制它的缓冲区大小,拷入源码追踪了一个,它的缓冲区字节是在Utils中定义的,默认是1024,我给它改成了1024 × 64的,然后重新编译回去。
  还有一个方法是storeFileStream()方法,它会返回一个OutputStream,不过如果该文件不存在的话,返回的是null,我没有找到创建文件的方式,很遗憾。
  下面贴代码,主要看copyDirectory方法。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
/**
* 向ftp同步静态网站(ftp上传)
* @author gaoshuang
*
*/
public class SynchronizeWebsiteAction implements IETLAction {
/**
* 同步文件计数
*/
private int num;
/**
* 本地文件路径
*/
private String localPath;
/**
* ftp地址
*/
private String ipAdress;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* ftp文件路径
*/
private String ftpPath;
/**
* 上次更新时间
*/
private long lastUpdate;
/**
* ftp连接
*/
private FTPClient ftp;
public void addAdapter(String name, int type, ISourceAdapter adapter,
String description) {
}
/**
* 入口方法
*/
public void execute(String params, ETLContext context) throws Exception {
init(params);
connect();
copyDirectory(localPath, ftpPath);
disConnect();
// 记录本次更新时间
OutputStream os = new FileOutputStream(localPath + "/lastUpdate.txt");
os.write((System.currentTimeMillis() + "").getBytes());
}
/**
* 初始化
* @param params action参数
* @throws NumberFormatException
* @throws IOException
*/
private void init(String params) throws NumberFormatException, IOException {
String[] paths = params.split(",");
localPath = paths[0];
String[] ftpInfo = paths[1].split(";");
ipAdress = ftpInfo[0];
username = ftpInfo[1];
password = ftpInfo[2];
ftpPath = ftpInfo[3];
lastUpdate = getLastUpdate();
}
/**
* 得到上次更新时间
* @return
* @throws NumberFormatException
* @throws IOException
*/
private long getLastUpdate() throws NumberFormatException, IOException {
File file = new File(localPath + "/lastUpdate.txt");
long time = 0;
if(file.exists()) {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
time = Long.parseLong(br.readLine());
}
return time;
}
/**
* 拷贝目录
* @param srcDirectoryPath 源
* @param destDirectoryPath 目标
* @throws IOException
*/
public void copyDirectory(String srcDirectoryPath, String destDirectoryPath) throws IOException {
// 创建不存在的目录
reConnect();
ftp.makeDirectory(destDirectoryPath);
File src = new File(srcDirectoryPath);
File[] allFile = src.listFiles(); // 取得当前文件夹下的所有文件,包括目录
String srcName = "";
// 拷貝文件
for (int currentFile = 0; currentFile < allFile.length; currentFile&#43;&#43;) {
if (!allFile[currentFile].isDirectory()) {
// 如果是文件是采用处理文件的方式
srcName = allFile[currentFile].toString();
Logger.debug(&quot;开始上传文件到&quot; &#43; destDirectoryPath &#43; &quot;/&quot; &#43; allFile[currentFile].getName());
copyFile(srcName, destDirectoryPath, allFile[currentFile].getName());
} else {
// 如果是目录就采用递归处理
Logger.debug(destDirectoryPath &#43; &quot;/&quot; &#43; allFile[currentFile].getName().toString());
copyDirectory(allFile[currentFile].getPath().toString(), destDirectoryPath &#43; &quot;/&quot; &#43; allFile[currentFile].getName().toString());
}
}
}
/**
* 连接失去的时候重新连接
* @throws IOException
*/
private void reConnect() throws IOException {
while(!ftp.isConnected()) {
connect();
}
}
/**
* 拷贝文件
* @param src
* @param dest
* @throws IOException
*/
private void copyFile(String src, String dirPath, String fileName) throws IOException{
File file = new File(src);
if(file.lastModified() > lastUpdate && file.length() != 0) {
reConnect();
InputStream is = new FileInputStream(file);
ftp.setControlEncoding(&quot;GBK&quot;);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.changeWorkingDirectory(dirPath);
ftp.storeFile(fileName, is);
is.close();
Logger.debug(&quot;上传文件到&quot; &#43; &quot;&quot; &#43; dirPath &#43; &quot;/&quot; &#43; fileName &#43; &quot;成功,这是第&quot; &#43; &#43;&#43;num &#43; &quot;个&quot;);
}
}
/**
* 连接ftp服务器
* @throws IOException
*/
private void connect() throws IOException {
ftp = new FTPClient();
ftp.connect(ipAdress);
ftp.login(username, password);
}
/**
* 关闭连接
* @param ftp
* @throws IOException
*/
private void disConnect() throws IOException {
ftp.disconnect();
}
}

        可以发现,我没有做断点续传的功能,这也是程序中的一个缺陷,我会尽快完善,谢谢,发现代码有可改进之处,欢迎指出。
  

版权声明:本文为博主原创文章,转载请注明出处http://blog.iyunv.com/ghsau。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-139000-1-1.html 上篇帖子: Apache 2.2.25 + PHP 5.3.10 + MySQL 5.5 + Zend Studio v10.6 下篇帖子: [转]ModSecurity for Apache 1.8.7 用户手册
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表