‘壹’ java程序可以成功连接Ftp服务器,但无法上传文件,怎么回事,报错如下,(已设置连接超时时间200s)
我感觉有俩问题,1、连接地址和帐号不是一回事,你最好不要用域名做连接地址,可以用IP地址;2、你是在不行通过空间服务商进入线上后台,如果还不行就联系空间商,可能是他们的问题.果是VPS的话好像要开通ftp某些权限才可以,你只是开通了帐号,能连接,并没有给ftp上传下载的权限,这个我在空间商里面看过教程的,在这没网络不让发连接,你可以在网络搜一下试试,希望能帮助你。
‘贰’ java实现ftp的断点续传问题
//尝试移动文件内读取指针,实现断点续传
result = uploadFile(remoteFileName, f, ftpClient, remoteSize);
//如果断点续传没有成功,则删除服务器上文件,重新上传
if(result == UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return UploadStatus.Delete_Remote_Faild;
}
result = uploadFile(remoteFileName, f, ftpClient, 0);
}
‘叁’ java jdk1.6环境下实现 ftp文件上传
通过JDK自带的API实现
package com.cloudpower.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* Java自带的API对FTP的操作
* @Title:Ftp.java
* @author: 周玲斌
*/
public class Ftp {
/**
* 本地文件名
*/
private String localfilename;
/**
* 远程文件名
*/
private String remotefilename;
/**
* FTP客户端
*/
private FtpClient ftpClient;
/**
* 服务器连接
* @param ip 服务器IP
* @param port 服务器端口
* @param user 用户名
* @param password 密码
* @param path 服务器路径
* @author 周玲斌
* @date 2012-7-11
*/
public void connectServer(String ip, int port, String user,
String password, String path) {
try {
/* ******连接服务器的两种方法*******/
//第一种方法
// ftpClient = new FtpClient();
// ftpClient.openServer(ip, port);
//第二种方法
ftpClient = new FtpClient(ip);
ftpClient.login(user, password);
// 设置成2进制传输
ftpClient.binary();
System.out.println("login success!");
if (path.length() != 0){
//把远程系统上的目录切换到参数path所指定的目录
ftpClient.cd(path);
}
ftpClient.binary();
} catch (IOException ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
/**
* 关闭连接
* @author 周玲斌
* @date 2012-7-11
*/
public void closeConnect() {
try {
ftpClient.closeServer();
System.out.println("disconnect success");
} catch (IOException ex) {
System.out.println("not disconnect");
ex.printStackTrace();
throw new RuntimeException(ex);
}
}
/**
* 上传文件
* @param localFile 本地文件
* @param remoteFile 远程文件
* @author 周玲斌
* @date 2012-7-11
*/
public void upload(String localFile, String remoteFile) {
this.localfilename = localFile;
this.remotefilename = remoteFile;
TelnetOutputStream os = null;
FileInputStream is = null;
try {
//将远程文件加入输出流中
os = ftpClient.put(this.remotefilename);
//获取本地文件的输入流
File file_in = new File(this.localfilename);
is = new FileInputStream(file_in);
//创建一个缓冲区
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
System.out.println("upload success");
} catch (IOException ex) {
System.out.println("not upload");
ex.printStackTrace();
throw new RuntimeException(ex);
} finally{
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 下载文件
* @param remoteFile 远程文件路径(服务器端)
* @param localFile 本地文件路径(客户端)
* @author 周玲斌
* @date 2012-7-11
*/
public void download(String remoteFile, String localFile) {
TelnetInputStream is = null;
FileOutputStream os = null;
try {
//获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。
is = ftpClient.get(remoteFile);
File file_in = new File(localFile);
os = new FileOutputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
System.out.println("download success");
} catch (IOException ex) {
System.out.println("not download");
ex.printStackTrace();
throw new RuntimeException(ex);
} finally{
try {
if(is != null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String agrs[]) {
String filepath[] = { "/temp/aa.txt", "/temp/regist.log"};
String localfilepath[] = { "C:\\tmp\\1.txt","C:\\tmp\\2.log"};
Ftp fu = new Ftp();
/*
* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器
*/
fu.connectServer("127.0.0.1", 22, "anonymous", "IEUser@", "/temp");
//下载
for (int i = 0; i < filepath.length; i++) {
fu.download(filepath[i], localfilepath[i]);
}
String localfile = "E:\\号码.txt";
String remotefile = "/temp/哈哈.txt";
//上传
fu.upload(localfile, remotefile);
fu.closeConnect();
}
}
‘肆’ Java ftp 断点续传报错
NoClassDefFoundError
1.未通过编译
2.没有引入jar包
‘伍’ java ftp上传到linux服务器,程序上百个文件上传,中间出现中断,改怎么解决啊
tar ,把文件打包一起上传
‘陆’ FTP上传时经常中断,怎么办
原因:ftp上传经常中断
分析:本地网络+查看服务器运行状态+服务端网络+服务器端FTP服务+检查FTP服务端设置+上传的数据文件数量+日志
解决办法:
1、检查本地网络是否有抖动或者断网从而导致本地FTP客户端软件连接到服务器之间有问题。
2、查看需要服务器状态是否正常,是否宕机或者有其他问题导致的中断。
3、查看服务器端网络是否有抖动或者断网从而导致FTP服务端与FTP客户端无法正常连接。
4、检查服务器端FTP服务是否正常运行。
5、查看FTP服务端配置中的连接时间设置。
6、如果上传文件数量比较大,建议您将文件打成压缩包的方式以二进制上传。
7、分析FTP服务日至,查到问题根源。
(6)java使用ftp中断文件上传扩展阅读:
开发任何基于 FTP 的客户端软件都必须遵循 FTP 的工作原理,FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;
另一条是控制连接,用于传送控制信息(命令和响应),这种将命令和数据分开传送的思想大大提高了 FTP 的效率,而其它客户服务器应用程序一般只有一条 TCP 连接。图 1 给出了 FTP 的基本模型。
客户有三个构件:用户接口、客户控制进程和客户数据传送进程。服务器有两个构件:服务器控制进程和服务器数据传送进程。在整个交互的 FTP 会话中,控制连接始终是处于连接状态的,数据连接则在每一次文件传送时先打开后关闭。
‘柒’ java实现ftp断点续传问题
//尝试移动文件内读取指针,实现断点续传
result
=
uploadFile(remoteFileName,
f,
ftpClient,
remoteSize);
//如果断点续传没有成功,则删除服务器上文件,重新上传
if(result
==
UploadStatus.Upload_From_Break_Failed){
if(!ftpClient.deleteFile(remoteFileName)){
return
UploadStatus.Delete_Remote_Faild;
}
result
=
uploadFile(remoteFileName,
f,
ftpClient,
0);
}
‘捌’ java ftp 上传文件失败
首先确认ftp服务器是否支持Passive模式,其次看看是否防火墙或网络链路问题
建议抓包看看
‘玖’ ftp上传文件时中断或超时怎么解决
实验分析:
第一次,上传了39.9M共计4330个文件,用了半小时,中间出现多次传输失败。
第二次,上传了12.9M的一个压缩包文件,用了6秒,中间未出现传输失败。
第三次,上传了117M的一个压缩包文件,用了17秒,中间未出现传输失败。
细心的人不难看出,出现上传中断的实验中,所上传的数据有个明显的特点:文件数特别多。而上传成功的两次,则只有一个文件上传。
这样看来,FTP上传中断应该是跟待上传的文件个数有关了。
专业解释如下:
FTP是应用层的协议,它基于传输层,为用户服务,它们负责进行文件的传输。FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间会非常长,并且不时的必需执行一些冗长的登录进程。
FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。当数据通过数据流传输时,控制流处于空闲状态。而当控制流空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。此时,虽然文件可以成功的传输,但因为控制会话会被防火墙断开,传输会产生一些错误。
说的这么专业,很多非计算机专业的童鞋可能看能云里雾里,那么我们通俗的解释下为什么会出现FTP上传的文件数比较多的时候就会很慢而且经常中断。
我们把服务器比作一座城市,我们上传的文件就是想要去到城市里的人,FTP协议是想要进城必须遵守的规矩,而传输数据的端口就是城门,每一个文件看做一个人。
当我们使用FTP客户端向服务器上传文件数表较多的数据的时候,可以看做是一群人分别驾驶着自己的小轿车通过端口这座门户进入服务器这座城市。
但是,因为进城就必须遵守一定的规则(FTP协议),也就是必须先去命令端口这道门申报一下我要进城然后从数据端口这道门进去,且每次开门只能进一辆车,例如上图的5辆车进城就必须排队等着城门(数据端口)开启关闭5次,而每一次开启关闭城门用时特别久,最重要的是在命令端口这道门申报了之后并不是一直有效,而是在一定时间之后就会关闭,数据端口一看命令端口关闭了,就会跟着关闭,而这时候因为开门关门占用了大量的时间,等待进城的这些车并没有全部进去,这时候就需要重新去命令端口申报,这就是为什么上传着数据中突然中断了,因为命令端口的开放时间到了,必须重新申报了。
那么将大量数据压缩成一个压缩包上传呢,这时候就可以看做是一群人坐着一辆大巴车进城。
这时候,因为只有一辆车进城,所以在命令端口开放的时间内,这辆大巴车就已经进去城市了,也就不会出现中断了。
分析到了这里,我们应该很明白了,如果想解决FTP上传中断的问题,那么最好的解决办法就是将数据打包压缩之后再上传,这样就不会出现上传中断了,切记,千万不要一次上传太多的文件,一定要打包压缩上传。
‘拾’ 如何用java代码实现ftp文件上传
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class test {
private FTPClient ftp;
/**
*
* @param path 上传到ftp服务器哪个路径下
* @param addr 地址
* @param port 端口号
* @param username 用户名
* @param password 密码
* @return
* @throws Exception
*/
private boolean connect(String path,String addr,int port,String username,String password) throws Exception {
boolean result = false;
ftp = new FTPClient();
int reply;
ftp.connect(addr,port);
ftp.login(username,password);
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(path);
result = true;
return result;
}
/**
*
* @param file 上传的文件或文件夹
* @throws Exception
*/
private void upload(File file) throws Exception{
if(file.isDirectory()){
ftp.makeDirectory(file.getName());
ftp.changeWorkingDirectory(file.getName());
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]);