您的位置:首页 > 运维架构 > Linux

Java 使用ftp的方式上传文件到linux,并实现删除,下载

2017-12-20 14:29 1136 查看
连接条件:1.主机

2.端口(注意端口不是22,22为ssh默认端口,一般为21,或者20)

3.用户名和密码

一切准备就绪,执行代码发现执行失败报530错误,拒绝连接
错误分析:

用户名或者密码错误

linux没有安装ftp,或者ftp没有启动。ps -ef | grep ftp

linux默认root用户没有权限

修改方式:1.vi /etc/vsftpd/ftpusers 将root那一行注释

2.vi /etc/vsftpd/user_list 将root那行注释

4.service vsftpd restart 重启服务

然后,运行代码,发现返回230,证明连接linux成功

执行代码,向linux上传文件发现返回值为false

查看错误原因以及描述:ftp失败不会报任何异常

要注意使用System.out.println(ftpClient.getReplyCode());
System.out.println(ftpClient.getReplyString());

勤看返回代码以及原因描述。

执行代码发现,上传失败,错误代码425

第一步:ftpClient.enterLocalPassiveMode();

将ftp上传的模式变为被动模式

执行代码,发现还是失败,查看错误码为553

解决办法:1、设置selinux

vi /etc/sysconfig/selinux

将其中的SELINUX=enforcing改为SELINUX=disabled

2、设置如下

setsebool -P allow_ftpd_full_access 1

执行代码,问题解决。

上传文件还有sftp:顾名思义,s为安全,sftp比ftp安全好多,但是效率比ftp低好多,具体看需求选择方式

上代码;

package
com.example.demo.linux.test;

import
org.apache.commons.net.ftp.FTP;
import
org.apache.commons.net.ftp.FTPClient;
import
org.apache.commons.net.ftp.FTPFile;
import
org.apache.commons.net.ftp.FTPReply;

import
java.io.*;
import
java.net.SocketException;

public class
FtpUtils {

/**
* Description: 向FTP服务器上传文件
*
@param
host
FTP服务器hostname
*
@param
port
FTP服务器端口
*
@param
username
FTP登录账号
*
@param
password
FTP登录密码
*
@param
basePath
FTP服务器基础目录
*
@param
filePath
FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
*
@param
filename
上传到FTP服务器上的文件名
*
@param
input
输入流
*
@return
成功返回true,否则返回false
*/
public static
boolean
uploadFile(String host,
int
port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
//创建ftp客户端
FTPClient ftpClient =
new
FTPClient();
ftpClient.setControlEncoding("UTF-8");

try
{
//链接ftp服务器
ftpClient.connect(host, port);
//登录ftp
ftpClient.login(username, password);
int
reply = ftpClient.getReplyCode();
System.out.println(reply);
//如果reply返回230就算成功了,如果返回530密码用户名错误或当前用户无权限下面有详细的解释。
if
(!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return false;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();//设置ftp为被动模式

if(ftpClient.changeWorkingDirectory(basePath)){
String[] split = filePath.split("/");
for
(String s : split) {
ftpClient.makeDirectory(s);
ftpClient.changeWorkingDirectory(s);

}
}else{
return false;

}

// ftpClient.makeDirectory("path");//在root目录下创建文件夹
//ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
// ftpClient.enterLocalPassiveMode();
System.out.println(ftpClient.getReplyCode());
System.out.println(ftpClient.getReplyString());
boolean
b = ftpClient.storeFile(filename, input);//文件你若是不指定就会上传到root目录下
System.out.println(ftpClient.getReplyCode());
System.out.println(ftpClient.getReplyString());
System.out.println(b);

// ftpClient.makeDirectory("abc");
String s = ftpClient.printWorkingDirectory();
System.out.println(s);
FTPFile[] ftpFiles = ftpClient.listDirectories();
for
(FTPFile ftpFile : ftpFiles) {
System.out.println(ftpFile.getName());
}
input.close();
ftpClient.logout();
if(b){
return true;
}
}
catch
(SocketException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}finally
{
if
(ftpClient.isConnected())
{
try
{
ftpClient.disconnect();
}
catch
(IOException ioe)
{
ioe.printStackTrace();
}
}

}
return false;
}

/**
* Description: 从FTP服务器下载文件
*
@param
host
FTP服务器hostname
*
@param
port
FTP服务器端口
*
@param
username
FTP登录账号
*
@param
password
FTP登录密码
*
@param
remotePath
FTP服务器上的相对路径
*
@param
fileName
要下载的文件名
*
@param
localPath
下载后保存到本地的路径
*
@return
*/
public static
boolean
downloadFile(String host,
int
port, String username, String password, String remotePath,
String fileName, String localPath) {
//创建ftp客户端
FTPClient ftpClient =
new
FTPClient();
ftpClient.setControlEncoding("UTF-8");
try
{
//链接ftp服务器
ftpClient.connect(host, port);
//登录ftp
ftpClient.login(username, password);
int
reply = ftpClient.getReplyCode();
System.out.println(reply);
//如果reply返回230就算成功了,如果返回530密码用户名错误或当前用户无权限下面有详细的解释。
if
(!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return false;
}
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();//设置ftp为被动模式
if
(ftpClient.changeWorkingDirectory(remotePath)) {

}
else
{
return false;

}
// ftpClient.deleteFile("");删除文件
FTPFile[] ftpFiles = ftpClient.listFiles();
for
(FTPFile ftpFile : ftpFiles) {
if
(ftpFile.getName().equalsIgnoreCase(fileName)) {
File localFile =
new
File(localPath +
"/"
+ fileName);

OutputStream is =
new
FileOutputStream(localFile);
boolean
b = ftpClient.retrieveFile(ftpFile.getName(), is);
if
(b) {
return true;
}
is.close();
}
}
ftpClient.logout();

}
catch
(SocketException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
if
(ftpClient.isConnected()) {
try
{
ftpClient.disconnect();
}
catch
(IOException ioe) {
ioe.printStackTrace();
}
}

}
return false;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: