解决FTPClient上传下载中文文件名或路径与FTPClient下载成功文件0KB问题

本文记录了FTPClient的文件上传和下载操作。上传使用流,下载需先进行路径转码。若设置UTF - 8下载文件为0KB,需调整编码格式。同时强调下载时本地路径的重要性,若本地无文件,需检查路径是否正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,记记记

首先是上传

path = new String(path.getBytes("GBK"),"iso-8859-1");//上传路径中文转码
//连接就不贴出来了
if (!ftp.changeWorkingDirectory(defaultBaseDir)){
    //注意服务器上的文件路径,如果多/会出现返回为空问题
    ftp.changeWorkingDirectory(defaultBaseDir);
}
//视情况加,有时候开被动连接会出现连接超时
//ftpClient.enterLocalPassiveMode(); 
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// 设置文件名字的编码格式为iso-8859-1,因为FTP上传的时候默认编码为iso-8859-1,解决文件名字乱码的问题
filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
//上传文件
if (!ftp.storeFile(filename, input)) {
		return result;
}
				

完整代码,我上传的是流

public static boolean uploadFilesss(String filename, InputStream input) {
		boolean result=false;
		FTPClient ftp = new FTPClient();
		int reply;
		try {
			//中文路径
			//path = new String(path.getBytes("GBK"),"iso-8859-1");
			ftp.connect(V2Config.getIp(), V2Config.getPort());
			ftp.login(V2Config.getUsername(), V2Config.getPassword());
			System.out.println(V2Config.getIp()+" "+V2Config.getPort()+""+V2Config.getUsername()+""+V2Config.getPassword());
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return false;
			}
			//切换到上传目录
			if (!ftp.changeWorkingDirectory(defaultBaseDir))
				ftp.changeWorkingDirectory(defaultBaseDir);
			//设置上传文件的类型为二进制类型
			System.out.println(ftp.printWorkingDirectory());
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			// 设置文件名字的编码格式为iso-8859-1,因为FTP上传的时候默认编码为iso-8859-1,解决文件名字乱码的问题
            filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
			//上传文件
			if (!ftp.storeFile(filename, input)) {
				return result;
			}
			input.close();
			ftp.logout();
			result = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					ioe.printStackTrace();
				}
			}
		}
		return result;
	}

然后是下载

还是先路径转码

然后

接着

最终,注意如果设置UTF-8的朋友出现下载文件为0KB的情况,就把编码设置为下面的格式

完整代码

public static void downloadFtpFile(String ftpHost, String ftpUserName,  
            String ftpPassword, int ftpPort, String ftpPath, String localPath,  
            String fileName) {  
		FTPClient ftpClient = new FTPClient();
		int reply;
        try {  
            String ftpPath2 = new String(ftpPath.getBytes("GBK"),"iso-8859-1");
            ftpClient.connect(V2Config.getIp(), V2Config.getPort());
            ftpClient.login(V2Config.getUsername(), V2Config.getPassword());
			reply = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftpClient.disconnect();
				return;
			}  
            ftpClient.setControlEncoding("UTF-8"); // 中文支持  
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
            ftpClient.enterLocalPassiveMode();  
            boolean flag1 = ftpClient.changeWorkingDirectory(ftpPath2); 
            if (!flag1) {
                logger.error("没有找到" + ftpPath + "---该路径");
                return;
            }
            File localFile = new File(localPath + File.separatorChar + new String(fileName.getBytes("GBK"),"UTF-8"));  
            OutputStream os = new FileOutputStream(localFile);  
            //复制文件流
            boolean flag2 = ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"iso-8859-1"), os); 
            if (!flag2) {
                logger.error("没有找到" + fileName + "---该文件");
                localFile.delete();
            }
            os.close();  
            ftpClient.logout();  

        } catch (FileNotFoundException e) {  
            logger.error("没有找到" + ftpPath + "文件");  
            e.printStackTrace();  
        } catch (SocketException e) {  
            logger.error("连接FTP失败.");  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
            logger.error("文件读取错误。");  
            e.printStackTrace();  
        }  

    }

这里还有个坑,下载文件时的本地路径一定要注意!!!!!一定要注意!!!!!一定要注意!!!!!

如果你的下载方法和文件名都没有问题,本地目录却没有文件,就检查检查本地路径是否正确

我当时遇到的情况是"C:/xxx/",怎么下载都没有文件,后来多番尝试"C:\\xx\"解决问题

如果这些东西对你有帮助,请给个赞,万分感谢

欢迎大神指点

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值