赞
踩
最近在帮同学做一个音乐推荐系统后台,需要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账号没有上传文件的权限。
解决方法:http://blog.csdn.net/chuweiguo789/article/details/44015529
============以下转载自:http://blog.csdn.net/chuweiguo789/article/details/44015529 ===================
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/test2、建用户:在root用户下:useradd -d /home/test test //增加用户test,并制定test用户的主目录为/home/testpasswd test //为test设置密码3、更改用户相应的权限设置:usermod -s /sbin/nologin test //限定用户test不能telnet,只能ftpusermod -s /sbin/bash test //用户test恢复正常usermod -d /test test //更改用户test的主目录为/test4、限制用户只能访问/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 restart5、如果需要允许用户修改密码,但是又没有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 未执行请求的操作:文件名不合法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。