最近使用apache上面的commons 2.0开发ftp使用过程中,因为涉及到大文件的长时间传输,在最后经常导致程序死掉,不知道大家有没有办法解决。
其中传文件的代码如下:
/**
* 上传文件到服务器,新上传和断点续传
* @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变
* @param localFile 本地文件File句柄,绝对路径
* @param processStep 需要显示的处理进度步进值
* @param ftpClient FTPClient引用
* @return
* @throws IOException
*/
public boolean uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{
boolean status;
//显示进度的上传
long step = localFile.length() / 100;
long process = 0;
long localreadbytes = 0L;
RandomAccessFile raf = new RandomAccessFile(localFile,"r");
OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso-8859-1"));
//断点续传设置起始位置
if(remoteSize>0){
ftpClient.setRestartOffset(remoteSize);
process = remoteSize /step;
raf.seek(remoteSize);
localreadbytes = remoteSize;
}
byte[] bytes = new byte[1024];
int c;
//开始上传
while((c = raf.read(bytes))!= -1){
out.write(bytes,0,c);
localreadbytes+=c;
if(localreadbytes / step != process){
process = localreadbytes / step;
// System.out.println("上传进度:" + process);
//TODO 添加汇报上传状态内容
}
}
logger.info("清空输出流");
out.flush();
logger.info("关闭文件读句柄");
raf.close();
logger.info("关闭输出流");
out.close();
logger.info("关闭输出流成功");
boolean status = ftpClient.completePendingCommand();
logger.info("从上传方法返回");
return status;
}
如果上传大的文件,比如说是500M文件,ftp传输大概需要两个小时左右的时候,ftpClient.completePendingCommand()方法就会死掉,我在网上也查了一些内容,说是打开的流必须关闭后ftp Server才会返回正确的状态吗。问题是我关闭了同样没有收到正确的状态码。
如果换成appendFile(String remoteFile,InputStream in)这种方法就不会存在问题,
因为项目需要汇报进度,所以必须使用流的方式读取,希望知道解决方案的兄弟帮忙,多谢!
分享到:
相关推荐
《Apache Commons Net FTP库在Java开发中的应用》 Apache Commons Net是一个Java库,它提供了对各种网络协议的支持,其中就包括FTP(File Transfer Protocol)协议。在这个特定的案例中,我们关注的是`commons-...
在本文中,我们将深入探讨如何利用这个库开发一个FTP工具类,以便在Java应用程序中进行文件上传、下载和其他FTP操作。 首先,我们需要了解FTP的基本概念。FTP是一种用于在网络上进行文件传输的标准协议。它允许用户...
在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你...
apache commons.fileupload上传组件在上传文件时,在调用parseRequest方法时,先将输入流上传到服务器临时目录,在之后的文件处理过程中,再将临时目录下保存的文件复制到指定的目录,多了一道转储步骤。本实现抽取...
在Web开发中,Apache Commons 的组件被广泛使用,尤其是在 JSP+Servlet 的学习,以及基于 Spring(SSM)、Struts(SSH)等框架的应用开发中。 Apache Commons 中包含多个模块,每个模块都专注于特定的功能领域,...
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题。(附件中提供了该工具包的jar包,及源文件以供研究) BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 ...
.net.ftp.FTPClient jar ,exaple, commons-net-2.0.jar
Apache Commons Net库是Java开发人员在处理网络协议时的一个强大工具,特别是对于FTP(文件传输协议)客户端编程。这个库,如"commons-net-ftp-2.0.rar"所示,包含了一系列的JAR文件,使得开发者能够轻松地构建FTP...
apache commons scxml 2.0 只有这里才有哦,官网上面只有0.9版本,需要自己下载源码编译,这里我已经编译好了,连同依赖的jar包都在这里了。想知道怎么使用SCXML,可以参考我的博客:...
版本3.5是这个库的一个稳定发行版,提供了丰富的功能和优化,使得开发者可以轻松地在Java应用程序中实现在FTP服务器上进行文件的上传、下载以及其他操作。 Apache Commons Net库包括了以下关键知识点: 1. **FTP...
1. FTP支持:Apache Commons Net 3.0提供了全面的FTP客户端实现,允许开发者进行文件上传、下载、目录浏览、文件重命名等操作。它支持FTP和FTPS(FTP over SSL/TLS)协议,确保数据传输的安全性。FTPClient类是主要...
在创建一个基于Apache Commons FileUpload的文件上传组件时,通常会包含以下步骤: 1. 创建`DiskFileItemFactory`实例。 2. 使用工厂创建`ServletFileUpload`实例,设置大小限制。 3. 解析`HttpServletRequest`对象...
FTP是一种用于在网络上进行文件传输的协议,Apache Commons Net库中的FTP组件提供了丰富的API,使得开发者可以轻松地在Java应用程序中实现FTP文件的上传、下载、目录浏览、权限设置等功能。FTP客户端可以使用这些API...
commons-net-2.0 FTP上传下载删除保存下
本文档主要介绍了 Apache Commons FileUpload 组件的应用指南,旨在帮助开发者快速了解和使用该组件实现文件上传功能。 一、为什么需要文件上传组件? 几乎每一个 Web 应用中都需要为用户提供文件上传的功能,例如...
Apache Commons 是一个由Apache软件基金会开发的Java库项目,它专注于提供可重用的Java组件。这个项目包含多个子组件,每个子组件都有其特定的功能和用途,旨在简化开发过程并增强Java应用程序的功能。 1. **...
4. Apache Commons Net: 这是网络编程相关的组件集合,包含FTP、SMTP、Telnet等协议的支持,以及DNS查询等功能。例如,FTPClient可以方便地进行FTP文件上传和下载,而SMTPClient则可以帮助实现邮件发送。 5. Apache...
Apache Commons Net库是Java开发人员在处理网络协议时的一个强大工具,特别是对于FTP(文件传输协议)操作。标题"org.apache.commons.net.ftp"表明这个压缩包包含了与Apache Commons Net库中FTP相关的类和功能。描述...