最近项目中需要实现将文件先存放到ftp上,需要的时候再从ftp上下载,做的过程中碰到了问题,发现中文文件名的无法上传到ftp上,ftp上的中文文件名的文件下载不下来,几番折腾,终于搞定了,记录一下备忘。

首先给工程添加maven依赖,pom.xml文件中添加:

<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>1.4.1</version>
</dependency>

以下是Ftp工具类:

package com.test.util;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;public class FtpUtil {private final static Log logger = LogFactory.getLog(FtpUtil.class);  /** * 获取FTPClient对象 * @param ftpHost       FTP主机服务器 * @param ftpPassword   FTP 登录密码 * @param ftpUserName   FTP登录用户名 * @param ftpPort       FTP端口 默认为21 * @return */  public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {  FTPClient ftpClient = new FTPClient();  try {  ftpClient = new FTPClient();  ftpClient.connect(ftpHost, ftpPort);              // 连接FTP服务器  ftpClient.login(ftpUserName, ftpPassword);        // 登陆FTP服务器 ftpClient.setControlEncoding("UTF-8");             // 中文支持  ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  ftpClient.enterLocalPassiveMode();  if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  logger.info("未连接到FTP,用户名或密码错误。");  ftpClient.disconnect();  } else {  logger.info("FTP连接成功。");  }  } catch (SocketException e) {  e.printStackTrace();  logger.info("FTP的IP地址可能错误,请正确配置。");  } catch (IOException e) {  e.printStackTrace();  logger.info("FTP的端口错误,请正确配置。");  }  return ftpClient;  }  /* * 从FTP服务器下载文件 * @param ftpHost             FTP IP地址 * @param ftpUserName         FTP 用户名 * @param ftpPassword         FTP用户名密码 * @param ftpPort             FTP端口 * @param ftpPath             FTP服务器中文件所在路径 格式: ftptest/aa * @param localPath           下载到本地的位置 格式:H:/download * @param fileName            FTP服务器上要下载的文件名称* @param targetFileName      FTP服务器上要下载的文件名称 */  public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName, String targetFileName) {  FTPClient ftpClient = null;  try {  ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);  ftpClient.changeWorkingDirectory(ftpPath);String f_ame = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING); //编码文件格式,解决中文文件名File localFile = new File(localPath + File.separatorChar + targetFileName);  OutputStream os = new FileOutputStream(localFile);  ftpClient.retrieveFile(f_ame, os);  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();  }  }/**  * 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 ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String filename, InputStream input) {  boolean result = false;  FTPClient ftpClient = new FTPClient();  try {  int reply;  ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);  ftpClient.changeWorkingDirectory(ftpPath);reply = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftpClient.disconnect();return result;}filename = new String(filename.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);    //编码文件名,支持中文文件名//上传文件  if (!ftpClient.storeFile(filename, input)) {  return result;  }  input.close();  ftpClient.logout();  result = true;  } catch (IOException e) {  e.printStackTrace();  } finally {  if (ftpClient.isConnected()) {  try {  ftpClient.disconnect();  } catch (IOException ioe) {  }  }  }  return result;  }public static void main(String[] args) {String ftpHost = "192.168.20.40";String ftpUserName = "test";String ftpPassword = "12345";int ftpPort = 21;String ftpPath = "test/";String fileName = "test_通知_4724.docx";//上传一个文件try{String tmpPath = System.getProperty("java.io.tmpdir");FileInputStream in=new FileInputStream(new File("D:\\" + fileName));FtpUtil.uploadFile(ftpHost, ftpUserName,  ftpPassword, ftpPort, ftpPath, fileName, in);System.out.println(tmpPath);FtpUtil.downloadFtpFile(ftpHost, ftpUserName, ftpPassword, ftpPort, ftpPath, "E:\\", "test_通知_4724.docx", "测试下载文件.docx"); } catch (Exception e){e.printStackTrace();System.out.println(e);}}
}

Java 实现Ftp上传下载文件相关推荐

  1. ftp上传文件服务器报550错误_java ftp下载文件,Java 实现ftp上传下载文件

    最近项目中需要实现将文件先存放到ftp上,需要的时候再从ftp上下载,做的过程中碰到了问题,发现中文文件名的无法上传到ftp上,ftp上的中文文件名的文件下载不下来,几番折腾,终于搞定了,记录一下备忘 ...

  2. ftp上传-下载文件通用工具类,已实测

    话不多说直接上代码 package com.springboot.demo.utils;import lombok.extern.slf4j.Slf4j; import org.apache.comm ...

  3. python get 下载 目录_python实现支持目录FTP上传下载文件的方法

    本文实例讲述了python实现支持目录FTP上传下载文件的方法.分享给大家供大家参考.具体如下: 该程序支持ftp上传下载文件和目录.适用于windows和linux平台. #!/usr/bin/en ...

  4. python上传本地文件到ftp_python实现的简单FTP上传下载文件实例

    本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. #!/usr/bin/env pyth ...

  5. android ftp同步程序,ftp同步 安卓,安卓手机ftp上传下载文件功能同步视频照片

    手机拍照越来方便,手机里的照片也越积越多,手机运行缓慢,本文利用安卓的每步FTP服务APP来自动实现手机视频照片的同步,释放手机被占用的存储空间.在机顶盒上运行每步FTP服务,机顶盒USB口连接U盘做 ...

  6. bat定时进行ftp上传下载文件

    bat进行ftp上传下载文件 参考文章: https://blog.csdn.net/yongzai666/article/details/86488761 背景: 由于公司某个系统原本硬盘损坏 , ...

  7. java ftp上传文件_jaVA使用FTP上传下载文件的问题

    为了实现 FTP上传下载,大概试了两个方法 sun.net.ftp.FtpClient org.apache.commons.net 一开始使用sun.net.ftp.FtpClient,结果发现唯一 ...

  8. ftp上传下载文件详解

    首先导入包 import org.apache.commons.NET.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; FTPCli ...

  9. ftp: connect: 没有到主机的路由_Qt之FTP上传/下载文件操作

    ​一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&q ...

最新文章

  1. 【怎样写代码】实现对象的复用 -- 享元模式(一):问题案例
  2. 如何查看 phtml文件 并有代码颜色提示
  3. 超短的判断IE javascript代码
  4. 4.19计算机网络笔记
  5. 比特币近24小时内链上交易额有所上升,约为345.44亿美元
  6. 操作系统实战45讲01:运行HelloOS
  7. 在 Linux 命令行发送邮件的 5 种方法
  8. 知识点滴 - 什么是量词
  9. 如何破解隔壁妹子的wifi密码,成功率高达90%
  10. 服务器怎么架设为虚拟主机,架设服务器虚拟主机教程
  11. GC问题排查实战三-Parallel Scavenge和Parallel Old日志分析
  12. python处理图片水印
  13. 基于C#制作一个ChatGPT桌面助手
  14. 关于字体绘制的baseline (QT 和 D2D)
  15. android 输入法更换_详解安卓手机输入法和键盘切换方式的教程
  16. Tomcat 如何查看端口
  17. 淘宝商品比价定向爬虫-Python网络爬虫与信息提取-北京理工大学嵩天教授
  18. pancake bot夹子机器人
  19. pandas操作excel的应用
  20. [Paper-Preview1]Global and Quadratic Convergence of Newton Hard-Thresholding Pursuit

热门文章

  1. layui form表单点击无反应
  2. Mybatis增强学习总结
  3. linux中磁盘分区命令是什么,Linux如何分区?Linux 分区命令是什么?
  4. Excel实现注释的隐藏与显示
  5. java web之数据库的连接(使用JDBC连接sql server)
  6. android studio SQLScout插件查看sqlite数据库
  7. 使用 Three.js 的 3D 制作动画场景
  8. 几种实时数仓架构设计思路
  9. 北京实时公交查询微信小程序
  10. 行偏角-倾斜角-滚动角