Inhaltsverzeichnis
Einführung
FTP konfigurieren
Geben Sie das Passwort zweimal ein und es ist OK.
Heim Java javaLernprogramm Wie SpringBoot FTP zum Bearbeiten von Dateien verwendet

Wie SpringBoot FTP zum Bearbeiten von Dateien verwendet

May 12, 2023 pm 07:37 PM
ftp springboot

Einführung

Verwenden Sie SpringBoot, um den FTP-Server zum Hochladen, Löschen und Herunterladen von Dateien zu konfigurieren.

FTP konfigurieren

Überprüfen Sie, ob vsftpd installiert ist

rpm -qa | grep vsftpd
Nach dem Login kopieren

Überprüfen Sie, ob vsftpd installiert wurde und überprüfen Sie die Versionsnummer.

Vsftpd installieren

yum -y install vsftpd
Nach dem Login kopieren

Wenn ein Fehler gemeldet wird, verwenden Sie Administratorrechte zu Führen Sie sudo yum -y install vsftpd aus. sudo yum -y install vsftpd

关闭匿名访问

关闭匿名访问后,想访问里面的文件就需要账号和密码;如果不关,就可以直接访问。

vim /etc/vsftpd/vsftpd.conf
Nach dem Login kopieren

如果提示是只读文件,那么你只需要输入命令: 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
Nach dem Login kopieren

关闭匿名访问就是将:anonymous_enable=NO

启动服务

systemctl start vsftpd.service
Nach dem Login kopieren

查看服务状态

systemctl status vsftpd.service
Nach dem Login kopieren
[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 ~]#
Nach dem Login kopieren

看到绿色的 active(running),代表着启动成功正在运行中。

添加 FTP 用户

因为在 Linux 上,root 用户是不能登陆 FTP 的。如果你输入的是 root 用户,登陆会失败的。

adduser ftpadmin
Nach dem Login kopieren

设置密码:

passwd ftpadmin
Nach dem Login kopieren

输入两次密码就 ok 了。

配置允许root用户登录

/etc/vsftpd/user_list 文件和 /etc/vsftpd/ftpusers 文件中的root这一行注释掉

修改/etc/vsftpd/vsftpd.conf,在最后一行处添加local_root=/

service vsftpd  restart
Nach dem Login kopieren

这样远程就可以root用户身份登录ftp了。

文件存储地址授权

如存储地址为:app/upload/

Anonymen Zugriff deaktivieren

Nachdem Sie den anonymen Zugriff deaktiviert haben, benötigen Sie ein Konto und ein Passwort, um auf die darin enthaltenen Dateien zuzugreifen deaktiviert ist, können Sie direkt darauf zugreifen.

chmod 777 /app/upload/
Nach dem Login kopieren

Wenn es sich bei der Eingabeaufforderung um eine schreibgeschützte Datei handelt, müssen Sie nur den Befehl eingeben: sudo vim /etc/vsftpd/vsftpd.conf

Wie folgt:

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
Nach dem Login kopieren

An Deaktivieren Sie den anonymen Zugriff, ändern Sie einfach: anonym_enable =NEIN

Starten Sie den Dienst

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();
            }
        }
    }

}
Nach dem Login kopieren

Überprüfen Sie den Dienststatus

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;

}
Nach dem Login kopieren
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;

}
Nach dem Login kopieren

Siehe den grünen aktiv (läuft), was den Start bedeutet ist erfolgreich und läuft.

FTP-Benutzer hinzufügen

Denn unter Linux kann sich der Root-Benutzer nicht bei FTP anmelden. Wenn Sie den Root-Benutzer eingeben, schlägt die Anmeldung fehl.

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);
    }

}
Nach dem Login kopieren
Passwort festlegen:

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);

}
Nach dem Login kopieren

Geben Sie das Passwort zweimal ein und es ist OK.

