当前位置:

首页 > 编程开发 > SpringBoot怎么使用FTP操作文件

SpringBoot怎么使用FTP操作文件

简介使用SpringBoot配置FTP服务器,上传、删除、下载文件。配置FTP检查是否安装vsftpdrpm-qa|grepvsftpd检修是否已经安装vsftpd及查看版本号.安装vsftpdyum-yinstallvsftpd如果报错,则使用管理员权限执行sudoyum-yinstallvsftpd关闭匿名访问关闭匿名访问后,想访问里面的文件就需要账号和密码;如果不关,就可以直接访问。vim/etc/vsftpd/vsftpd.conf如果提示是只读文件,那么你只需要输入命令:sudovim/etc/

本文目录

    简介

    使用 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.conf
    
    12月 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 编码

    添加依赖

    
        com.jcraft
        jsch
        0.1.55
    

    操作文件工具类

    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
     **/
    @Slf4j
    public 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
    @Service
    public 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
     **/
    @Component
    public 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

    # ftp
    ftp:
      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

    配置 Nginx

    server {
        listen       8080;
        server_name  localhost;
    
        location /images/ {
            root  /app/upload/;
            autoindex on;
        }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 FTP
    相关文章 更多
    FreeBSD FTP 的架设教程
    FreeBSD FTP 的架设教程

    FreeBSD 安装完成之后,其实系统里已经内置了 FTP 服务。只不过,默认情况下它并没有被激活。很多人觉得系统自带的 ftpd 功能相对简单,会选择用 proftpd 或 pu re-ftpd 这样的第三方方案来替代。但需要特别留意的是,FTP 服务程序经常爆出安全漏洞,选用第三方软件时一定要记

    告别FTP/SFTP,Croc成文件传输新选择!
    告别FTP/SFTP,Croc成文件传输新选择!

    告别FTP/SFTP!是时候拥抱下一代文件传输利器Croc了!在两台电脑之间传输文件的方法有很多,例如通过FTP或SSH传输文件,但这些方法的步骤较为复杂,需要搭建FTP服务或学习SCP指令。那么,有没有更简单的方式可以从一台电脑点对点地将文件传输到另一台电脑呢?传输过程需要快速且安全,本文将介绍一款用Go语言编写的工具——Croc,它具备以下功能和优势。工具特点及优势:使用Relay方式让任意两台电脑传输文件点对点加密(使用PAKE)跨平台传输文件(Windows、Lin

    Beyond Compare 4 Mac中文版文件对比工具
    Beyond Compare 4 Mac中文版文件对比工具

    BeyondCompare4forMac是一款出色的Mac平台文件比较工具,被誉为文件对比软件中的佼佼者,深受全球Mac用户的喜爱。BeyondCompare4forMac(好用的文件对比工具)beyondcomparemac功能介绍多平台支持BeyondCompare不仅适用于Mac,还可以在Windows和Linux上运行。其运行速度快,界面友好,并根据不同平台的需求进行功能优化。压缩文件支持BeyondCompare能够处理多种压缩文件格式,如tar、gzip、bzip2、Mi

    Windows和Mac免费FTP客户端推荐
    Windows和Mac免费FTP客户端推荐

    大家好,今天我们又迎来了博学时间。在之前的「趣谈前端」中,我与大家分享了关于「可视化低代码」的技术以及「前端工程化」的最佳实践。今天,让我们来探讨一下在「Windows」和「Mac」系统下最佳的免费「FTP客户端」。「FTP客户端」能够让我们轻松地通过可视化方式管理服务器上的文件资源,并且可以简单地将本地电脑的文件上传到服务器。如果你不喜欢使用命令行操作或者没有技术背景,「FTP客户端」将是一个不错的选择。Windows下的FTP客户端:WinSCPimage.png「WinSCP」是「Windows」上

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    FTP服务器的功能及用途
    FTP服务器的功能及用途

    FTP(文件传输协议)服务器是一种用于在计算机之间传输文件的协议。它允许用户通过网络将文件从一个计算机传输到另一个计算机,提供了可靠、安全和高效的文件传输方式。下面将介绍FTP服务器的作用。文件共享和传输FTP服务器最基本的作用是文件共享和传输。通过FTP服务器,用户可以方便地共享文件,无论是在局域网内的多台电脑之间,还是在互联网上的不同地区之间。用户可以进

    学习如何使用PHP和FTP进行文件传输
    学习如何使用PHP和FTP进行文件传输

    随着互联网的普及和技术的不断发展,文件传输变得越来越方便和快速。其中,PHP和FTP成为了文件传输中最常用的工具之一。PHP可以在服务器端对文件进行操作和访问,而FTP则是一种协议,在服务器之间进行文件传输。在本文中,我们将学习如何使用PHP和FTP进行文件传输。一、PHP文件传输PHP是一种广泛应用于网页编写的开源编程语言。它可以在服务器端对文件进行操作,

    Everything怎样启用ftp服务器-Everything启用ftp服务器的方法
    Everything怎样启用ftp服务器-Everything启用ftp服务器的方法

    很多用户在使用Everything软件的时候,不熟悉Everything怎样启用ftp服务器?接下来,小编就为各位带来了Everything启用ftp服务器的方法,让我们一起来下文看看吧。打开everything软件,进入到软件主界面,点击上方箭头所指的工具选项。在工具选项的下拉栏目中,选择箭头所指的选项栏,来进入到设置页面。进入到设置页面,在左侧的栏目中,选择箭头所指的ETP/FTP服务器选项,来进行设置。进入到ETP/FTP服务器页面,勾选箭头所指的启用ETP/FTP服务器选项,然后依次点击应用确定就

    解析SpringBoot和SpringMVC之间的异同
    解析SpringBoot和SpringMVC之间的异同

    解析SpringBoot和SpringMVC之间的异同SpringBoot和SpringMVC是Java领域中非常重要的开发框架。虽然它们都属于Spring框架的一部分,但是在使用和功能上有一些明显的区别。本文将对SpringBoot和SpringMVC进行比较,解析它们之间的异同。首先,让我们来了解一下SpringBoot。SpringBo

    探索SpringCloud和SpringBoot在微服务领域的不同应用方式
    探索SpringCloud和SpringBoot在微服务领域的不同应用方式

    近年来,随着云计算和分布式架构的兴起,微服务架构的应用越来越广泛。而SpringCloud和SpringBoot作为Java开发中的两个重要框架,对于微服务的实现起到了重要的作用。然而,很多人对于它们在微服务领域的不同应用方式还存在一定的疑惑。本文将从不同的角度探索SpringCloud和SpringBoot在微服务中的应用方式。首先,我们来了解一下Spri

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。