您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
三六零分类信息网 > 安顺分类信息网,免费分类信息发布

SpringBoot怎么使用FTP操作文件

2026/1/24 5:34:41发布33次查看
简介使用 springboot 配置 ftp 服务器,上传、删除、下载文件。
配置 ftp检查是否安装 vsftpd
rpm -qa | grep vsftpd
检修是否已经安装 vsftpd 及查看版本号.
安装 vsftpd
yum -y install vsftpd
如果报错,则使用管理员权限执行 sudo yum -y install vsftpd
关闭匿名访问
关闭匿名访问后,想访问里面的文件就需要账号和密码;如果不关,就可以直接访问。
vim /etc/vsftpd/vsftpd.conf
如果提示是只读文件,那么你只需要输入命令: sudo vim /etc/vsftpd/vsftpd.conf
如下:
# example config file /etc/vsftpd/vsftpd.conf## the default compiled in settings are fairly paranoid. this sample file# loosens things up a bit, to make the ftp daemon more usable.# please see vsftpd.conf.5 for all compiled in defaults.## read this: this example file is not an exhaustive list of vsftpd options.# please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's# capabilities.## allow anonymous ftp? (beware - allowed by default if you comment this out).anonymous_enable=no## uncomment this to allow local users to log in.local_enable=yes## uncomment this to enable any form of ftp write command.write_enable=yes## default umask for local users is 077. you may wish to change this to 022,# if your users expect that (022 is used by most other ftpd's)local_umask=022## uncomment this to allow the anonymous ftp user to upload files. this only# has an effect if the above global write enable is activated. also, you will# obviously need to create a directory writable by the ftp user.# when selinux is enforcing check for se bool allow_ftpd_anon_write, allow_ftpd_full_access#anon_upload_enable=yes## uncomment this if you want the anonymous ftp user to be able to create# new directories.#anon_mkdir_write_enable=yes## activate directory messages - messages given to remote users when they# go into a certain directory.dirmessage_enable=yes## activate logging of uploads/downloads.xferlog_enable=yes## make sure port transfer connections originate from port 20 (ftp-data).connect_from_port_20=yes## if you want, you can arrange for uploaded anonymous files to be owned by# a different user. note! using "root" for uploaded files is not# recommended!#chown_uploads=yes#chown_username=whoever## you may override where the log file goes if you like. the default is shown# below.#xferlog_file=/var/log/xferlog## if you want, you can have your log file in standard ftpd xferlog format.# note that the default log file location is /var/log/xferlog in this case.xferlog_std_format=yes## you may change the default value for timing out an idle session.#idle_session_timeout=600
关闭匿名访问就是将:anonymous_enable=no
启动服务
systemctl start vsftpd.service
查看服务状态
systemctl status vsftpd.service
[root@hadoop-master ~]# systemctl status vsftpd.service● vsftpd.service - vsftpd ftp daemon loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled) active: active (running) since 一 2022-12-19 10:15:39 cst; 58min ago process: 21702 execstart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/success) main pid: 21703 (vsftpd) cgroup: /system.slice/vsftpd.service └─21703 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf12月 19 10:15:39 hadoop-master systemd[1]: starting vsftpd ftp daemon...12月 19 10:15:39 hadoop-master systemd[1]: started vsftpd ftp daemon.[root@hadoop-master ~]#
看到绿色的 active(running),代表着启动成功正在运行中。
添加 ftp 用户
因为在 linux 上,root 用户是不能登陆 ftp 的。如果你输入的是 root 用户,登陆会失败的。
adduser ftpadmin
设置密码:
passwd ftpadmin
输入两次密码就 ok 了。
配置允许root用户登录
将 /etc/vsftpd/user_list 文件和 /etc/vsftpd/ftpusers 文件中的root这一行注释掉
修改/etc/vsftpd/vsftpd.conf,在最后一行处添加local_root=/
service vsftpd restart
这样远程就可以root用户身份登录ftp了。
文件存储地址授权
如存储地址为:app/upload/,设置权限为:
chmod 777 /app/upload/
springboot 编码添加依赖
<dependency> <groupid>com.jcraft</groupid> <artifactid>jsch</artifactid> <version>0.1.55</version></dependency>
操作文件工具类
package com.demo.utils;import com.jcraft.jsch.*;import com.demo.dto.uploadfiledto;import lombok.extern.slf4j.slf4j;import java.io.file;import java.io.fileoutputstream;import java.util.properties;/** * @classname: uploadfileutils.java * @description: 上传文件 * @author: tanyp * @date: 2022/12/19 10:38 **/@slf4jpublic class uploadfileutils { /** * @monthname: upload * @description: 上传文件 * @author: tanyp * @date: 2022/12/19 10:38 * @param: [dto] * @return: boolean **/ public static boolean upload(uploadfiledto dto) throws exception { log.info("============上传文件开始=============="); boolean result = false; channelsftp sftp = null; channel channel = null; session sshsession = null; try { jsch jsch = new jsch(); jsch.getsession(dto.getaccount(), dto.gethost(), dto.getport()); sshsession = jsch.getsession(dto.getaccount(), dto.gethost(), dto.getport()); sshsession.setpassword(dto.getpasswd()); properties sshconfig = new properties(); sshconfig.put("stricthostkeychecking", "no"); sshsession.setconfig(sshconfig); sshsession.connect(); channel = sshsession.openchannel("sftp"); channel.connect(); sftp = (channelsftp) channel; sftp.cd(dto.getworkingdir()); sftp.put(dto.getinputstream(), dto.getfilename()); result = true; log.info("============上传文件结束=============="); } catch (jschexception e) { result = false; log.error("=====上传文件异常:{}", e.getmessage()); e.printstacktrace(); } finally { closechannel(sftp); closechannel(channel); closesession(sshsession); } return result; } /** * @monthname: delete * @description: 删除文件 * @author: tanyp * @date: 2022/12/19 10:38 * @param: [dto] * @return: boolean **/ public static boolean delete(uploadfiledto dto) throws exception { log.info("============删除文件开始=============="); boolean result = false; channelsftp sftp = null; channel channel = null; session sshsession = null; try { jsch jsch = new jsch(); jsch.getsession(dto.getaccount(), dto.gethost(), dto.getport()); sshsession = jsch.getsession(dto.getaccount(), dto.gethost(), dto.getport()); sshsession.setpassword(dto.getpasswd()); properties sshconfig = new properties(); sshconfig.put("stricthostkeychecking", "no"); sshsession.setconfig(sshconfig); sshsession.connect(); channel = sshsession.openchannel("sftp"); channel.connect(); sftp = (channelsftp) channel; sftp.cd(dto.getworkingdir()); sftp.rm(dto.getfilename()); result = true; log.info("============删除文件结束=============="); } catch (jschexception e) { result = false; log.error("=====删除文件异常:{}", e.getmessage()); e.printstacktrace(); } finally { closechannel(sftp); closechannel(channel); closesession(sshsession); } return result; } /** * @monthname: download * @description: 下载文件 * @author: tanyp * @date: 2022/12/19 10:38 * @param: [dto] * @return: boolean **/ public static boolean download(uploadfiledto dto) throws exception { log.info("============下载文件开始=============="); boolean result = false; channelsftp sftp = null; channel channel = null; session sshsession = null; try { jsch jsch = new jsch(); jsch.getsession(dto.getaccount(), dto.gethost(), dto.getport()); sshsession = jsch.getsession(dto.getaccount(), dto.gethost(), dto.getport()); sshsession.setpassword(dto.getpasswd()); properties sshconfig = new properties(); sshconfig.put("stricthostkeychecking", "no"); sshsession.setconfig(sshconfig); sshsession.connect(); channel = sshsession.openchannel("sftp"); channel.connect(); sftp = (channelsftp) channel; sftp.cd(dto.getworkingdir()); sftp.get(dto.getfilename(), new fileoutputstream(new file(dto.getdownloadpath()))); sftp.disconnect(); sftp.getsession().disconnect(); result = true; log.info("============下载文件结束=============="); } catch (jschexception e) { result = false; log.error("=====下载文件异常:{}", e.getmessage()); e.printstacktrace(); } finally { closechannel(sftp); closechannel(channel); closesession(sshsession); } return result; } private static void closechannel(channel channel) { if (channel != null) { if (channel.isconnected()) { channel.disconnect(); } } } private static void closesession(session session) { if (session != null) { if (session.isconnected()) { session.disconnect(); } } }}
uploadfiledto.java
package com.demo.dto;import io.swagger.annotations.apimodel;import io.swagger.annotations.apimodelproperty;import lombok.allargsconstructor;import lombok.builder;import lombok.data;import lombok.noargsconstructor;import java.io.inputstream;/** * @classname: uploadfiledto.java * @classpath: com.demo.dto.uploadfiledto.java * @description: 上传文件 * @author: tanyp * @date: 2022/12/19 10:38 **/@data@allargsconstructor@noargsconstructor@builder@apimodel(value = "上传文件dto")public class uploadfiledto { @apimodelproperty(value = " ftp 服务器ip地址") private string host; @apimodelproperty(value = " ftp 服务器port,默认是21") private integer port; @apimodelproperty(value = " ftp 服务器用户名") private string account; @apimodelproperty(value = " ftp 服务器密码") private string passwd; @apimodelproperty(value = " ftp 服务器存储图片的绝对路径") private string workingdir; @apimodelproperty(value = "上传到ftp 服务器文件名") private string filename; @apimodelproperty(value = " 文件流") private inputstream inputstream; @apimodelproperty(value = " 下载文件的路径") private string downloadpath;}
uploadvo.java
package com.demo.vo;import io.swagger.annotations.apimodel;import io.swagger.annotations.apimodelproperty;import lombok.allargsconstructor;import lombok.builder;import lombok.data;import lombok.noargsconstructor;/** * @classname: uploadvo.java * @classpath: com.demo.vo.uploadvo.java * @description: 文件vo * @author: tanyp * @date: 2022/12/19 15:18 **/@data@allargsconstructor@noargsconstructor@builder@apimodel(value = "文件vo")public class uploadvo { @apimodelproperty(value = "原始文件名称") private string oldname; @apimodelproperty(value = "新文件名称") private string newname; @apimodelproperty(value = "访问路径") private string path;}
uploadcontroller
package com.demo.controller;import com.demo.vo.uploadvo;import com.demo.service.uploadservice;import io.swagger.annotations.api;import io.swagger.annotations.apioperation;import lombok.extern.slf4j.slf4j;import org.springframework.beans.factory.annotation.autowired;import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.multipartfile;/** * @classname: uploadcontroller.java * @classpath: com.demo.controller.uploadcontroller.java * @description: 上传文件 * @author: tanyp * @date: 2022/12/19 15:18 **/@slf4j@restcontroller@requestmapping("/upload")@api(value = "upload", tags = "上传文件")public class uploadcontroller { @autowired private uploadservice uploadservice; @apioperation(value = "上传图片", notes = "上传图片") @postmapping("/uploadimage") public uploadvo uploadimage(@requestparam("file") multipartfile file) { return uploadservice.uploadimage(file); } @apioperation(value = "删除文件", notes = "删除文件") @getmapping("/delfile") public boolean delfile(string filename) { return uploadservice.delfile(filename); } @apioperation(value = "下载文件", notes = "下载文件") @getmapping("/downloadfile") public boolean downloadfile(string filename, string downloadpath) { return uploadservice.downloadfile(filename, downloadpath); }}
uploadservice
package com.demo.service;import com.demo.vo.uploadvo;import org.springframework.web.multipart.multipartfile;/** * @classname: uploadservice.java * @classpath: com.demo.service.uploadservice.java * @description:上传文件 * @author: tanyp * @date: 2022/12/19 15:18 **/public interface uploadservice { uploadvo uploadimage(multipartfile file); boolean delfile(string filename); boolean downloadfile(string filename, string downloadpath);}
uploadserviceimpl
package com.demo.service.impl;import com.demo.dto.uploadfiledto;import com.demo.vo.uploadvo;import com.demo.config.ftpconfig;import com.demo.service.uploadservice;import com.demo.utils.uuidutils;import com.demo.utils.uploadfileutils;import com.demo.exception.businessexception;import lombok.extern.slf4j.slf4j;import org.springframework.beans.factory.annotation.autowired;import org.springframework.stereotype.service;import org.springframework.web.multipart.multipartfile;import java.time.localdate;import java.time.format.datetimeformatter;import java.util.objects;/** * @classname: uploadserviceimpl.java * @classpath: com.demo.service.impl.uploadserviceimpl.java * @description: 上传文件 * @author: tanyp * @date: 2022/12/19 15:18 **/@slf4j@servicepublic class uploadserviceimpl implements uploadservice { @autowired private ftpconfig ftpconfig; @override public uploadvo uploadimage(multipartfile file) { log.info("=======上传图片开始,图片名称:{}", file.getoriginalfilename()); try { // 1. 取原始文件名 string oldname = file.getoriginalfilename(); // 2. ftp 服务器的文件名 string newname = localdate.now().format(datetimeformatter.ofpattern("yyyymmdd")) + uuidutils.getuuid(10) + oldname.substring(oldname.lastindexof(".")); // 3.上传图片 boolean result = uploadfileutils.upload( uploadfiledto.builder() .host(ftpconfig.host) .port(ftpconfig.post) .account(ftpconfig.username) .passwd(ftpconfig.password) .workingdir(ftpconfig.basepath) .filename(newname) .inputstream(file.getinputstream()) .build() ); // 4.返回结果 if (!result) { throw new businessexception("上传图片失败!"); } log.info("=======上传图片结束,新图片名称:{}", newname); return uploadvo.builder() .oldname(oldname) .newname(newname) .path(ftpconfig.imagebaseurl + "/" + newname) .build(); } catch (exception e) { log.error("=======上传图片异常,异常信息:{}", e.getmessage()); e.printstacktrace(); } return null; } @override public boolean delfile(string filename) { if (objects.isnull(filename)) { throw new businessexception("文件名称为空,请核实!"); } try { boolean result = uploadfileutils.delete( uploadfiledto.builder() .host(ftpconfig.host) .port(ftpconfig.post) .account(ftpconfig.username) .passwd(ftpconfig.password) .workingdir(ftpconfig.basepath) .filename(filename) .build() ); return result; } catch (exception e) { log.error("=======删除文件异常,异常信息:{}", e.getmessage()); e.printstacktrace(); } return null; } @override public boolean downloadfile(string filename, string downloadpath) { if (objects.isnull(filename) || objects.isnull(downloadpath)) { throw new businessexception("文件名称或下载路径为空,请核实!"); } try { boolean result = uploadfileutils.download( uploadfiledto.builder() .host(ftpconfig.host) .port(ftpconfig.post) .account(ftpconfig.username) .passwd(ftpconfig.password) .workingdir(ftpconfig.basepath) .filename(filename) .downloadpath(downloadpath) .build() ); return result; } catch (exception e) { log.error("=======下载文件异常,异常信息:{}", e.getmessage()); e.printstacktrace(); } return null; }}
ftpconfig
package com.demo.config;import org.springframework.beans.factory.annotation.value;import org.springframework.stereotype.component;/** * @classname: ftpconfig.java * @classpath: com.demo.config.ftpconfig.java * @description: ftp配置 * @author: tanyp * @date: 2022/12/19 22:28 **/@componentpublic class ftpconfig { // ftp 服务器ip地址 @value("${ftp.host}") public string host; // ftp 服务器port,默认是21 @value("${ftp.post}") public integer post; // ftp 服务器用户名 @value("${ftp.username}") public string username; // ftp 服务器密码 @value("${ftp.password}") public string password; // ftp 服务器存储图片的绝对路径 @value("${ftp.base-path}") public string basepath; // ftp 服务器外网访问图片路径 @value("${ftp.image-base-url}") public string imagebaseurl;}
application.yml
# ftpftp: host: 127.0.0.1 post: 22 username: ftpadmin password: ftpadmin base-path: /app/upload/images image-base-url: http://127.0.0.1:8080/images
配置 nginxserver { listen 8080; server_name localhost; location /images/ { root /app/upload/; autoindex on; }}
以上就是springboot怎么使用ftp操作文件的详细内容。
安顺分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product