ftp上传下载附件

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

public class FtpUtil {
    
    // 创建FTPClient对象
    private int maxSize = 10240;//lt20140320 用于控制上传文件流的最大限制,单位是kb,页面显示限制为10M
    private FTPClient ftp = new FTPClient();
    private final static Logger logger = Logger.getLogger(FtpUtil.class);
    
    /**
      * Description: 向FTP服务器上传文件
      * @param url FTP服务器hostname
      * @param port FTP服务器端口
      * @param username FTP登录账号
      * @param password FTP登录密码
      * @param path FTP服务器保存目录
      * @param filename 上传到FTP服务器上的文件名
      * @param input    输入流
      * @return 成功返回true,否则返回false
      */
     public boolean uploadFile(String url, int port, String username,
        String password, String path, String filename, InputStream input) {
        // 初始表示上传失败
        boolean success = false;
        
        // 创建FTPClient对象
        try {
            int reply;
            // 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.connect(url, port);
            
            //lt20140320 控制文件流的最大限制,页面显示限制为10M
            ftp.setBufferSize(maxSize);
            
            // 登录ftp
            ftp.login(username, password);
            
            // 看返回的值是不是230,如果是,表示登陆成功
            reply = ftp.getReplyCode();
            
            // 以2开头的返回值就会为真
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            
            //验证是否有该文件夹,有就转到,没有创建后转到根目录下
            if (path != null && !"".equals(path)) {
                if (!ftp.changeWorkingDirectory(path)) {
                    mkdirs(path);
                    
                    if(!ftp.changeWorkingDirectory(path)){
                        logger.warn("ftp changeWorkingDirectory failed. path:"+path);
                    }
                }
            }
            
            // 转到指定上传目录
            //ftp.changeWorkingDirectory(path);
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//关键,必加,否则按照默认的ascii上传,会出现文件损坏的现象  

            // 将上传文件存储到指定目录
            ftp.storeFile(filename, input);
            
            // 退出ftp
            ftp.logout();
            
            // 表示上传成功
            success = true;
        } catch (IOException e) {
            logger.error(e);
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
            if (input !=null) {
                // 关闭输入流
                try {
                    input.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
        return success;
    }
    
     /**
      * 在服务器上建目录,中间目录不存在也自动创建
      * @param path
      */
    private boolean mkdirs(String path) throws IOException {
        int index = 0;
        String pathToMake = null;
        boolean result =  false;
        
        //父目录
        while((index = path.indexOf('/', index+1)) > 0){
            pathToMake = path.substring(0,index);
            result = ftp.makeDirectory(pathToMake);
            if(!result){
                logger.debug("ftp makeDirectory failed. path:"+pathToMake);
            }
        }
        
        //目标目录
        result = ftp.makeDirectory(path);
        if(!result){
            logger.warn("ftp makeDirectory failed. path:"+path);
        }
        
        return result;
    }

    /**
     * @param url ftp服务器ip地址
     * @param port ftp端口
     * @param username 用户名
     * @param password 密码
     * @param filePath 删除文件路径
     * @param fileName 要删除文件名
     * @return
     */
    public boolean deleteFile(String url, int port, String username,
            String password, String filePath, String fileName) {
        
        // 初始表示下载失败
        boolean success = false;

        try {
            int reply;
            // 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.connect(url, port);
            // 登录ftp
            ftp.login(username, password);
            reply = ftp.getReplyCode();
            
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            
            // 转到指定下载目录
            if (filePath != null) {//验证是否有该文件夹,有就转到,没有创建后转到该目录下  
                if (!ftp.changeWorkingDirectory(filePath)) {  
                    return success;
                }
            }

            String fn = toFtpFilename(fileName);
            
            // 删除文件
            success = ftp.deleteFile(filePath + "/" + fn);
            
            // 退出ftp
            ftp.logout();
        } catch (Exception e) {
            logger.error(e);
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }

    private String toFtpFilename(String fileName) throws Exception {
        return new String(fileName.getBytes("GBK"),"ISO8859-1");
    }

    /**
      * Description: 从FTP服务器下载文件
      * @param url  FTP服务器hostname
      * @param port   FTP服务器端口
      * @param username  FTP登录账号
      * @param password   FTP登录密码
      * @param remotePath   FTP服务器上的相对路径
      * @param fileName  要下载的文件名
      * @param localPath  下载后保存到本地的路径
      * @return
      */
    public boolean downFileFromFtp(String url, int port, String username,
            String password, String remotePath, String fileName, String localPath) {
        // 初始表示下载失败
        boolean success = false;
        OutputStream is = null;
        
        try {
            int reply;
            // 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.connect(url, port);
            // 登录ftp
            ftp.login(username, password);
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            // 转到指定下载目录
            if (remotePath != null) {//验证是否有该文件夹,有就转到,没有创建后转到该目录下  
                if (!ftp.changeWorkingDirectory(remotePath)) {  
                    return success;
                }
            }
            
            //2015/4/28 不需要遍历,改为直接用文件名取
            String fn = toFtpFilename(fileName);
            
            // 根据绝对路径初始化文件
            File localFile = new File(localPath + "/" + fileName);
            
            // 输出流
            is = new FileOutputStream(localFile);
            
            // 下载文件
            boolean retrieveResult = ftp.retrieveFile(fn, is);
            if(!retrieveResult) {
                return success;
            }
            
            is.close();
            
            // 退出ftp
            ftp.logout();
            
            // 下载成功
            success = true;
            return success;
        } catch (Exception e) {
            logger.error(e);
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
            
            try {
                if(is != null) is.close();
            } catch (Exception e2) {
            }
        }
        return success;
    }
    
    /**
     * 提供一个开放的logout接口
     * @throws IOException
     */
    public void ftpLogout() throws IOException{
        this.ftp.logout();
    }
    
    public int getMaxSize() {
        return maxSize;
    }

    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }
}

 

package com.huntto.hii.ydzf.util;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;
import org.dom4j.Document;
import org.dom4j.Element;

import com.huntto.hii.webapp.action.BaseAction;
import com.huntto.hii.webapp.ftp.FtpUtil;
import com.huntto.hii.webapp.util.Dom4jUtils;


/**
 * ftp配置文件
 * @author li.di
 *
 */
public class Ydzf_UploadPdf {
    private String ip;// ftp服务器ip
    private int port;
    private String username;
    private String password;
    private String path;
    private static final String FTPCONFIG = "ftpConfiguration.xml";
    public static final String FileDownloadTempDir = ServletActionContext.getServletContext().getRealPath("/wenshu_pdf/");
    
    public void initFtpServerParamsFromConfig() {
        String xmlPath = BaseAction.class.getClassLoader().getResource("/").getPath() + FTPCONFIG;
        if(xmlPath.contains("%20")){
            xmlPath = xmlPath.replaceAll("%20", " ");
        }
        Document doc = Dom4jUtils.File2Document(xmlPath);
        Element root = doc.getRootElement();
        this.ip = root.element("ip").getText();
        this.port = Integer.valueOf(root.element("port").getText());
        this.username = root.element("username").getText();
        this.password = root.element("password").getText();
        this.path = root.element("path").getText();
    }
    /**
     * 上传到FTP服务器上,服务器的配置查看ftpConfiguration.xml文件
     * @param fileName 上传的文件名
     * @param inputStream 要上传的文件输入流
     * @param uploadModule 上传的模块,比如投诉举报传入“TSJB”
     * @param identifer 上传附件到具体的文件夹名
     * @return flag 上传是否成功
     * @throws Exception
     */
    protected boolean fileUploadtoFtpServer(String fileName, InputStream inputStream, String uploadModule, String identifer) throws Exception{
        this.initFtpServerParamsFromConfig();
        boolean flag=false;
        try {
            path = "/"+uploadModule+"/"+identifer;
            FtpUtil ftpUtil = new FtpUtil();
            String fiName = new String(fileName.getBytes(), "ISO8859-1");
            flag = ftpUtil.uploadFile(ip, port, username, password,
                    path, fiName, inputStream);
            System.out.println("附件上传成功?——"+flag);
            return flag;
        } catch (Exception e) {
            e.printStackTrace();
            return flag;
        }
    }
    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public static String getFiledownloadtempdir() {
        return FileDownloadTempDir;
    }
}

 

 

posted on 2016-04-22 14:03  火玉  阅读(397)  评论(0编辑  收藏  举报