🎜🎜Konfigurieren Sie, um die Anmeldung als Root-Benutzer zu ermöglichen🎜🎜🎜Platzieren Sie root</code in der Datei <code>/etc/vsftpd/user_list und /etc/vsftpd/ftpusers file >Kommentieren Sie diese Zeile aus🎜🎜Ändern Sie /etc/vsftpd/vsftpd.conf und fügen Sie local_root=/🎜
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;
    }

}
Nach dem Login kopieren
🎜 zur letzten Zeile hinzu, damit Sie sich remote anmelden können als Root-Benutzer ftp. 🎜🎜🎜Autorisierung der Dateispeicheradresse🎜🎜🎜Wenn die Speicheradresse lautet: app/upload/, setzen Sie die Berechtigung auf: 🎜
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;

}
Nach dem Login kopieren
🎜SpringBoot-Codierung🎜🎜🎜Abhängigkeit hinzufügen🎜🎜
# 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
Nach dem Login kopieren
🎜🎜Betriebsdatei Werkzeugklasse 🎜🎜
server {
    listen       8080;
    server_name  localhost;

    location /images/ {
        root  /app/upload/;
        autoindex on;
    }
}
Nach dem Login kopieren
🎜UploadFileDto.java🎜rrreee🎜UploadVo.java🎜rrreee🎜🎜UploadController🎜🎜rrreee🎜🎜UploadService🎜🎜rrreee🎜🎜UploadService Impl🎜🎜rrreee 🎜🎜FtpConfig🎜🎜rrreee🎜🎜application.yml🎜🎜rrreee🎜 Konfigurieren Sie Nginx 🎜rrreee

Das obige ist der detaillierte Inhalt vonWie SpringBoot FTP zum Bearbeiten von Dateien verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

FTP in Go verwenden: Eine vollständige Anleitung FTP in Go verwenden: Eine vollständige Anleitung Jun 17, 2023 pm 06:31 PM

Mit der rasanten Entwicklung des Internets war das File Transfer Protocol (FTP) schon immer eine wichtige Dateiübertragungsmethode. In der Go-Sprache kann die Verwendung von FTP zum Übertragen von Dateien für viele Entwickler ein Bedarf sein. Allerdings wissen viele Leute möglicherweise nicht, wie man FTP in der Go-Sprache verwendet. In diesem Artikel erfahren Sie, wie Sie FTP in der Go-Sprache verwenden, von der Verbindung zum FTP-Server bis zur Dateiübertragung, und wie Sie mit Fehlern und Ausnahmen umgehen. Erstellen Sie eine FTP-Verbindung. In der Go-Sprache können wir das Standardpaket „net“ verwenden, um eine Verbindung zu FTP herzustellen

So implementieren Sie verteilte Sperren mit Redis in SpringBoot So implementieren Sie verteilte Sperren mit Redis in SpringBoot Jun 03, 2023 am 08:16 AM

1. Redis implementiert das Prinzip der verteilten Sperren und warum verteilte Sperren erforderlich sind. Bevor über verteilte Sperren gesprochen wird, muss erläutert werden, warum verteilte Sperren erforderlich sind. Das Gegenteil von verteilten Sperren sind eigenständige Sperren. Wenn wir Multithread-Programme schreiben, vermeiden wir Datenprobleme, die durch den gleichzeitigen Betrieb einer gemeinsam genutzten Variablen verursacht werden. Normalerweise verwenden wir eine Sperre, um die Richtigkeit der gemeinsam genutzten Variablen sicherzustellen Die gemeinsam genutzten Variablen liegen im gleichen Prozess. Wenn es mehrere Prozesse gibt, die gleichzeitig eine gemeinsam genutzte Ressource betreiben müssen, wie können sie sich dann gegenseitig ausschließen? Heutige Geschäftsanwendungen sind in der Regel Microservice-Architekturen, was auch bedeutet, dass eine Anwendung mehrere Prozesse bereitstellen muss. Wenn mehrere Prozesse dieselbe Datensatzzeile in MySQL ändern müssen, ist eine Verteilung erforderlich, um fehlerhafte Daten zu vermeiden wird zu diesem Zeitpunkt eingeführt. Der Stil ist gesperrt. Punkte erreichen wollen

So lösen Sie das Problem, dass Springboot nach dem Einlesen in ein JAR-Paket nicht auf die Datei zugreifen kann So lösen Sie das Problem, dass Springboot nach dem Einlesen in ein JAR-Paket nicht auf die Datei zugreifen kann Jun 03, 2023 pm 04:38 PM

