【问题标题】:Android Unzipping file from ftp throw "data error" and "CRC mismatch" errorAndroid 从 ftp 解压文件抛出“数据错误”和“CRC 不匹配”错误
【发布时间】:2013-12-23 12:56:03
【问题描述】:

(首先我是新来的,我的英语不是很好,所以我想为我的写作能力不佳道歉)

我正在开发一个从公共 FTP 服务器读取一些 .zip 文件并从中获取内容的 Android 项目。我正在使用 org.apache.commons.net.ftp 库连接到 ftp。

我可以列出来自服务器的所有 .zip 文件,但是当我尝试列出内容时,我开始遇到问题。有些文件很好,但在某些情况下我无法阅读整个 zip 内容。

这是我用来连接 ftp 的代码的一部分:

private static final String TAG = "MyFTPClient";
public FTPClient mFTPClient = null; 

//Method to connect to FTP server:
public boolean ftpConnect(String host, String username, String password, int port) {
    try {
        mFTPClient = new FTPClient();        
        // connecting to the host
        mFTPClient.connect(host);
        // now check the reply code, if positive mean connection success
        if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
            // login using username & password
            boolean status = mFTPClient.login(username, password);
            /* Set File Transfer Mode
             *
             * To avoid corruption issue you must specified a correct
             * transfer mode, such as ASCII_FILE_TYPE, BINARY_FILE_TYPE,
             * EBCDIC_FILE_TYPE .etc. Here, I use BINARY_FILE_TYPE
             * for transferring text, image, and compressed files.
            */
            mFTPClient.setFileType(FTP.ASCII_FILE_TYPE);
            mFTPClient.enterLocalPassiveMode();

            return status;

        }
    } catch(Exception e) {
        Log.d(TAG, "Error: could not connect to host " + host );
        Log.d(TAG, e.toString());
    }

    return false;
} 

这是我用来从 .zip 中列出文件名的代码:

    public ArrayList<String> ftpZipRetrieveFilesTitles(String filePath) throws IOException{
    ZipInputStream zis = null;
    ArrayList<String> fitxIzenak = new ArrayList<String>();
    try {
         zis = new ZipInputStream(mFTPClient.retrieveFileStream(filePath));
         ZipEntry ze;
         while ((ze = zis.getNextEntry()) != null) {
             String filename = ze.getName();
             fitxIzenak.add(filename);
         }                   
         zis.close();
         mFTPClient.completePendingCommand();
         return fitxIzenak;

    } catch (Exception e) {
        zis.close();
        mFTPClient.completePendingCommand();
        e.printStackTrace();
    }

    return fitxIzenak;
}

这就是我得到的:

java.util.zip.ZipException: CRC mismatch
    at java.util.zip.ZipInputStream.readAndVerifyDataDescriptor(ZipInputStream.java:208)
    at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:172)
    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:225)
    at com.example.services.MyFTPClient.ftpZipRetrieveFromFiles(MyFTPClient.java:250)
    at com.example.gipuzkoabidaian.MainActivity$FTPkonexioa.doInBackground(MainActivity.java:965)
    at com.example.gipuzkoabidaian.MainActivity$FTPkonexioa.doInBackground(MainActivity.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)

 java.util.zip.ZipException: data error
    at java.util.zip.ZipInputStream.read(ZipInputStream.java:340)
    at libcore.io.Streams.skipByReading(Streams.java:158)
    at java.util.zip.InflaterInputStream.skip(InflaterInputStream.java:217)
    at libcore.io.Streams.skipAll(Streams.java:133)
    at java.util.zip.ZipInputStream.closeEntry(ZipInputStream.java:152)
    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:225)
    at com.example.services.MyFTPClient.ftpZipRetrieveFilesTitles(MyFTPClient.java:303)
    at com.example.gipuzkoabidaian.MainActivity$FTPkonexioa.doInBackground(MainActivity.java:961)
    at com.example.gipuzkoabidaian.MainActivity$FTPkonexioa.doInBackground(MainActivity.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at java.lang.Thread.run(Thread.java:856)

希望有人能帮帮我,我不知道该怎么办。

【问题讨论】:

    标签: android exception ftp zipinputstream


    【解决方案1】:

    最后我自己找到了解决方案。 (我不确定我是否必须在这里写答案......)

    我唯一改变的是“ftpconnect”函数中要传输的文件类型:

    mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
    

    我不太清楚原因,反正我在这里找到了一些解释: FTP Client - setFileType

    【讨论】:

      猜你喜欢
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多