近段时间java代码向服务器上传文件的代码。可是屡试不行。很是郁闷。最终还是完成了。自己也总结了许多上传中的错误及解决分析,都是自己自己总结的,若有什么理解错误,欢迎大家留下宝贵意见,还有很多不懂得大家一起深入了解。在此谢过了
下面附上代码。
jar包我资源里免费的,欢迎大家下载。
packagenet.rytong;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
.SocketException;
.ftp.FTPClient;
.ftp.FTPReply;
/**
*
*@authorzhou_dong
*
*服务器上传文件-03-0717:03
*/
publicclassMyFTP{
publicstaticvoidmain(String[]args){
Fileimagefile=newFile("D:/var/iosclient.jpg");
StringimagefileFileName="苹果.jpg";
//创建ftp客户端
FTPClientftpClient=newFTPClient();
ftpClient.setControlEncoding("GBK");
Stringhostname="192.168.xx.xx";
intport=21;
Stringusername="root";
Stringpassword="rytongxxxxxxx";
try{
//链接ftp服务器
ftpClient.connect(hostname,port);
//登录ftp
ftpClient.login(username,password);
intreply=ftpClient.getReplyCode();
System.out.println(reply);
//如果reply返回230就算成功了,如果返回530密码用户名错误或当前用户无权限下面有详细的解释。
if(!FTPReply.isPositiveCompletion(reply)){
ftpClient.disconnect();
return;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.makeDirectory("path");//在root目录下创建文件夹
StringremoteFileName=System.currentTimeMillis()+"_"+imagefileFileName;
InputStreaminput=newFileInputStream(imagefile);
ftpClient.storeFile(remoteFileName,input);//文件你若是不指定就会上传到root目录下
input.close();
ftpClient.logout();
}catch(SocketExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally
{
if(ftpClient.isConnected())
{
try
{
ftpClient.disconnect();
}catch(IOExceptionioe)
{
ioe.printStackTrace();
}
}
}
}
}
在运行是遇到的错误
(一):
这个错误总是遇到困惑我好久,后来就查资料发现,是因为端口号的问题;我们上传问价遵循ftp协议,而一般文件传输的ftp端口默认是21和20,而22是ssh服务的端口。这个错误不小心就发生的。注意了!
(二):
这种错误经常遇到,还是原因最多的,最令人头疼的。在这我只是总结了部分原因:
1:先看linux服务器的防火墙关了没。service iptables stop 关闭防火墙。这算一个错误。
2:若是防火墙关了,还报此错误。你可以继续排查。看linux是否有ftp服务。
你可以使用 service vsftpd status 来查看ftp是否开启。(vsftpd is running...,是说明目前ftp是开启状态),chkconfig --list vsftpd 也是查看ftp服务是否开启(netstat -tnl也可以查询21端口是否开启)。
也可以使用ps -ef | grep ftp 来查看本地是否含有包含ftp的进程开启。(看ftp22端口是否使用)。
总之第二个原因就是服务器是否有ftp服务。若没有你要自己安装ftp服务器,若有,而是没有启动你可以启动ftp服务(使用service vsftpd start 启动 或者 service vsftpd restart 重启)。
(三):就是你连接上了,只是ftpClient.getReplyCode()的返回值是530,那么就是因为你当前用户没有传输文件的权限,先提供如下解决办法。
一般root用户是有权限的若是root还返回530,就用一下方法:先查看/etc/vsftpd/下面的文件ftpusers和user_list里面是否有你的用户名,若有注释就可以了。这两个文件中的用户都是没有权限。(亲测土办法!) ; 给用户添加ftp权限:以下步骤是在网上搜的没有亲测,大家可以试试。 在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1、环境:ftp为vsftp。被限制用户名为test。被限制路径为/home/test 2、建用户:在root用户下: useradd -d /home/test test //增加用户test,并制定test用户的主目录为/home/test passwd test //为test设置密码 3、更改用户相应的权限设置: usermod -s /sbin/nologin test //限定用户test不能telnet,只能ftp usermod -s /sbin/bash test //用户test恢复正常 usermod -d /test test //更改用户test的主目录为/test 4、限制用户只能访问/home/test,不能访问其他路径 修改/etc/vsftpd/vsftpd.conf如下: chroot_list_enable=YES //限制访问自身目录 # (default follows) chroot_list_file=/etc/vsftpd/vsftpd.chroot_list 编辑 vsftpd.chroot_list文件,将受限制的用户添加进去,每个用户名一行 改完配置文件,不要忘记重启vsFTPd服务器 [root@linuxsir001 root]# /etc/init.d/vsftpd restart 5、如果需要允许用户修改密码,但是又没有telnet登录系统的权限: usermod -s /usr/bin/passwd test //用户telnet后将直接进入改密界面 看到230,恭喜你。总算大功告成了!!!哎、、、不容易哈! 最后附上ftpClient.getReplyCode()的返回值的对应信息: 110 重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。 120 服务在nnn分钟内准备好 125 数据连接已打开,准备传送 150 文件状态良好,打开数据连接 200 命令成功 202 命令未实现 211 系统状态或系统帮助响应 212 目录状态 213 文件状态 214 帮助信息,信息仅对人类用户有用 215 名字系统类型 220 对新用户服务准备好 221 服务关闭控制连接,可以退出登录 225 数据连接打开,无传输正在进行 226 关闭数据连接,请求的文件操作成功 227 进入被动模式 230 用户登录 250 请求的文件操作完成 257 创建 "PATHNAME " 331 用户名正确,需要口令 332 登录时需要帐户信息 350 请求的文件操作需要进一步命令 421 不能提供服务,关闭控制连接 425 不能打开数据连接 426 关闭连接,中止传输 450 请求的文件操作未执行 451 中止请求的操作:有本地错误 452 未执行请求的操作:系统存储空间不足 500 格式错误,命令不可识别 501 参数语法错误 502 命令未实现 503 命令顺序错误 504 此参数下的命令功能未实现 530 未登录(用户名或密码错误,1、FTP密码修改了?2、用户名/密码输入错误?先仔细检查有无输入错误 如复制的时候误复制了空格!!) 532 存储文件需要帐户信息 550 未执行请求的操作 551 请求操作中止:页类型未知 552 请求的文件操作中止,存储分配溢出 553 未执行请求的操作:文件名不合法