Zunächst können Sie den Unterschied zwischen den Protokollen SFTP und FTP verstehen. Ich werde hier nicht ins Detail gehen. Der Standard-Abhörport für SFTP ist 22. Der Standard-Abhörport für FTP ist 21. Zwischen beiden gibt es keinen wesentlichen Unterschied. Beide basieren auf Dateiübertragungsprotokollen. Ersteres weist eine hohe Sicherheitsleistung auf, während Letzteres eine hohe Effizienz aufweist. Kommen wir zum Punkt: Stellen Sie zunächst sicher, dass Ihr Linux-Konto eine Verbindung herstellen kann. Das Standardkennwort für SFTP ist das Kennwort des Linux-Root-Kontos.Dies sind Benutzername und Passwort Ihres Administratorkontos. Im Allgemeinen können Sie sich mit diesem Passwort einfach bei Sftp anmelden, ohne es zu ändern. Werfen wir einen Blick auf Xftp Eine erfolgreiche Verbindung zeigt an, dass kein Problem vorliegt. Zweitens: Wenn es sich um einen Alibaba Cloud-Server handelt, öffnen Sie unbedingt sowohl die Firewall als auch die Sicherheitsgruppe, um andere Probleme zu vermeiden.Es gibt auch eine Firewall Drittens ein sehr wichtiger Schritt: Hochladen über Java JSCHDer Blogger hier ist ein Maven-Projekt und sendet Ihnen das Paket direkt (wenn es sich um ein Webprojekt handelt, laden Sie das JAR-Paket von der offiziellen Website herunter). <Abhängigkeit> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.49</version> </Abhängigkeit> 4. Nachdem das Konfigurationspaket heruntergeladen wurde, verwenden Sie die Toolklasse, um die Verbindung hochzuladen. (Sie können die Konfigurationsdatei hier mit Anmerkungen versehen, um sie selbst zu konfigurieren)öffentliche Klasse SFTPInfo { öffentliche statische endgültige Zeichenfolge SFTP_REQ_HOST = "000.00.00.00"; //IP des Cloud-Servers public static final String SFTP_REQ_USERNAME = "00t"; // Benutzername public static final String SFTP_REQ_PASSWORD = "00"; // Passwort public static final int SFTP_DEFAULT_PORT = 22; // Port public static String basePath="/usr/games/images"; // Das Hauptverzeichnis, in dem die Datei auf dem Server gespeichert ist (das ist der Datei-Upload-Pfad) public static String baseUrl="https://##.##.com/images"; //Online-Domänennamenzugriff gibt den Nginx-Zugriffspfad an (der Pfad ist hier entscheidend) } Der Benutzername und das Passwort hier sind Ihr eigener Server-Benutzername und Ihr eigenes Server-Passwort. 5. SFTP-Upload-Tools:importiere java.io.InputStream; importiere java.util.Properties; importiere org.slf4j.Logger; importiere org.slf4j.LoggerFactory; importiere com.jcraft.jsch.Channel; importiere com.jcraft.jsch.ChannelSftp; importiere com.jcraft.jsch.JSch; importiere com.jcraft.jsch.JSchException; importiere com.jcraft.jsch.Session; importiere com.jcraft.jsch.SftpException; öffentliche Klasse SftpUtils { privater statischer endgültiger Logger LOG = LoggerFactory.getLogger(SftpUtils.class); /** * Referenzbeispiel * * @param args */ öffentlicher Kanal getChannel(Sitzung Sitzung) { Kanal Kanal = null; versuchen { Kanal = Sitzung.openChannel("sftp"); Kanal.verbinden(); LOG.info("Kanalerfolg erzielen!"); } Fang (JSchException e) { LOG.info("Kanal abrufen fehlgeschlagen!", e); } Rückkanal; } öffentliche Session getSession(String host, int port, String username, endgültiges String-Passwort) { Sitzung Sitzung = null; versuchen { JSch jsch = new JSch(); jsch.getSession(Benutzername, Host, Port); Sitzung = jsch.getSession(Benutzername, Host, Port); session.setPassword(passwort); Eigenschaften sshConfig = neue Eigenschaften(); sshConfig.put("StrictHostKeyChecking", "nein"); Sitzung.setConfig(sshConfig); Sitzung.verbinden(); LOG.info("Sitzung verbunden!"); } Fang (JSchException e) { LOG.info("Kanal abrufen fehlgeschlagen!", e); } Sitzung zurückgeben; } /** * Ordner erstellen * * @param sftp * @param dir * Ordnername */ public void mkdir(ChannelSftp sftp, String dir) { versuchen { sftp.mkdir(dir); System.out.println("Ordner erfolgreich erstellt!"); } Fang (SftpException e) { System.out.println("Ordner konnte nicht erstellt werden!"); e.printStackTrace(); } } /** * @param sftp * @param dir * Upload-Verzeichnis * @param-Datei * Datei hochladen * @return */ öffentliche Boolean UploadFile(ChannelSftp sftp, String Verzeichnis, InputStream Datei, String Dateiname) { Boolesche Flagge = falsch; versuchen { sftp.cd(dir); if (Datei != null) { sftp.put(Datei, Dateiname); Flagge=wahr; Flagge zurückgeben; } anders { Flagge=falsch; Flagge zurückgeben; } } Fang (Ausnahme e) { Flagge=falsch; Flagge zurückgeben; } } /** * Datei herunterladen * * @param-Verzeichnis * Download-Verzeichnis * @param downloadFile * Heruntergeladene Datei * @param saveFile * Der lokale Pfad * @param sftp */ öffentlicher String-Download (String-Verzeichnis, String-Downloaddatei, Zeichenfolge saveFile, ChannelSftp sftp) { String-Ergebnis = ""; versuchen { sftp.cd(Verzeichnis); sftp.get(Datei herunterladen, Datei speichern); Ergebnis = "Download erfolgreich!"; } Fang (Ausnahme e) { Ergebnis = "Download fehlgeschlagen!"; LOG.info("Download fehlgeschlagen!", e); ; } Ergebnis zurückgeben; } /** * Dateien löschen* * @param-Verzeichnis * Um das Verzeichnis zu löschen, in dem sich die Datei befindet* @param deleteFile * Zu löschende Datei * @param sftp */ öffentliche String löschen(String Verzeichnis, String Datei löschen, ChannelSftp sftp) { String-Ergebnis = ""; versuchen { sftp.cd(Verzeichnis); sftp.rm(Datei löschen); Ergebnis = "Erfolgreich gelöscht!"; } Fang (Ausnahme e) { Ergebnis = "Löschen fehlgeschlagen!"; LOG.info("Löschen fehlgeschlagen!", e); } Ergebnis zurückgeben; } private void closeChannel(Channel channel) { wenn (Kanal != null) { wenn (channel.isConnected()) { Kanal.Trennen(); } } } private void schließenSession(Sitzung Sitzung) { wenn (Sitzung != null) { wenn (session.isConnected()) { Sitzung.Trennen(); } } } public void closeAll(ChannelSftp sftp, Channel channel, Session session) { versuchen { Kanal schließen(sftp); Kanal schließen(Kanal); Sitzung schließen(Sitzung); } Fang (Ausnahme e) { LOG.info("Alle schließen", e); } } } Die Toolklasse muss nicht verändert werden und kann direkt verwendet werden. Es gibt auch eine Tool-Klasse zur zufälligen Generierung von Dateinamen, die ebenfalls an alle gesendet wird importiere java.util.Random; öffentliche Klasse IDUtils { /** * Generiere einen zufälligen Bildnamen */ öffentliche statische Zeichenfolge genImageName() { //Holen Sie sich den Long-Integer-Wert der aktuellen Zeit einschließlich Millisekunden long millis = System.currentTimeMillis(); //Drei Zufallszahlen hinzufügen Random random = new Random(); int end3 = zufällig.nextInt(999); //Wenn es weniger als drei Ziffern sind, füge 0 davor hinzu String str = Millis + String.format("%03d", end3); gibt str zurück; } } 6. HintergrundanforderungsmethodeDer Blogger hat zum Hochladen hier die Zwischenablage verwendet. Die Parameter unterstützen keine Serialisierung, daher werden sie einzeln akzeptiert. Es gibt viele @RequestParam("file") MultipartFile-Dateien. Das Hinzufügen anderer Parameter und der Post-Request-Methode führt zu einem Fehler, dass die Post-Request-Methode nicht gefunden werden kann. Dieses Problem betrifft es nicht. @Log("Informationen zum Hochladen von Website-Fällen") @AntwortBody @PostMapping("/hochladen") @RequiresPermissions("allgemein:Fälle:Upload") R hochladen(@RequestParam("Datei") MultipartFile-Datei,@RequestParam("ctitle") String ctitle, @RequestParam("cmessage") String cmessage, @RequestParam("Falleinführung") String-Falleinführung,@RequestParam("strdate") Datum strdate,@RequestParam("stpdate") Datum stpdate, @RequestParam("credate") Datum credate,HttpServletRequest Anfrage) wirft ParseException, IOException { Zeichenfolge alterName = file.getOriginalFilename(); //Verwenden Sie die Toolklasse IDUtils, um einen neuen Dateinamen zu generieren, neuer Dateiname = neuerName + Dateisuffix String newName = IDUtils.genImageName(); neuerName = neuerName + alterName.substring(alterName.letzterIndexvon(".")); SftpUtils ft = neue SftpUtils(); //Verbinden Sie die Parameter über die SFtoInfo-Parameter. Session s = ft.getSession(SFTPInfo.SFTP_REQ_HOST,SFTPInfo.SFTP_DEFAULT_PORT, SFTPInfo.SFTP_REQ_USERNAME,SFTPInfo.SFTP_REQ_PASSWORD); Kanal Kanal = ft.getChannel(s); ChannelSftp sftp = (ChannelSftp)Kanal; Boolescher Upload = ft.uploadFile(sftp,SFTPInfo.basePath, file.getInputStream(),neuerName); wenn(hochladen){ //Upload erfolgreich schließen ft.closeAll(sftp, channel, s); //Verbindung schließen CasesDO cases=new CasesDO(); Fälle.setCtitle(ctitle); // Das ist sehr wichtig. Dies ist der in die Datenbank geschriebene Zugriffspfad plus der Online-Domänenname, um auf das Bild zuzugreifen. Der Blogger hat hier ein SSL-Zertifikat hinzugefügt. // https://**.**.com/images newName=Dateiname Bild cases.setCaseimg(SFTPInfo.baseUrl + "/" + newName); Fälle.setCasetroduction(Falletroduction); Fälle.setStpdate(stpdate); Fälle.setCredate(credate); Fälle.setStrdate(strdate); Fälle.setCmessage(cmessage); wenn (casesService.save(cases) > 0) { return R.ok("Hochladen erfolgreich"); } }anders { return R.error("Upload-Fehler"); } return R.error(); } Schauen Sie sich das Front-End-JS an ------ Die Anforderungsparameter können durch HashMap ersetzt werden, das Back-End verwendet jedoch Object, um es zweimal in andere Typen zu konvertieren var Zwischenablage = neue Zwischenablage('button.copy', { Text: Funktion (Trigger) { layer.msg('Der Dateipfad wurde in die Zwischenablage kopiert'); gibt $(trigger).attr('url') zurück; } }); layui.use('hochladen', Funktion () { var upload = layui.upload; //Führen Sie das Beispiel upload.render({ aus. elem: '#test1', //Bindungselement-URL: '/common/cases/upload', //Größe der Upload-Schnittstelle: 100000, // auto: false, akzeptieren: 'Datei', //BindAction: "#Sendet ein", vorher: Funktion (Objekt) { //Die im Obj-Parameter enthaltenen Informationen sind genau dieselben wie im Choose-Callback. Der Eingabeparameter layer.load() wird an den Hintergrund übertragen; diese.daten = { ctitle: $('#ctitle').val(), cmessage: $('#cmessage').val() , Falleinführung: $('#casetroduction').val() ,strdate: $('#strdate').val() ,stpdate: $('#stpdate').val() ,credate: $('#credate').val(), }; }, fertig: Funktion (r) { übergeordnete Ebene.msg(r.msg); übergeordnetes Element.reLoad(); var index = parent.layer.getFrameIndex(window.name); // Fensterindex abrufen parent.layer.close(index); }, Fehler: Funktion (r) { Schicht.msg(r.msg); } }); }); Nach Erfolg in der Datenbank speichern------- 7. Ich werde die Seite nicht anzeigenNach erfolgreichem Upload befindet sich das Bild im Pfad /usr/games/images der Klasse SftpInfo, also der Serverpfadadresse. Nach erfolgreichem Upload befindet es sich in diesem Pfad. Wenn Sie nicht der Root-Benutzer sind, müssen Sie die Berechtigungen chmod 777 /usr/gemes/ erteilen. 8. Das Folgende ist die Nginx-Konfiguration (ich werde Ihnen hier nicht erklären, wie Sie Nginx installieren, Sie können auf Baidu danach suchen).Der kritischste Schritt besteht hier darin, über diesen Nginx-Pfad auf den hochgeladenen Bildpfad zu verweisen, autoIndex einzuschalten, das Durchsuchen einzuschalten und Alias direkt auf Starten Sie nginx und aktualisieren Sie die Konfiguration
9. Besuchen Sie die Bilder und Sie sind fertig.Der Blogger hat ein Bild erneut hochgeladen Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Das könnte Sie auch interessieren:
|
<<: Eine detaillierte Einführung in die Verwendung von Blockkommentaren in HTML
>>: border-radius-Methode zum Hinzufügen abgerundeter Ränder zu Elementen
Container sind ein weiteres Kernkonzept von Docke...
Wenn Benutzer MySQL-Datenbanken zum ersten Mal in...
In diesem Artikelbeispiel wird der spezifische JS...
Inhaltsverzeichnis Methode 1: Set: Es handelt sic...
Inhaltsverzeichnis 01-Ereignisse brodeln 1.1- Ein...
Bei Ubuntu 20.04 ist die Root-Anmeldung standardm...
Inhaltsverzeichnis Ein einfaches Komponentenbeisp...
Mysql Join-Abfrage 1. Grundlegende Konzepte Verbi...
Das Wechseln von Dateien ist eine gängige Operati...
Konfiguration der Linux-Umgebungsvariablen Beim A...
Standardmäßig generiert die MyISAM-Tabelle drei D...
Aus historischen Gründen basiert die MySQL-Replik...
Die Tabelle sieht wie folgt aus: Code, wenn Unity...
Inhaltsverzeichnis Hintergrund zum Schreiben Proj...
Basierend auf dem Vue-Bildvergrößerungskomponente...