Java操作FTP实现上传下载功能_第1页
Java操作FTP实现上传下载功能_第2页
Java操作FTP实现上传下载功能_第3页
Java操作FTP实现上传下载功能_第4页
Java操作FTP实现上传下载功能_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java操作FTP实现上传下载功能目录FTP简介FTP架构FTP数据连接模式用户认证客户端Vsftp安装与配置启动服务配置文件说明传输模式配置系统用户配置java操作ftp文件服务器1.引入依赖2.提供接口3.对提供操作ftp接口进行实现4.配置ftp相关参数5.写测试controller

FTP简介

文件传输协议(FileTransferProtocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在OSI模型的第七层,TCP模型的第四层,即应用层,使用TCP传输而不是UDP,客户在和服务器建立连接前要经过一个三次握手的过程,保证客户与服务器之间的连接是可靠的,而且是面向连接,为数据传输提供可靠保证。

FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。可以使用FTP进行下载和上传。

文件传送协议FTP(FileTransferProtocol)是Internet上使用比较广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP屏蔽了各种计算机系统的细节,因此适用于在异构网络中任意计算机之间传送文件。它的基本应用就是将文件从一台计算机复制到另一台计算机中。它要存取一个文件,就必须先获得一个本地文件的副本,如果修改文件,也只能对文件的副本进行修改,然后再将修改后的文件副本传回到原节点。

您只要记住几个关键词:交互式、存取权限和副本。

简单文件传送协议TFTP(TrivialFileTransferProtocol)是一个小而易于实现的文件传送协议。TFTP是基于UDP数据报,需要有自己的差错改正措施。TFTP只支持文件传输,不支持交互,没有庞大的命令集。也没有目录列表功能,以及不能对用户进行身份鉴别。但它的代码所占内存较小,不需要硬盘就可以固化TFTP代码,很适合较小的计算机和特殊用途的设备。

您会发现TFTP和FTP一个主要的区别就是它没有交互式,且不进行身份验证。

FTP的客户可以是任意平台

FTP标准端口:

20数据接口21指令接口

FTP架构

FTP监听于TCP的21号端口,是一种C/S架构的应用程序。在Linux中常用的服务端软件和客户端软件一般如下表所示:

FTP数据连接模式

FTP有2种数据连接模式:命令连接和数据连接

命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止(可以简单的理解为建立连接)数据连接:是指数据传输,按需创建及关闭的连接(可以简单的理解为传输数据)

数据连接需要关注的点有:

1.数据传输格式

文件传输二进制传输

2.数据传输模式

主动模式:由服务器端创建数据连接被动模式:由客户端创建数据连接

两种数据传输模式的建立过程:

1.主动模式

命令连接(建立连接通道)

Client端以一个1024以上的随机端口(端口号大于1023小于65535)来连接Server端的21号端口

数据连接(传输数据)

Server端以20号端口去连接Client创建命令连接时使用的随机端口+1的端口

示例:

命令连接:Client(9527)Server(21),数据连接:Server(20/tcp)--Client(9527+1)

2.被动模式

命令连接

Client以一个1024以上的随机端口号(端口号大于1023小于65535)来连接Server端的21号端口,命令连接建立完毕后,Server端会告知Client端用于创建数据连接的随机端口号(端口号大于1023小于65535)

数据连接

Client以创建命令连接时使用的随机端口号+1去连服务器端通过命令连接告知自己的一个随机端口号来创建数据连接

示例:

命令连接:Client(9527)--Server(21),数据连接:Client(9527+1)--Server(随机端口)

注意:

主动模式存在弊端,因为客户端的端口是随机的,客户端如果开了防火墙,则服务器端去连客户端创建数据连接时可能会被拒绝

用户认证

Ftp的用户认证主要有三种:

1.虚拟用户:仅用于访问某特定服务中的资源

虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录

2.系统用户:可以登录系统的真实用户(出于对安全性的考虑,这种认证很少使用)

系统用户通过ftp访问的资源位置为用户的家目录

3.匿名用户

匿名用户(映射为ftp用户)的共享资源位置是/var/ftp

服务端

/etc/pam.d/vsftpd#vsftpd用户认证配置文件/etc/vsftpd/#配置文件目录/etc/vsftpd/vsftpd.conf#主配置文件vsftpd常见的配置参数

客户端

lftp工具支持指定用户名和密码登录

Vsftp安装与配置

在linux环境下,使用最多的FTP服务端软件就是Vsftpd!

安装Vsftpd,运行一下命令需要在root用户下进行!

yuminstallvsftpd安装

yumremovevsftpd卸载

启动服务

启动服务servicevsftpdstart或者systemctlstartvsftpd.service

重启服务systemctlrestartvsftpd.service

停止服务systemctlstopvsftpd.service

设置开机自启动systemctlenablevsftpd.service

配置文件说明

/etc/vsftpd/vsftpd.conf这个文件是vsftpd服务的核心配置文件!

我们在修改配置文件的时候,最好先备份一份!

cp/etc/vsftpd/vsftpd.conf/etc/vsftpd/vsftpd.conf.bak

/etc/vsftpd/ftpusers这个文件是禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。

/etc/vsftpd/user_list这个文件禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。

注意配置文件中的值一定不要有空格

#Exampleconfigfile/etc/vsftpd/vsftpd.conf

#禁止匿名登录

anonymous_enable=NO

#是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许

#本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub

#若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器

local_enable=YES

#是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许

write_enable=YES

#掩码,本地用户默认掩码为077

#你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值

local_umask=022

#是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES

#anon_upload_enable=YES

#是否允许匿名用户创建新文件夹

#anon_mkdir_write_enable=YES

#是否激活目录欢迎信息功能

#当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息

#默认情况下,欢迎信息是通过该目录下的.message文件获得的

#此文件保存自定义的欢迎信息,由用户自己建立

dirmessage_enable=YES

#是否让系统自动维护上传和下载的日志文件

#默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定

#默认值为NO

xferlog_enable=YES

#是否设定FTP服务器将启用FTP数据端口的连接请求

#ftp-data数据传输,21为连接控制端口

connect_from_port_20=YES

#设定是否允许改变上传文件的属主,与下面一个设定项配合使用

#注意,不推荐使用root用户上传文件

#chown_uploads=YES

#设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名

#可以把上传的文件都改成root属主。whoever:任何人

#chown_username=whoever

#设定系统维护记录FTP服务器上传和下载情况的日志文件

#xferlog_file=/var/log/xferlog

#如果你想,你可以有一个标准的ftpdxferlog格式的日志文件。

#注意默认的日志文件位置是/var/log/xferlog。

xferlog_std_format=YES

#您可以更改默认值,以使空闲会话超时。

#idle_session_timeout=600

##您可以更改数据连接超时的默认值。

#data_connection_timeout=120

#运行vsftpd需要的非特权系统用户,缺省是nobody

#nopriv_user=ftpsecure

#是否识别异步ABOR请求。

#如果FTPclient会下达“asyncABOR”这个指令时,这个设定才需要启用

#而一般此设定并不安全,所以通常将其取消

#async_abor_enable=YES

#是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。

#启用此选项将允许服务器以ASCII方式传输数据

#不过,这样可能会导致由"SIZE/big/file"方式引起的DoS攻击

#ascii_upload_enable=YES

#ascii_download_enable=YES

#登录FTP服务器时显示的欢迎信息

#如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后

#ftpd_banner=WelcometoblahFTPservice.

#黑名单设置。如果很讨厌某些emailaddress,就可以使用此设定来取消他的登录权限

#可以将某些特殊的emailaddress抵挡住。

#deny_email_enable=YES

#当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器

#此文件需用户自己创建,一行一个emailaddress即可

#banned_email_file=/etc/vsftpd/banned_emails

#Youmayspecifyanexplicitlistoflocaluserstochroot()totheirhome

#directory.Ifchroot_local_userisYES,thenthislistbecomesalistof

#userstoNOTchroot().

#(Warning!chroot'ingcanbeverydangerous.Ifusingchroot,makesurethat

#theuserdoesnothavewriteaccesstothetopleveldirectorywithinthe

#chroot)

chroot_local_user=YES

#允许chroot用户具备写权限

allow_writeable_chroot=YES

#当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。

#当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。

#当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。

#当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录。

chroot_list_enable=YES

#被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录

#从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立

#chroot_list_file=/etc/vsftpd/chroot_list

#是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O

#ls_recurse_enable=YES

#是否允许监听。

#如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求

listen=YES

#设定是否支持IPV6。如要同时监听IPv4和IPv6端口,

#则必须运行两套vsftpd,采用两套配置文件

#同时确保其中有一个监听选项是被注释掉的

#listen_ipv6=NO

#设置是否阻扯user_list文件中的用户登录FTP服务器,默认为YES

#userlist_deny=YES/NO

#设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件

#此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中

pam_service_name=vsftpd

#是否允许ftpusers文件中的用户登录FTP服务器,默认为NO

#若此项设为YES,则user_list文件中的用户允许登录FTP服务器

#而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有

userlist_enable=YES

#是否使用tcp_wrappers作为主机访问控制方式。

#tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制

#在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制

#前者设置允许访问记录,后者设置拒绝访问记录。

#如想限制某些主机对FTP服务器的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令:

#vsftpd::DENY和vsftpd::DENY

#表明限制IP为/主机访问IP为的FTP服务器

#此时FTP服务器虽可以PING通,但无法连接

tcp_wrappers=YES

#开启被动模式

pasv_enable=YES

#传输文件的端口范围,如果是云服务器记得开放端口,linux服务器本身也要开放端口

pasv_min_port=9000

pasv_max_port=9005

传输模式配置

开启被动模式:

connect_from_port_20=NO(默认为YES)#设置是否允许主动模式

pasv_enable=YES(默认为YES)#设置是否允许被动模式

pasv_min_port=50000(default:0(useanyport))

pasv_max_port=60000(default:0(useanyport))

开启主动模式:

connect_from_port_20=YES

pasv_enable=NO

系统用户配置

linux创建用户:

useradd-d/home/ftp/compass-s/sbin/nologincompass

passwdcompass

为虚拟用户创建家目录

mkdir-p/home/ftp/compass

设置权限

chown-Rcompass:compass/home/ftp/compass

配置selinux允许ftp访问home和外网访问

[root@master~]#setsebool-Pallow_ftpd_full_accesson

[root@master~]#setsebool-Ptftp_home_diron

重启vsftpd服务

[root@master~]#systemctlrestartvsftpd

无法登录的情况在/etc/vsftpd/vsftpd.conf配置文件中添加了以下两句

chroot_local_user=YES#原本就有,取掉注释就好

allow_writeable_chroot=YES#添加

chowncompass:compass-R/home/ftp/compass

java操作ftp文件服务器

有时候,我们需要接收用户上传的文件存储到服务器,然后保存起来,下次用户可以直接下载,或者是保存为档案,我这里提供三个方法,一个是上传文件到ftp,还有就是从ftp下载文件,还有就是删除ftp服务器删的文件

1.引入依赖

!--ftp上传下载--

dependency

groupIdcommons-net/groupId

artifactIdcommons-net/artifactId

version3.7/version

/dependency

2.提供接口

importjavax.servlet.http.HttpServletResponse;

importjava.io.InputStream;

importjava.io.OutputStream;

*ftp文件服务器操作接口

*@authorcompass

*@date2025/10/1915:00

*@since1.0.0

publicinterfaceFtpService{

*上传文件到ftp

*@paraminputStream输入流

*@paramfileName新的文件名,包含拓展名

*@paramfilePath保存路径

*@return

*@authorcompass

BooleanuploadFile(InputStreaminputStream,StringfileName,StringfilePath);

*下载ftp文件,直接转到输出流

*@authorcompass

*@paramftpFilePath

*@authorcompass

byte[]downloadFileBytes(StringftpFilePath,HttpServletResponseresponse);

*删除ftp文件

*@authorcompass

*@paramftpFilePathftp下文件路径,根目录开始

*@return

BooleandeleteFile(StringftpFilePath);

}

3.对提供操作ftp接口进行实现

*@authorcompass

*@date2025-10-19

*@since1.0

importjava.io.*;

importmon.AjaxResult;

import.entity.FtpInstanceEntity;

import.service.FtpService;

import.utils.ResponseUtil;

importlombok.extern.slf4j.Slf4j;

importmons.lang3.StringUtils;

import.ftp.FTP;

import.ftp.FTPClient;

import.ftp.FTPReply;

importorg.springframework.stereotype.Service;

importjavax.annotation.Resource;

importjavax.servlet.http.HttpServletResponse;

@Slf4j

@Service

publicclassFtpServiceImplimplementsFtpService{

@Resource

FtpInstanceEntityftpInstanceEntity;

*上传文件到ftp

*@paraminputStream输入流

*@paramfileName新的文件名,包含拓展名

*@paramfilePath保存路径

*@return

*@authorcompass

@Override

publicBooleanuploadFile(InputStreaminputStream,StringfileName,StringfilePath){

//定义保存结果

booleanisSuccess=false;

//初始化连接

FTPClientftp=connectFtpServer();

if(ftp!=null){

try{

//设置文件传输模式为二进制,可以保证传输的内容不会被改变

ftp.setFileType(FTP.BINARY_FILE_TYPE);

//注:上传文件都为0字节,设置为被动模式即可

ftp.enterLocalPassiveMode();

//跳转到指定路径,逐级跳转,不存在的话就创建再进入

toPathOrCreateDir(ftp,filePath);

//上传文件参数:上传后的文件名,输入流,,返回Boolean类型,上传成功返回true

isSuccess=ftp.storeFile(fileName,inputStream);

//关闭输入流

inputStream.close();

//退出ftp

ftp.logout();

}catch(IOExceptione){

log.error(e.toString());

}finally{

if(ftp.isConnected()){

try{

//断开ftp的连接

ftp.disconnect();

}catch(IOExceptionioe){

log.error(ioe.toString());

returnisSuccess;

*下载ftp文件,直接转到输出流

*@paramftpFilePath

*@authorcompass

@Override

publicbyte[]downloadFileBytes(StringftpFilePath,HttpServletResponseresponse){

FTPClientftp=connectFtpServer();

try{

ByteArrayOutputStreamstream=newByteArrayOutputStream();

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

ftp.enterLocalPassiveMode();

booleanretrieveFile=ftp.retrieveFile(ftpFilePath,stream);

if(!retrieveFile){

thrownewRuntimeException("FTP文件下载失败");

ftp.logout();

returnstream.toByteArray();

}catch(Exceptione){

log.error("FTP文件下载失败!"+e.toString());

ResponseUtil.response(response,AjaxResult.businessError(e.getMessage(),"-1"));

thrownewRuntimeException(e.getMessage());

}finally{

if(ftp.isConnected()){

try{

ftp.disconnect();

}catch(IOExceptionioe){

log.error(ioe.toString());

*删除ftp文件

*@paramftpFilePath文件路径

*@returnjava.lang.Boolean

*@authorcompass

*@date2025/10/1918:35

*@since1.0.0

@Override

publicBooleandeleteFile(StringftpFilePath){

FTPClientftp=connectFtpServer();

booleanresult=false;

try{

result=ftp.deleteFile(ftpFilePath);

ftp.logout();

returnresult;

}catch(Exceptione){

log.error("FTP文件删除失败!"+e.toString());

}finally{

if(ftp.isConnected()){

try{

ftp.disconnect();

}catch(IOExceptionioe){

log.error(ioe.toString());

returnresult;

*创建FTPClient对象

*@return.ftp.FTPClient

*@authorcompass

*@date2025/10/1918:35

*@since1.0.0

privateFTPClientconnectFtpServer(){

//创建FTPClient对象(对于连接ftp服务器,以及上传和上传都必须要用到一个对象)

FTPClientftpClient=newFTPClient();

//设置连接超时时间

ftpClient.setConnectTimeout(1000*10);

//设置ftp字符集

ftpClient.setControlEncoding("utf-8");

//设置被动模式,文件传输端口设置,否则文件上传不成功,也不报错

ftpClient.enterLocalPassiveMode();

try{

//定义返回的状态码

intreplyCode;

//连接ftp(当前项目所部署的服务器和ftp服务器之间可以相互通讯,表示连接成功)

ftpClient.connect(ftpInstanceEntity.getHost());

//输入账号和密码进行登录

ftpClient.login(ftpInstanceEntity.getUsername(),ftpInstanceEntity.getPassword());

//接受状态码(如果成功,返回230,如果失败返回503)

replyCode=ftpClient.getReplyCode();

//根据状态码检测ftp的连接,调用isPositiveCompletion(reply)--如果连接成功返回true,否则返回false

if(!FTPReply.isPositiveCompletion(replyCode)){

("connectftp{}failed",ftpInstanceEntity.getHost());

//说明连接失败,需要断开连接

ftpClient.disconnect();

thrownewRuntimeException(String.format("connectftp%sfailed",ftpInstanceEntity.getHost()));

("连接状态码:"+replyCode);

}catch(IOExceptione){

log.error("connectfail:"+e.toString());

thrownewRuntimeException(String.format("connectftp%serror",ftpInstanceEntity.getHost()));

returnftpClient;

*跳转到指定路径不存在就创建

*@paramftp操作ftp对象

*@paramfilePath文件路径

*@returnvoid

*@authorcompass

*@date2025/10/1915:05

*@since1.0.0

privatevoidtoPathOrCreateDir(FTPClientftp,StringfilePath)throwsIOException{

String[]dirs=filePath.split("/");

for(Stringdir:dirs){

if(StringUtils.isEmpty(dir)){

continue;

if(!ftp.changeWorkingDirectory(dir)){

ftp.makeDirectory(dir);

ftp.changeWorkingDirectory(dir);

4.配置ftp相关参数

在配置文件中配置连接ftp服务器的配置

ftp:

#ftp服务器的地址

host:

#ftp服务器的端口号(连接端口号)

port:21

#ftp的用户名

username:compass

#ftp的密码

password:6317738ef8324199a24602308f3a9a18

#ftp上传的根目录

basePath:/home/ftp/compass

#回显地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论