Quartz石英调度实现ftp文件上传

Quartz石英调度实现ftp文件上传

实现一个每月1号00点01分自动生成的文件,通过ftp传到另一台主机上

1.先创建一个job任务类FtpUploadFileJobTask

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FtpUploadFileJobTask{
    private FTPClient ftpClient;
    
    /**
         * 实现任务的方法
         */
    public void execute() {
        
        String fileName = "xxx.avl";
        String username = "username";
        String password ="password";
        //目标主机IP
        String ip = "10.200.130.23";
        int port =21;
        //上传到主机的文件路径
        String remotepath="/xxxx/src/MHTOSTA/";
        try {
            //16进制01作为数据分隔符
            byte[] b1 = {0x01};
            String b1Str = new String(b1);
            StringBuffer sb = new StringBuffer();
            String titleStr = "用户ID"+b1Str+"订单生成时间"+b1Str+"月份"+b1Str+"代理商编码"+b1Str+"推荐工号"+"\r\n";
            sb.append(titleStr);
            //内容追加省略。。。
            boolean connetFlag= getConnetFTP(ip, port, username, password, remotepath, fileName);
            if(connetFlag){
                //上传数据文件
                uploadFile(remotepath, fileName, new ByteArrayInputStream((sb.toString()).getBytes("GBK")));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //关闭连接
            ftpLogOut();
        }
    }
    
    /**
     * ftp上传文件
     * @param path
     * @param filename
     * @param input
     * @return
     */
    public boolean uploadFile(
            String path, // FTP服务器保存目录
            String filename, // 上传到FTP服务器上的文件名
            InputStream input // 输入流
    ) {
        boolean isLogin = false;
        try {
            //创建目录,转移工作目录至指定目录下
            createDirs(path);
            isLogin = this.ftpClient.storeFile(filename, input);
            if (!isLogin) {
                this.ftpClient.disconnect();
                return isLogin;
            }
            isLogin = true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (input != null)
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
        return isLogin;
    }
    /**
     * ftp链接
     *
     * @param hostname
     * @param port
     * @param username
     * @param password
     * @param path
     * @param filename
     * @return
     */
    public boolean getConnetFTP(String hostname,// FTP服务器hostname
            int port,// FTP服务器端口
            String username, // FTP登录账号
            String password, // FTP登录密码
            String path, // FTP服务器保存目录
            String filename // 上传到FTP服务器上的文件名
    ) throws IOException{
        boolean isLogin = false;
        this.ftpClient = new FTPClient();
        int reply;
        if (port > 0) {
            this.ftpClient.connect(hostname, port);// 连接FTP服务器
        } else {
            this.ftpClient.connect(hostname);
        }
        // 如果采用默认端口,可以使用ftp.connect(ftp)的方式直接连接FTP服务器
        this.ftpClient.login(username, password);// 登录
        // 检验是否连接成功
        reply = this.ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
                System.out.println("ftp链接失败>>>");
            this.ftpClient.disconnect();
            return isLogin;
        }
        //使用二进制保存方式,没有设置在linux系统下换行“\r\n”不起作用
        this.ftpClient.setFileType(this.ftpClient.BINARY_FILE_TYPE);
        isLogin = true;
        return isLogin;
    }
    /**
     * @退出关闭服务器链接
     * */
    public void ftpLogOut() {
        if (null != this.ftpClient && this.ftpClient.isConnected()) {
            try {
                boolean reuslt = this.ftpClient.logout();// 退出FTP服务器
                if (reuslt) {
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(this.ftpClient.isConnected()){
                    try {
                        this.ftpClient.disconnect();// 关闭FTP服务器的连接
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    /**
     * 创建目录
     * @param remoteUpLoadPath
     * @throws IOException
     */
    public void createDirs(String remoteUpLoadPath) throws IOException {
        String[]dirs = remoteUpLoadPath.split("/");
        //移动到linux系统的根目录下,注:这段代码在window系统上执行代码会报错。
        this.ftpClient.changeWorkingDirectory("/");
        for(String dir : dirs){
            this.ftpClient.mkd(dir);
            this.ftpClient.changeWorkingDirectory(dir);
        }
    }
}

这里仅是通过ftp在目标主机上生产文件,并把数据直接写入生成的文件中。

如果需要在项目主机上先生成文件在通过ftp传到目标主机上,则可以通过以下代码实现:

先将数据写入文件:

/**
     * 数据写入到文件
     * @param content
     */
    public void writerFileDate(String content,String fileName,boolean writeflag){
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(fileName,writeflag)));
            bw.write(content);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(bw!=null){
                    bw.close();// 关闭输出流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
/**
     * 创建文件路径,并获取文件名
     * @return
     */
    public String getCreateFile(String path,String fileName){
        File file = new File(path+fileName);
        if(!file.exists()){//文件不存在
            file.getParentFile().mkdirs();//创建文件目录
        }
        return path+fileName;
    }

调用写入数据方法

//context:数据内容
this.writerFileDate(context, this.getCreateFile(localpath,fileName),false);

生成文件后,在通过ftp传到目标主机,关键代码如下:

     FileInputStream in=null;
            try {
                in = new FileInputStream(new File(localpath + fileName));
                boolean uploadflag=uploadFile(ip, port, username,
                        password, remotepath,
                        fileName, in);
                if(uploadflag){
                    System.out.println("ftp上传文件成功>>>");
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

上传方法:

public boolean uploadFile(String hostname,// FTP服务器hostname
            int port,// FTP服务器端口
            String username, // FTP登录账号
            String password, // FTP登录密码
            String path, // FTP服务器保存目录
            String filename, // 上传到FTP服务器上的文件名
            InputStream input // 输入流
    ) {
        boolean isLogin = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            if (port > 0) {
                ftp.connect(hostname, port);// 连接FTP服务器
            } else {
                ftp.connect(hostname);//默认端口可以这样链接
            }
            // 如果采用默认端口,可以使用ftp.connect(ftp)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            // 检验是否连接成功
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return isLogin;
            }
            System.out.println("ftp链接成>>>>>>>>>>>>");
//            FTPFile[] files = ftp.listFiles();
//            for (FTPFile file : files) {
//                file.isFile();
//                file.getName();
//                file.getTimestamp();
//            }
            //创建目录,转移工作目录至指定目录下
            ftp = createDirs(path,ftp);
//            //转移工作目录至指定目录下
//            isLogin = ftp.changeWorkingDirectory(path);
//            log.info("pIsSuc:" + isLogin);
//            if (!isLogin) {
//                ftp.disconnect();
//                return isLogin;
//            }
            isLogin = ftp.storeFile(filename, input);
            if (!isLogin) {
                System.out.println("ftp上传文件失败:" + isLogin+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
                ftp.disconnect();
                return isLogin;
            }
            isLogin = true;
        } catch (FileNotFoundException e) {
        //后面代码省略。。。。

2.在applicationContext.xml中配置定时任务的时间,关键代码如下:

<!-- 定时生成报表文件 -->
   <bean id="ftpUploadFileJobTask" class="com.quartz.FtpUploadFileJobTask">
        <property name="testService">
            <ref bean="testService"/>
        </property>
    </bean>
    <bean id="ftpUploadFileJobBean"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="ftpUploadFileJobTask" />
        <property name="targetMethod" value="execute" />
    </bean>
    <bean id="ftpUploadFileQuartTime" class="org.springframework.scheduling.quartz.CronTriggerBean"
        lazy-init="false" autowire="no">
        <property name="jobDetail">
            <ref bean="ftpUploadFileJobBean" />
        </property>
        <!-- 0 1 0 1 * ?==0:秒,1:分,0:时,1:号,*:每个月,?星期几 -->
        <property name="cronExpression" value="0 1 0 1 * ?" /> <!-- 每月的1号的00点01分执行-->
    </bean>
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
            <ref bean="ftpUploadFileQuartTime"/>
            </list>
        </property>
    </bean>
时间: 2024-10-20 06:46:38

Quartz石英调度实现ftp文件上传的相关文章

FTP文件上传与下载

实现FTP文件上传与下载可以通过以下两种种方式实现,分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 [java] view plaincopy package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.n

Java使用comms-net jar包完成ftp文件上传进度的检测功能

本文章只讲述大致的思路与本次功能对应的一些开发环境,具体实现请结合自己的开发情况,仅供参考,如果有不对的地方,欢迎大家指出! 准备环境:JDK1.7 OR 1.8.eclipse.ftp服务器(可自行搭建).comms-net jar包3.3版本的.其余的就不详细列举了. 1.在现实开发中ftp服务器和项目的部署服务器基本不会是同一台,所以基础springmvc的文件上传进度获取,只能获取到文件的二进制流到达项目后台的进度.对于真实的ftp文件上传进度,需要使用comms-net提供的监听器来实

【问题分析】FTP文件上传与下载

问题描述:通常应用服务器与文件服务器分别在不同的机器上,涉及到文件的上传与下载.通过建立网络映射盘的形式,将文件服务器保存文件的文件夹映射到应用服务器的某个盘符下,经过试验,在tomcat下两台笔记本是可以实现的,但是在生产环境的websphere下试验,经过多番尝试,仍然实现不了. 问题分析:采用FTP的方式实现文件的上传与下载功能,在Java代码中编写客户端的上传与下载,在文件服务器上,直接装一个FTP服务器软件即可.注意生产环境的防火墙以及客户是否允许使用FTP. 解决方案: 工程中导入J

Java实现FTP文件上传与下载

实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.Telnet

FTP文件上传下载及验证

FTP文件上传下载及验证 有时候经常用到FTP的上传下载,本身代码相对比较简单,但有时需要考虑到文件上传下载进行验证.大体思路是上传时将FTP日志重定向到本地文件,再根据FTP返回码进行检查,这样有个缺点就是不能检验文件上传的完整性:下载时利用ls,ll命令查看是否存在. 上传代码 uploadFile() { ftp -i -v -n <<! >/tmp/ftp.log open $FTP_IP $FTP_PORT user $USER_ID $PASSWORD prompt cd $

【FTP】FTP文件上传下载-支持断点续传

Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常用)]和[ASCII_FILE_TYPE]两种; 数据连接模式:一般使用LocalPassiveMode模式,因为大部分客户端都在防火墙后面: 1. LocalPassiveMode:服务器端打开数据端口,进行数据传输: 2. LocalActiveMode:客户端打开数据端口,进行数据传输: 系统

SWFUpload插件+FTP文件上传,我这么玩

效果图: 虽然之前接触过swfupload这个上传插件,但是之前做的样子是这样的 实战项目做的这么丑爆了我估计老大的内心是会崩溃的,所以特地在网上找了美观一点的样式,原帖地址:http://www.xiariboke.com/article/200.html 原帖后台是基于php写的插件,虽然各位看官也许没学过php但是也应该见过php跑,后台改成c#代码就可以了. 前台页面是一样的,在引入一堆js文件之后,改动一下对js文件的引用路径即可,比如这样: 由于原版直接使用页面会有乱码 我也懒得测试

ftp文件上传,Java上传

package com.gx.ftp; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.apache.commons.net.ftp.FTP;

java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

//文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp try{ if(port>-1) { ftp.con