ftp上传下载-----打包下载、以流的形式传到前台页面

本文介绍了一个实用的FTP文件操作工具类,包括连接FTP服务器、上传文件、下载文件及文件夹压缩下载等功能,并提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.zhph.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

import com.zhph.vo.cases.FileAttachment;

public class FtpUtil {

    private static Logger logger = Logger.getLogger(FtpUtil.class.getName ()) ;

    private static FTPClient ftp;

    public static boolean connectFtpClient() throws Exception{

    boolean flag=false;
    //ftp服务器登录凭证
    String ftpHost=ConfigHelper.getPropertiseValueFromContext("ftpHost");// FTP服务器host
    int port=Integer.parseInt(ConfigHelper.getPropertiseValueFromContext("ftpPort"));// FTP服务器端口
    String username=ConfigHelper.getPropertiseValueFromContext("ftpUserName");// FTP登录账号
    String password=ConfigHelper.getPropertiseValueFromContext("ftpPassword");// FTP登录密码

        ftp = new FTPClient();
        ftp.setControlEncoding("GBK");
        int reply;
        ftp.setConnectTimeout(10000);
        ftp.connect(ftpHost, port);// 连接FTP服务器
        // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
        ftp.login(username, password);// 登录
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {

            ftp.disconnect();
            logger.info("FTP server refused connection.");
            return flag;
        }

        //设置PassiveMode传输   设为被动 
        ftp.enterLocalPassiveMode();

        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

        flag=true;
        return flag;
    }

