为什么通过Apache FTPClient上传文件比本地原始文件小?

时间:2012-06-27 12:00:15

标签: java apache file-io network-programming ftp-client

我将文件(.cvs,.zip,.rar,.doc,.png,.jpg ...)上传到ftp服务器。奇怪的是一切都成功但我错过了一些数据。

是否有人知道它为什么会发生以及如何解决?

 public static void uploadWithCommonsFTP(File fileToBeUpload) {
        FTPClient f = new FTPClient();
        try {
            f.connect(server.getServer());
            f.login(server.getUsername(), server.getPassword());
            f.changeWorkingDirectory("user");
            f.setFileType(FTP.BINARY_FILE_TYPE);
            f.setFileTransferMode(FTP.BINARY_FILE_TYPE);//this is part of Mohammad Adil's solutions
            f.enterLocalPassiveMode();
            ByteArrayInputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(fileToBeUpload));
            boolean reply = f.storeFile(fileToBeUpload.getName(), in);
            if(!f.completePendingCommand()) {
                    f.logout();
                    f.disconnect();
                    System.err.println("File transfer failed.");
                    System.exit(1);
                }
                if(reply){
                    JOptionPane.showMessageDialog(null,"uploaded successfully.");
                }else{
                    JOptionPane.showMessageDialog(null,"Upload failed.");
                }
            }
            //Logout and disconnect from server
            in.close();//this is part of Mohammad Adil's solutions
            f.logout();
            f.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

1 个答案:

答案 0 :(得分:4)

人们经常忘记FTP有两种操作模式 - 一种用于文本文件,另一种用于二进制(jpg,csv,pdf,zip)文件。

您的代码无效,因为FTPClient的默认传输模式为FTP.ASCII_FILE_TYPE。您只需要更新配置以便以二进制模式传输。

在您的代码中添加:

f.setFileTransferMode(FTP.BINARY_FILE_TYPE);

f.setFileType(FTP.BINARY_FILE_TYPE);后面放上那一行 它应该工作。

修改

您未在代码中关闭inputStream,只需在致电in.close()之前致电logout()