当前位置:   article > 正文

linux java 文件上传到服务器_java 上传文件到Linux服务器 工具类

文件上传到远程linux服务器java工具类

最近在帮同学做一个音乐推荐系统后台,需要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     未执行请求的操作:文件名不合法

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号