弄了一天的ftp文件上传下载,最棘手的有两个问题:
1、上传中文文件在ftp服务器(linux)上的乱码问题;
2、总是提示这个错误:java.net.SocketException: Software caused connection abort: recv failed
对于第二个问题大家可以上网找找,大部分说的是出现这个问题的原因,并没有说怎么解决。也希望哪位大神留言帮忙解决那是感激不尽啊!
我的实现方法就是:不把自己撞在南墙上,换一条道走,诶!两个问题都解决了!(附件是必须的jar包)
这个工具类总结了网上很多种方法,只需要引入一个jar包,不像其他的demo需要2--3个jar包。个人觉得还是很方便的。
工具类代码如下:
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import java.net.URLEncoder; import java.util.Properties; import javax.servlet.http.HttpServletResponse; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * CopyRright (c)2012-2013: * Project: nankai * Module ID: FTPUtils * Comments: * JDK version used: JDK1.7 * Author: * Create Date: 2013-9-18 * Modified By: * Modified Date: * Why & What is modified * Version: 1.0 */ public class FTPUtils { //读取配置文件中的系统ip和port private static Properties p = new PropertiesLoader("classpath:/application.development.properties", "classpath:/application.properties") .getProperties(); private static String ftpIp = p.getProperty("ftp.ip"); // 服务器ip private static int ftpPort = Integer.parseInt(p.getProperty("ftp.port")); // 服务器端口号 private static String userName = p.getProperty("ftp.username"); // 登录服务器用户名 private static String password = p.getProperty("ftp.password"); // 登录服务器密码 // protected CustomFtpClient ftpClient = null; // OutputStream os = null; // FileInputStream is = null; /** * Description: 向FTP服务器上传文件 * * @param path * FTP服务器保存目录 * @param filename * 上传到FTP服务器上的文件名 * @param input * 输入流 * @return 成功返回true,否则返回false * @throws IOException * @throws SocketException */ public static boolean uploadFile(String path, String filename, InputStream input) throws SocketException, IOException { boolean success = false; FTPClient ftp = new FTPClient(); ftp.connect(ftpIp, ftpPort);// 连接FTP服务器 int reply; // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.login(userName, password);// 登录 // 设置PassiveMode传输 ftp.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); ftp.setFileType(FTP.BINARY_FILE_TYPE); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return success; } String filename1 = new String(filename.getBytes("GBK"), "ISO-8859-1"); String path1 = new String(path.getBytes("GBK"), "ISO-8859-1"); boolean isChangeWork = ftp.changeWorkingDirectory(path1); if (!isChangeWork) { boolean isMade = ftp.makeDirectory(path1); if (!isMade) { throw new IOException("ftp上传文件创建目录失败"); } isChangeWork = ftp.changeWorkingDirectory(path1); } ftp.storeFile(filename1, input); ftp.logout(); success = true; if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } return success; } /** * Description: 从FTP服务器下载文件 * * @param remotePath * FTP服务器上的相对路径 * @param fileName * 要下载的文件名 * @param localPath * 下载后保存到本地的路径 * @return * @throws IOException * @throws SocketException */ public static boolean downloadFile(String path, String fileName, OutputStream outputStream) throws SocketException, IOException { boolean success = false; FTPClient ftp = new FTPClient(); ftp.connect(ftpIp, ftpPort);// 连接FTP服务器 int reply; // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器 ftp.login(userName, password);// 登录 // 设置PassiveMode传输 ftp.enterLocalPassiveMode(); // 设置以二进制流的方式传输 ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); ftp.setFileType(FTP.BINARY_FILE_TYPE); reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); } String filename1 = new String(fileName.getBytes("GBK"), "ISO-8859-1"); String path1 = new String(path.getBytes("GBK"), "ISO-8859-1"); boolean isChangeWork = ftp.changeWorkingDirectory(path1); if (!isChangeWork) { throw new IOException("ftp目录不存在"); } InputStream input = ftp.retrieveFileStream(filename1); int buf = -1; while ((buf = input.read()) != -1) { outputStream.write(buf); } outputStream.flush(); input.close(); ftp.logout(); if (ftp.isConnected()) { try { ftp.disconnect(); } catch (IOException ioe) { } } return success; } }
使用方法:
上传直接通过FTPUtils.uploadFile(ftpPath, materialName, input);就可以
下载(以springmvc为例子):
@RequestMapping("download") public void download(HttpServletResponse response, String materialName, Model model) throws IOException { response.setContentType("application/x-download"); //给用户提供的下载文件名,处理乱码问题 String filedisplay = URLEncoder.encode(materialName, "UTF-8"); response.addHeader("Content-Disposition", "attachment;filename=" + filedisplay); OutputStream outputStream = response.getOutputStream(); String remotePath = "/material/2013/"; FTPUtils.downloadFile(remotePath, materialName, outputStream); }
会将文件下载到本地。
注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
最后,希望大家有谁发现这里有不合适或者需要改进的地方,请留言与我联系,共享万岁!
相关推荐
5. 文件上传:FTP工具类通常包含upload方法,用于将本地文件上传到FTP服务器。这涉及调用FTPClient的storeFile方法,并传入远程文件路径和本地文件输入流。 6. 文件下载:与上传类似,下载文件通常通过retrieveFile...
最后,使用`storeFile()`方法将本地文件上传到FTP服务器。确保在操作完成后调用`disconnect()`关闭连接。 FTP下载功能类似,但使用`retrieveFile()`方法从服务器获取文件并保存到本地。同样需要设置文件类型,并...
总之,Java版FTP上传下载工具类利用Apache Commons Net库提供了一种高效且易于使用的接口,使得开发者可以快速实现FTP文件传输功能。通过封装和抽象,这个工具类降低了开发难度,提升了代码的可读性和可维护性。
使用`FTPClient`的`retrieveFile`方法下载FTP服务器上的文件到本地: ```java public boolean downloadFile(String remoteFilePath, File localFile) { try { OutputStream outputStream = new ...
在这个场景中,我们看到的"Java FTP文件上传下载"是一个具体的实现,它可能包含了一个自定义的工具类`FtpUtil.java`,以及一些依赖的库文件。 `FtpUtil.java`很可能是一个封装了FTP操作的类,包括连接FTP服务器、...
要实现FTP文件上传,我们首先创建一个`FtpWebRequest`对象,设置其方法为`WebMethod.UploadFile`,然后提供FTP服务器的URL、用户名和密码。接着,打开一个流写入器,将本地文件内容写入请求的主体,最后发送请求并...
`上传工具类使用说明.docx`文件应该是对`UploadUtils.java`类的详细使用指南,包括如何初始化、调用上传和下载方法、配置服务器地址、处理可能出现的问题等。这份文档对于开发者来说是非常宝贵的,可以快速理解并...
标题“VB FTP文件上传、下载”指的是使用VB进行FTP文件交互的实践。这通常涉及到以下知识点: 1. **FTP基础**:理解FTP的基本工作原理,包括主动模式和被动模式、FTP命令(如`PUT`用于上传,`GET`用于下载)、身份...
以上代码展示了使用QT实现FTP文件上传和下载的基本流程。实际应用中,可能需要添加更复杂的错误处理、进度显示、多线程支持等功能。QT库的强大之处在于其灵活性,可以根据项目需求进行扩展和定制。 总结来说,QT...
总之,Qt5.8通过其强大的网络模块提供了FTP文件上传和下载的便利。利用QNetworkAccessManager和QNetworkReply,我们可以轻松地处理FTP任务,并通过进度槽函数实时更新进度条。在编写这类应用时,确保正确处理各种...
在本资源中,提供了实现FTP文件上传和下载功能的源码,包括了FTP连接、文件上传和下载的逻辑,以及相关的测试方法。下面我们将详细探讨这些知识点。 1. FTP连接: FTP连接是通过建立TCP连接到FTP服务器来实现的。...
本篇文章将详细探讨如何使用Java实现FTP文件上传,以及相关类的作用。 首先,我们来看标题和描述中的关键词"java实现的ftp文件上传",这表明我们要讨论的是使用Java编程语言来实现在FTP服务器上上传文件的过程。...
"SFTP上传下载文件工具"通常指的是支持SFTP协议的软件应用,这些应用使得用户能够方便地在本地计算机和远程服务器之间进行文件的上传和下载。描述中提到的"可直接文件夹传输"功能,意味着这款工具不仅支持单个文件的...
在这里,我们将讨论如何使用 C# 语言实现 FTP 协议,实现文件上传、下载和删除操作。 FTP 协议基础 FTP 协议是基于 TCP/IP 协议的,它使用 TCP 连接来传输文件。FTP 协议使用两个连接:控制连接和数据连接。控制...
### C# FTP 文件操作知识点详解 #### 一、概述 在C#中,可以通过使用`...以上是对“C# FTP文件上传,下载,删除,目录建立”相关知识点的详细解析。通过这些示例代码,开发者可以轻松地实现对FTP服务器的基本操作。
这些类允许开发者实现FTP的基本操作,如上传、下载、删除、列出目录内容等。 3. **Visual Studio 2005**: VS2005是微软的集成开发环境,支持C#编程。在VS2005中创建FTP工具,可以通过创建Windows Forms或Console...
综上所述,`DownloadFTPUtil.java`文件中的代码应包含上述各个步骤,创建一个功能完整的FTP下载工具类,以满足Android应用程序中对FTP文件下载的需求。开发者可以根据实际需求对其进行定制和扩展,例如添加断点续传...
本篇文章将详细探讨如何利用Socket实现一个强大的文件上传工具类,以及涉及到的相关知识点。 一、Socket基础知识 Socket,也被称为套接字,是网络通信中的一个抽象概念,它代表了两台机器间通信的一个端点。在Java...
总的来说,基于SpringBoot的FtpUtil工具类为我们提供了一种便捷的方式,通过简单的调用即可实现FTP文件操作,大大简化了开发流程。配合提供的项目源码和说明,无论是初学者还是经验丰富的开发者,都能从中受益,提高...
它允许用户从FTP服务器上下载文件,或者将文件上传到FTP服务器。在本文中,我们将深入探讨FTP服务器上传下载的基本概念,并通过一个示例代码来展示其实现过程。 FTP服务器是运行FTP服务的计算机,它提供了一个平台...