    /**
     * 关闭ftp连接
     */
    public static void closeFtp(){
        if (ftp!=null && ftp.isConnected()) {
            try {
                ftp.logout();
                ftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Description: 向FTP服务器上传文件
     * @Version      1.0
     * @param path  FTP服务器保存目录
     * @param filename  上传到FTP服务器上的文件名
     * @param input   输入流
     * @return 成功返回true,否则返回false *
     */
    public static boolean uploadFile(
            String path, // FTP服务器保存目录
            String filename, // 上传到FTP服务器上的文件名
            InputStream input // 输入流
    ){
        boolean result = false;

        try {


            if(connectFtpClient()){

            if(!StringHelper.isEmptyString(path)){

            String[] paths = path.split("/");

            for(int i=0;i<paths.length;i++){

                if(!ftp.changeWorkingDirectory(paths[i])){

                    ftp.makeDirectory(paths[i]);

                    ftp.changeWorkingDirectory(paths[i]);

                }
            }

            }else{

                ftp.makeDirectory(path);

                ftp.changeWorkingDirectory(path);
            }

            if(!ftp.storeFile(filename, input)){

                logger.info("无读写权限:"+filename);

                return result;
            }

            input.close();

            result = true;

            }
        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeFtp();
        }
        return result;
    }

    /**
     * ftp文件下载
     * ypg 2017-3-10
     * @param request
     * @param response
     * @param txtFileDir
     */
    public static void downFile(HttpServletRequest request, HttpServletResponse response,FileAttachment fileAttachment){
        logger.info(new Date()+"  开始进入ftpDownload下载");
            try
            {
                if(connectFtpClient()){

                //检索ftp目录下所有的文件,利用时间字符串进行过滤
                boolean dir = ftp.changeWorkingDirectory(fileAttachment.getFileAttachmentPath());
                if (dir) 
                { 
                    FTPFile[]fs = ftp.listFiles(); 
                    for(FTPFile f:fs)
                    { 
                       if(f.getName().equals(fileAttachment.getFileAttachmentName()))
                       {  

                         response.reset();
                         response.addHeader("Content-Disposition", "attachment;filename=" + new             String(fileAttachment.getFileAttachmentTitle().replaceAll(" ", "").getBytes("utf-8"), "iso8859-1"));
                         response.addHeader("Content-Length", "" + f.getSize());
                         OutputStream os = new BufferedOutputStream(response.getOutputStream());
                         response.setContentType("application/octet-stream");
                         ftp.retrieveFile(f.getName(),os);
                         os.flush();
                         os.close();
                         logger.info(new Date()+"  ftpDownload下载文件成功");  
                      }
                    }
                }
              }
            } 
            catch (Exception e)
            {
                e.printStackTrace();
                logger.info(new Date()+"  ftpDownload下载文件发生错误");
            }
            finally
            {
                closeFtp();  
            }
             }
    /**
     * ftp文件打包zip下载
     * ypg 2017-3-10
     * @param request
     * @param response
     * @param txtFileDir
     */
    public static void downZipFile(HttpServletRequest request, HttpServletResponse response,List<FileAttachment> fileAttachments){
        logger.info(new Date()+"  开始进入ftpZipDownload下载");
        File tempFile =null;
        ZipOutputStream out =null;
         String directory=Files_Utils_DG.getTempAbsolutePath(request, ConfigHelper.getPropertiseValueFromContext("temp.download.path"));
         File fileDirectory=new File(directory);
        try
            {
            tempFile = File.createTempFile(UUID.randomUUID().toString(), ".zip", fileDirectory);
            if(connectFtpClient()){

                InputStream inputStream;

                byte[] buf = new byte[1024];
                // Create the ZIP file  
              // ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
             out = new ZipOutputStream(new FileOutputStream(tempFile));  
            for(FileAttachment fileAttachment:fileAttachments){ 
                //检索ftp目录下所有的文件,利用时间字符串进行过滤
                boolean dir = ftp.changeWorkingDirectory(fileAttachment.getFileAttachmentPath());
                if (dir) 
                { 

                    FTPFile[]fs = ftp.listFiles(); 
                    for(FTPFile f:fs)
                    { 
                       if(f.getName().equals(fileAttachment.getFileAttachmentName()))
                       {  
                           out.putNextEntry(new ZipEntry(fileAttachment.getFileAttachmentTitle()));
                           ftp.retrieveFile(f.getName(),out);
                           out.closeEntry();
                         logger.info(new Date()+"  ftpZipDownload打包文件"+f.getName());  
                      }
                    }
                    logger.info(new Date()+"  ftpZipDownload下载文件至"+directory);  
                }
            }

                    response.reset();
                    // 先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,这个文件名称用于浏览器的下载框中自动显示的文件名
                    response.addHeader("Content-Disposition", "attachment;filename=" + new String(tempFile.getName().replaceAll(" ", "").getBytes("utf-8"), "iso8859-1"));
                    response.addHeader("Content-Length", "" + tempFile.length());
                    response.setContentType("application/octet-stream");
                    OutputStream os = new BufferedOutputStream(response.getOutputStream());

                    inputStream = new BufferedInputStream(new FileInputStream(tempFile));

                    int len;     
                    while ((len = inputStream.read(buf)) > 0) {     
                        os.write(buf, 0, len);     
                    }
                    os.flush();
                    //一定要关闭流
                    os.close();
                    inputStream.close();

                    logger.info(new Date()+"  ftpZipDownload下载文件成功:"+tempFile.getName());  


            }



            }catch (Exception e)
            {
                e.printStackTrace();
                logger.info(new Date()+"  ftpDownload下载文件发生错误");
            }
            finally
            {
                closeFtp();
                if(out!=null){
                   try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                }
                logger.info("删除文件:"+tempFile.delete());
            }
           }
           /**
             * ftp文件下载展示
            * ypg 2017-3-10
            * @param request
            * @param response
           * @param txtFileDir
           */
           public static void downFileDisplay(HttpServletRequest request, HttpServletResponse                                              response,FileAttachment fileAttachment,String contenType){ 
                        logger.info(new Date()+"  开始进入ftpDownload下载");
            try
            {
                if(connectFtpClient()){

                //检索ftp目录下所有的文件,利用时间字符串进行过滤
                boolean dir = ftp.changeWorkingDirectory(fileAttachment.getFileAttachmentPath());
                if (dir) 
                { 
                    FTPFile[]fs = ftp.listFiles(); 
                    for(FTPFile f:fs)
                    { 
                       if(f.getName().equals(fileAttachment.getFileAttachmentName()))
                       {  

                         response.setHeader("Content-Type",contenType);
                         OutputStream os = new BufferedOutputStream(response.getOutputStream());
                         ftp.retrieveFile(f.getName(),os);
                         os.flush();
                         os.close();
                         logger.info(new Date()+"  ftpDownload下载文件成功");  
                      }
                    }
                }
              }
            } 
            catch (Exception e)
            {
                e.printStackTrace();
                logger.info(new Date()+"  ftpDownload下载文件发生错误");
            }
            finally
            {
                closeFtp();  
            }
         }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值