首页 > 解决方案 > 使用 Java 在 FTP 服务器中解压缩文件

问题描述

我正在尝试在 FTP 位置解压缩文件,但是当我解压缩时,我无法获取 FTP 服务器中的所有文件,但是当我尝试将文件解压缩到本地计算机的代码时,它正在工作。我确定在将数据写入 FTP 的某个地方我遗漏了一些东西。下面是我的代码。请帮助我。

public void unzipFile(String inputFilePath, String outputFilePath) throws SocketException, IOException {

    FileInputStream fis = null;
    ZipInputStream zipIs = null;
    ZipEntry zEntry = null;

    InputStream in = null;
    FTPClient ftpClientinput = new FTPClient();
    
    FTPClient ftpClientoutput = new FTPClient();

    String ftpUrl = "ftp://%s:%s@%s/%s;type=i";

    ftpClientinput.connect(server, port);
    ftpClientinput.login(user, pass);
    ftpClientinput.enterLocalPassiveMode();
    ftpClientinput.setFileType(FTP.BINARY_FILE_TYPE);
    String uploadPath = "path";
    
    ftpClientoutput.connect(server, port);
    ftpClientoutput.login(user, pass);
    ftpClientoutput.enterLocalPassiveMode();
    ftpClientoutput.setFileType(FTP.BINARY_FILE_TYPE);
    
    

    try {

        // fis = new FileInputStream(inputFilePath);

        String inputFile = "/Srikanth/RecordatiFRA_expenses.zip";
        String outputFile = "/Srikanth/FR/";

        in = ftpClientinput.retrieveFileStream(inputFile);

        zipIs = new ZipInputStream(new BufferedInputStream(in));
        while ((zEntry = zipIs.getNextEntry()) != null) {
            try {
                byte[] buffer = new byte[4 * 8192];
                FileOutputStream fos = null;

                OutputStream out = null;

                // String opFilePath = outputFilePath + zEntry.getName();

                String FTPFilePath = outputFile + zEntry.getName();

                // System.out.println("Extracting file to "+opFilePath);

                System.out.println("Extracting file to " + FTPFilePath);

                // fos = new FileOutputStream(opFilePath);
                out = ftpClientoutput.storeFileStream(FTPFilePath);

                // System.out.println(out);

                int size;
                while ((size = zipIs.read(buffer, 0, buffer.length)) != -1) {

                    // fos.write(buffer, 0 , size);

                    out.write(buffer, 0, size);

                }
                // fos.flush();
                // fos.close();
            } catch (Exception ex) {
                ex.getMessage();
            }
        }
        zipIs.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        try {
            if (ftpClientinput.isConnected()) {
                ftpClientinput.logout();
                ftpClientinput.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

标签: java

解决方案


这种方法会做你想做的事,你可以随意调整它。

我清理并删除了很多你不需要的;需要注意的一件事是使用 try-with-resources 块,而不是在远离使用它们的地方声明局部变量。

您的主要错误是您需要completePendingCommand按照其文档中所述的某些方法进行调用。请记住阅读有关您第一次使用的方法的文档。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public static void unzipFTP(String server, int port, String user, String pass, String ftpPath)
        throws SocketException, IOException {

    FTPClient ftp = new FTPClient();
    ftp.connect(server, port);
    ftp.login(user, pass);
    ftp.enterLocalPassiveMode();
    ftp.setFileType(FTP.BINARY_FILE_TYPE);

    try (InputStream ftpIn = ftp.retrieveFileStream(ftpPath);
            ZipInputStream zipIn = new ZipInputStream(ftpIn);) {
        // complete and verify the retrieve
        if (!ftp.completePendingCommand()) {
            throw new IOException(ftp.getReplyString());
        }

        // make the output un-zipped directory, should be unique sibling of the target zip
        String outDir = ftpPath + "-" + System.currentTimeMillis() + "/";
        ftp.makeDirectory(outDir);
        if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
            throw new IOException(ftp.getReplyString());
        }

        // write the un-zipped entries
        ZipEntry zEntry;
        while ((zEntry = zipIn.getNextEntry()) != null) {
            try (OutputStream out = ftp.storeFileStream(outDir + zEntry.getName());) {
                zipIn.transferTo(out);
            }
            if (!ftp.completePendingCommand()) {
                throw new IOException(ftp.getReplyString());
            }
        }
    } finally {
        try {
            if (ftp.isConnected()) {
                ftp.logout();
                ftp.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

推荐阅读