Springboot liest die Datei, kann aber nach dem Packen in ein JAR-Paket nicht auf die neueste Entwicklung zugreifen. Es gibt eine Situation, in der Springboot die Datei nach dem Packen in ein JAR-Paket nicht lesen kann ist ungültig und kann nur über den Stream gelesen werden. Die Datei befindet sich unter resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

PHP und FTP: Realisierung der Dateifreigabe zwischen mehreren Abteilungen bei der Website-Entwicklung PHP und FTP: Realisierung der Dateifreigabe zwischen mehreren Abteilungen bei der Website-Entwicklung Jul 28, 2023 pm 01:01 PM

PHP und FTP: Ermöglichen Sie die gemeinsame Nutzung von Dateien zwischen mehreren Abteilungen bei der Website-Entwicklung. Mit der Entwicklung des Internets beginnen immer mehr Unternehmen, Website-Plattformen zur Informationsfreigabe und Geschäftsförderung zu nutzen. Es stellt sich jedoch das Problem, wie Dateifreigabe und Zusammenarbeit zwischen mehreren Abteilungen erreicht werden können. In diesem Fall werden PHP und FTP zu den am häufigsten verwendeten Lösungen. In diesem Artikel wird erläutert, wie Sie mit PHP und FTP eine Dateifreigabe zwischen mehreren Abteilungen bei der Website-Entwicklung erreichen. 1. Einführung in FTP FTP (FileTransferPr

Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Dec 29, 2023 am 11:02 AM

SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

So vergleichen Sie Verzeichnisse und Dateien auf einem FTP-Server über PHP So vergleichen Sie Verzeichnisse und Dateien auf einem FTP-Server über PHP Jul 28, 2023 pm 02:09 PM

So vergleichen Sie Verzeichnisse und Dateien auf einem FTP-Server über PHP. In der Webentwicklung müssen wir manchmal lokale Dateien mit Dateien auf dem FTP-Server vergleichen, um die Konsistenz zwischen beiden sicherzustellen. PHP stellt einige Funktionen und Klassen zur Implementierung dieser Funktionalität bereit. In diesem Artikel wird die Verwendung von PHP zum Vergleichen von Verzeichnissen und Dateien auf einem FTP-Server vorgestellt und relevante Codebeispiele bereitgestellt. Zuerst müssen wir eine Verbindung zum FTP-Server herstellen. PHP bietet die Funktion ftp_connect() zum Einrichten eines FTP-Servers

Wie SpringBoot Redis anpasst, um die Cache-Serialisierung zu implementieren Wie SpringBoot Redis anpasst, um die Cache-Serialisierung zu implementieren Jun 03, 2023 am 11:32 AM

1. Passen Sie den RedisTemplate1.1-Standard-Serialisierungsmechanismus an. Die API-basierte Redis-Cache-Implementierung verwendet die RedisTemplate-Vorlage für Daten-Caching-Vorgänge. Öffnen Sie hier die RedisTemplate-Klasse und zeigen Sie die Quellcodeinformationen der Klasse publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations an. Schlüssel deklarieren, verschiedene Serialisierungsmethoden des Werts, der Anfangswert ist leer @NullableprivateRedisSe

So erhalten Sie den Wert in application.yml in Springboot So erhalten Sie den Wert in application.yml in Springboot Jun 03, 2023 pm 06:43 PM

In Projekten werden häufig einige Konfigurationsinformationen benötigt. Diese Informationen können in der Testumgebung und in der Produktionsumgebung unterschiedliche Konfigurationen haben und müssen möglicherweise später basierend auf den tatsächlichen Geschäftsbedingungen geändert werden. Wir können diese Konfigurationen nicht fest im Code codieren. Am besten schreiben Sie sie in die Konfigurationsdatei. Sie können diese Informationen beispielsweise in die Datei application.yml schreiben. Wie erhält oder verwendet man diese Adresse im Code? Es gibt 2 Methoden. Methode 1: Wir können den Wert, der dem Schlüssel in der Konfigurationsdatei (application.yml) entspricht, über den mit @Value versehenen Wert erhalten. Diese Methode eignet sich für Situationen, in denen es relativ wenige Mikrodienste gibt: Tatsächlich Projekte, wenn das Geschäft kompliziert ist, Logik

See all articles