java代码实现文件上传到linux服务器及问题汇总及解决(亲测可行)

时间:2023-02-10 11:30:59
近段时间java代码向服务器上传文件的代码。可是屡试不行。很是郁闷。最终还是完成了。自己也总结了许多上传中的错误及解决分析,都是自己自己总结的,若有什么理解错误,欢迎大家留下宝贵意见,还有很多不懂得大家一起深入了解。在此谢过了
下面附上代码。

jar包我资源里免费的,欢迎大家下载。

package net.rytong;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
/**
*
* @author zhou_dong
*
*服务器上传文件 2014-03-07 17:03
*/
public class MyFTP {

public static void main(String[] args) {

File imagefile = new File("D:/var/iosclient.jpg");
String imagefileFileName = "苹果.jpg";
//创建ftp客户端
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("GBK");
String hostname = "192.168.xx.xx";
int port = 21;
String username = "root";
String password = "rytongxxxxxxx";
try {
//链接ftp服务器
ftpClient.connect(hostname, port);
//登录ftp
ftpClient.login(username, password);
int reply = 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目录下创建文件夹
String remoteFileName = System.currentTimeMillis()+"_"+imagefileFileName;
InputStream input = new FileInputStream(imagefile);
ftpClient.storeFile(remoteFileName, input);//文件你若是不指定就会上传到root目录下
input.close();
ftpClient.logout();

} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally
{
if (ftpClient.isConnected())
{
try
{
ftpClient.disconnect();
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}

}
}

}

在运行是遇到的错误

(一):java代码实现文件上传到linux服务器及问题汇总及解决(亲测可行)这个错误总是遇到困惑我好久,后来就查资料发现,是因为端口号的问题;我们上传问价遵循ftp协议,而一般文件传输的ftp端口默认是21和20,而22是ssh服务的端口。这个错误不小心就发生的。注意了!
(二):java代码实现文件上传到linux服务器及问题汇总及解决(亲测可行)这种错误经常遇到,还是原因最多的,最令人头疼的。在这我只是总结了部分原因:
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     未执行请求的操作:文件名不合法