最近在帮同学做一个音乐推荐系统后台,需要java远程调用Linux服务器,执行深度学习算法,处理由本地上传的文件。查找了相关的资料,利用ftpClient上传文件到服务器。在此贴一下这个助手类(网上很多)。

import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
/**
* JAVA FTPClient 工具类
*
* commons-net-1.4.1.jar PFTClinet jar包
*
* @author : hpp
*/
public class FtpClientUtils{
/**

* Description: 向FTP服务器上传文件

* @Version1.0

* @param url FTP服务器hostname

* @param port FTP服务器端口

* @param username FTP登录账号

* @param password FTP登录密码

* @param path FTP服务器保存目录

* @param filename 上传到FTP服务器上的文件名

* @param input 输入流

* @return 成功返回true,否则返回false

*/

public static boolean uploadFile(

String url,//FTP服务器hostname

int port,//FTP服务器端口

String username, // FTP登录账号

String password, //FTP登录密码

String path, //FTP服务器保存目录

String filename, //上传到FTP服务器上的文件名

InputStream input // 输入流

) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;

ftp.connect(url, port);//连接FTP服务器

//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器

ftp.login(username, password);//登录
reply = ftp.getReplyCode();
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();

System.out.println("FTP服务器 拒绝连接");

return success;
}
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
/**

* 删除文件

* @param fileName 要删除的文件地址

* @return true/false

* @throws IOException

*/

public static boolean delete(String fileName, FTPClient ftpClient) throws IOException {
return ftpClient.deleteFile(fileName);

}

/**

* 下载文件到指定目录

* @param ftpFile 文件服务器上的文件地址

* @param dstFile 输出文件的路径和名称

* @throws Exception

*/

public static void downLoad(String ftpFile, String dstFile, FTPClient ftpClient) throws Exception {
if (StringUtils.isBlank(ftpFile)) {
throw new RuntimeException("ftpFile为空");
}
if (StringUtils.isBlank(dstFile)) {
throw new RuntimeException("dstFile为空");
}
File file = new File(dstFile);
FileOutputStream fos = new FileOutputStream(file);
ftpClient.retrieveFile(ftpFile, fos);
fos.flush();
fos.close();
}

/**

* 从文件服务器获取文件流

* @param ftpFile 文件服务器上的文件地址

* @return {@link InputStream}

* @throws IOException

*/

public static InputStream retrieveFileStream(String ftpFile, FTPClient ftpClient) throws IOException {
if (StringUtils.isBlank(ftpFile)) {
throw new RuntimeException("ftpFile为空");
}
return ftpClient.retrieveFileStream(ftpFile);
}
public static void main(String[] args) {
try {
FileInputStream in=new FileInputStream(new File("F:\\istep\\istep\\src\\main\\webapp\\recordFiles\\333.mp3"));
boolean flag = uploadFile("XXX.XXX.XXX.XXX", 21, "userName", "password", "/home/tomcat-istep-8787/webapps/istep/videoPlay/", "333.mp3", in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

测试的时候可以打印一下reply,根据不同的reply可以判断不同的登录失败原因,我自己遇到的是返回530、账号密码都正确。

原因是:root账号没有上传文件的权限。