java FTP上传文件,成功上传,但是文件为空????

我再linux上面装了一个ftp,准备用程序上传文件到ftp 文件服务器上面,
上传是成功了,但是上传后的文件为空??我调试了发现storeFile这个方法一直返回false

图片说明

但不知道怎么回事,求指教。。。

 /** 
     * Description: 向FTP服务器上传文件 
     * @param host FTP服务器hostname 
     * @param port FTP服务器端口 
     * @param username FTP登录账号 
     * @param password FTP登录密码 
     * @param basePath FTP服务器基础目录
     * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
     * @param filename 上传到FTP服务器上的文件名 
     * @param input 输入流 
     * @return 成功返回true,否则返回false 
     */  
    public static boolean uploadFile(String host, int port, String username, String password, String basePath,
            String filePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);// 连接FTP服务器
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                //如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir)) continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)) {
                        if (!ftp.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置上传文件的类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            if (!ftp.storeFile(new String(filename.getBytes("GBK"),"iso-8859-1"), input)) {
                return result;
            }
            input.close();
            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }


    public static void main(String[] args) throws IOException {
         File file2=new File("D:\\Workspaces\\training\\web\\src\\main\\webapp\\modile\\Mission evaluation.docx");
         FileInputStream input=new FileInputStream(file2);

         uploadFile("137.200.48.72", 21, "root", "123", "/home/files", "/Test/poc", "test.doc", input);
         input.close();
         System.out.println(1);
    }

4个回答

ftp.enterLocalPassiveMode()试一下开启pasv模式

apbbbbb
旋转的钢笔 非常感谢
2 年多之前 回复

断电调试下 input 输入流 有没有数据 或者是前面解码格式不对 换成utf-8试试

zy841958835
cloudyzhao 回复旋转的钢笔: 厉害了
2 年多之前 回复
apbbbbb
旋转的钢笔 试了utf-8也不行,流里面是有数据的
2 年多之前 回复

查找了资料,询问了好友,感谢,终于解决了,加上这一句话就好了 ftp.enterLocalPassiveMode();

参考这篇文章http://www.bubuko.com/infodetail-985948.html

有没有数据 或者是前面解码格式不对 换成utf-8试试

apbbbbb
旋转的钢笔 谢谢,是由于linux的安全限制导致的,需要设置下。。 官方API enterLocalPassiveMode解释 将当前数据连接模式设置为PASSIVE_LOCAL_DATA_CONNECTION_MODE。 使用此方法仅用于客户端和服务器之间的数据传输。 这种方法会导致在每个数据连接打开之前向服务器发出一个PASV(或EPSV)命令,告诉服务器打开客户端连接的数据端口进行数据传输。 FTPClient将保持在PASSIVE_LOCAL_DATA_CONNECTION_MODE中,直到通过调用其他方法(如enterLocalActiveMode())更改模式 注: 目前调用任何连接方法都会将模式重置为ACTIVE_LOCAL_DATA_CONNECTION_MODE。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