2 wy123123000 wy123123000 于 2017.09.19 16:50 提问

ftp上传文件名为中文上传报错怎么解决,在线求解!!!!

报错:IOException caught while copying.

 public static boolean upload(FTPParameter para,File file)  
            throws IOException {  

        boolean success = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(para.hostName, para.port);//连接FTP服务器
            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.login(para.userName, para.passWord);//登录
            ftp.setControlEncoding("GBK");
            FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
            conf.setServerLanguageCode("zh");
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return success;
            }
            if(file.isDirectory()){           
                ftp.changeWorkingDirectory(para.uploadPath);  
                String[] files = file.list();             
                for (int i = 0; i < files.length; i++) {      
                    File file1 = new File(file.getPath()+"\\"+files[i] );      
                    if(file1.isDirectory()){      
                        upload(para,file1);      
                        ftp.changeToParentDirectory();      
                    }else{                    
                        File file2 = new File(file.getPath()+"\\"+files[i]);      
                        FileInputStream input = new FileInputStream(file2);
                        ftp.storeFile(file2.getName(), input);      
                        input.close();                            
                    }                 
                }      
            }else{      
                File file2 = new File(file.getPath());      
                FileInputStream input = new FileInputStream(file2);      
                ftp.storeFile(file2.getName(), input);      
                input.close();        
            }      

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;  
    }  

4个回答

Oh_my_godness
Oh_my_godness   2017.09.19 17:12

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();
System.out.println("111111");
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)) {
System.out.println("22222");
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if (!ftp.storeFile(filename, input)) {
System.out.println("3333");
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
System.out.println("44444");
return result;
}

wy123123000
wy123123000 我是做备份用的,等于是要把一个目录下的所有内容上传,里面自然包括文件夹文件。那个乱码我打debug跟踪了java代码中没有乱码,但是上传上去了以后文件名是乱码
2 个月之前 回复
Oh_my_godness
Oh_my_godness 回复wy123123000: 为什么要上传文件夹?非要上传的话只能压缩包形式,乱码的问题你用断点看看是从页面过来就是乱码,还是说在java代码中乱码的
2 个月之前 回复
wy123123000
wy123123000 我的上传的文件比较多,所以要回调函数,现在只能上传文件而且还是乱码,文件夹都上传不上去,你能不能帮我看一下现在的代码
2 个月之前 回复
wy123123000
wy123123000 我跟你的差不多啊,我的另写了一个上传目录不存在创建目录的方法,单独调了以后,才执行这个上传的
2 个月之前 回复
Oh_my_godness
Oh_my_godness 我这个可以上传啊,不会出现乱码的问题
2 个月之前 回复
Oh_my_godness
Oh_my_godness   2017.09.19 17:01

gbk不行就改成utf-8再试试看

wy123123000
wy123123000 改了以后不报错了,也能上传了,不过上传的文件名是乱码
2 个月之前 回复
wy123123000
wy123123000 也不行,我把这个改了ftp.storeFile(new String(file2.getName().getBytes("utf-8"),"8859_1"), input);
2 个月之前 回复
qq_23370223
qq_23370223   2017.09.19 17:56

下载notepad++
编码-->转为utf-8

wy123123000
wy123123000   2017.09.20 12:02

文件夹上传不了,而且上传过去文件名是乱码

 public void upload(File file) throws IOException {  
        try {
            if(file.isDirectory()){  
                System.out.println(file.getName());
                ftp.changeWorkingDirectory("/"+new String(file.getName().getBytes("utf-8"),"8859_1"));      
                String[] files = file.list();             
                for (int i = 0; i < files.length; i++) {      
                    File file1 = new File(file.getPath()+"\\"+files[i] );      
                    if(file1.isDirectory()){      
                        upload(file1);      
                        ftp.changeToParentDirectory();      
                    }else{                    
                        File file2 = new File(file.getPath()+"\\"+files[i]);      
                        FileInputStream input = new FileInputStream(file2);  
                        System.out.println(file2.getName());
                        ftp.storeFile(new String(file2.getName().getBytes("GBK"),"8859_1"), input);      
                        input.close();                            
                    }                 
                }      
            }else{      
                File file2 = new File(file.getPath());      
                FileInputStream input = new FileInputStream(file2);
                System.out.println(file2.getName());
                ftp.storeFile(new String(file2.getName().getBytes("GBK"), "iso-8859-1"),input);      
                input.close();  
                ftp.logout();
            }      

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
    }  

wy123123000
wy123123000 弄好了,谢谢你的帮助~~
2 个月之前 回复
Oh_my_godness
Oh_my_godness 还是希望你自己仔细检查一下你的编码集,从页面到后台必须一致,如果不一样就会出现乱码,你这段代码中的编码就有两种
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片