Heim Backend-Entwicklung Golang Lernen Sie die Dateioperationsfunktionen in der Go-Sprache und implementieren Sie die Verschlüsselungs-, Komprimierungs-, Upload- und Download-Funktionen von Dateien

Lernen Sie die Dateioperationsfunktionen in der Go-Sprache und implementieren Sie die Verschlüsselungs-, Komprimierungs-, Upload- und Download-Funktionen von Dateien

Jul 29, 2023 pm 10:37 PM
go语言 文件操作 加密压缩

Lernen Sie die Dateioperationsfunktionen in der Go-Sprache und implementieren Sie die Verschlüsselungs-, Komprimierungs-, Upload- und Download-Funktionen von Dateien.

Die Go-Sprache ist eine statisch typisierte Open-Source-Programmiersprache. Sie erfreut sich im Entwicklungsbereich aufgrund ihrer effizienten Leistung und prägnanten Syntax großer Beliebtheit . Die Standardbibliothek der Go-Sprache bietet eine Fülle von Dateioperationsfunktionen, die das Lesen und Schreiben von Dateien, das Verschlüsseln und Komprimieren sowie das Hoch- und Herunterladen von Dateien sehr einfach machen. In diesem Artikel wird erläutert, wie Sie mithilfe der Dateioperationsfunktionen in der Go-Sprache die Funktionen zum Verschlüsseln, Komprimieren, Hochladen und Herunterladen von Dateien implementieren.

Zuerst müssen wir die relevanten Bibliotheken von Drittanbietern importieren. In der Go-Sprache können Sie die Bibliothek archive/zip verwenden, um die Dateikomprimierung zu realisieren, die Bibliothek crypto/aes, um die Dateiverschlüsselung und -entschlüsselung zu realisieren, und die Bibliothek io/ ioutil Bibliothek zum Implementieren von Lese- und Schreibvorgängen für Dateien. Wir können das Go-Sprachpaketverwaltungstool go get verwenden, um diese Bibliotheken abzurufen: archive/zip库来实现文件的压缩,使用crypto/aes库来实现文件的加密解密,使用io/ioutil库来实现文件的读写操作。我们可以使用Go语言的包管理工具go get来获取这些库:

go get -u github.com/golang/example/hello/archive/zip
go get -u github.com/golang/example/hello/crypto/aes
go get -u github.com/golang/example/hello/io/ioutil
Nach dem Login kopieren

下面我们来编写代码,实现文件的加密压缩功能:

package main

import (
    "archive/zip"
    "crypto/aes"
    "crypto/cipher"
    "io/ioutil"
    "os"
)

func main() {
    // 读取原始文件
    file, _ := os.Open("original.txt")
    defer file.Close()
    data, _ := ioutil.ReadAll(file)

    // 使用AES加密算法对文件进行加密
    key := []byte("thisisaeskey12345")
    block, _ := aes.NewCipher(key)
    ciphertext := make([]byte, len(data))
    block.Encrypt(ciphertext, data)

    // 创建压缩文件
    zipfile, _ := os.Create("encrypted.zip")
    defer zipfile.Close()
    zipWriter := zip.NewWriter(zipfile)

    // 将加密后的文件写入压缩文件
    zipfiledata, _ := zipWriter.Create("encrypted.txt")
    zipfiledata.Write(ciphertext)

    // 关闭压缩文件
    zipWriter.Close()

    // 读取压缩文件
    zipfile, _ = os.Open("encrypted.zip")
    defer zipfile.Close()
    zipReader, _ := zip.NewReader(zipfile, int64(len(ciphertext)))

    // 解压缩文件
    unzipdata, _ := zipReader.File[0].Open()
    defer unzipdata.Close()
    unzipdatacontent, _ := ioutil.ReadAll(unzipdata)

    // 使用AES解密算法对文件进行解密
    decrypter := cipher.NewCFBDecrypter(block, block.iv)
    plainText := make([]byte, len(unzipdatacontent))
    decrypter.XORKeyStream(plainText, unzipdatacontent)

    // 输出解密后的文件内容
    ioutil.WriteFile("decrypted.txt", plainText, 0644)
}
Nach dem Login kopieren

上述代码中,我们首先读取了一个名为original.txt的原始文件,并将其内容存储在data变量中。然后,我们使用AES加密算法对文件进行加密,并将加密后的数据存储在ciphertext中。

接下来,我们创建了一个名为encrypted.zip的压缩文件,并将加密后的文件内容写入其中。然后,我们使用archive/zip库读取了压缩文件中的内容,并解压缩至unzipdatacontent变量中。

最后,我们使用AES解密算法对解压缩后的数据进行解密,并将解密后的内容写入一个名为decrypted.txt的文件中。

通过上述步骤,我们实现了对文件进行加密压缩的功能。

接下来,我们将实现文件的上传和下载功能。为了实现这一功能,我们可以使用net/http库和os库。

package main

import (
    "io"
    "net/http"
    "os"
)

func uploadFile(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(32 << 20) // 设置最大上传文件大小为32MB

    file, handler, err := r.FormFile("file")
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        return
    }
    defer file.Close()

    f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        return
    }
    defer f.Close()
    io.Copy(f, file)

    w.WriteHeader(http.StatusOK)
}

func downloadFile(w http.ResponseWriter, r *http.Request) {
    fileName := r.URL.Query().Get("file")
    if fileName == "" {
        w.WriteHeader(http.StatusBadRequest)
        return
    }

    file, err := os.Open(fileName)
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        return
    }
    defer file.Close()

    fi, err := file.Stat()
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Disposition", "attachment; filename="+fileName)
    w.Header().Set("Content-Type", "application/octet-stream")
    w.Header().Set("Content-Length", strconv.FormatInt(fi.Size(), 10))

    io.Copy(w, file)
}

func main() {
    http.HandleFunc("/upload", uploadFile)
    http.HandleFunc("/download", downloadFile)
    http.ListenAndServe(":8080", nil)
}
Nach dem Login kopieren

上述代码中,我们首先实现了一个uploadFile函数,用于处理文件的上传功能。在该函数中,我们通过r.FormFile方法获取上传的文件,并将其保存至服务器本地文件系统中。

然后,我们实现了一个downloadFile函数,用于处理文件的下载功能。在该函数中,我们通过os.Open方法打开指定的文件,并将其通过io.Copy方法写入到ResponseWriter中,以便于客户端下载。

最后,我们通过调用http.HandleFunc方法来指定处理上传和下载的路由,然后使用http.ListenAndServerrreee

Schreiben wir Code zur Implementierung der Dateiverschlüsselungs- und Komprimierungsfunktion:

rrreee

Im obigen Code lesen wir zuerst Erstellen eine Originaldatei mit dem Namen original.txt und speichern Sie deren Inhalt in der Variablen data. Anschließend verschlüsseln wir die Datei mit dem AES-Verschlüsselungsalgorithmus und speichern die verschlüsselten Daten in ciphertext. 🎜🎜Als nächstes erstellen wir eine komprimierte Datei mit dem Namen encrypted.zip und schreiben den verschlüsselten Dateiinhalt hinein. Anschließend haben wir mit der Bibliothek archive/zip den Inhalt der komprimierten Datei gelesen und ihn in die Variable unzipdatacontent dekomprimiert. 🎜🎜Abschließend verwenden wir den AES-Entschlüsselungsalgorithmus, um die dekomprimierten Daten zu entschlüsseln und den entschlüsselten Inhalt in eine Datei mit dem Namen decrypted.txt zu schreiben. 🎜🎜Durch die oben genannten Schritte haben wir die Funktion zum Verschlüsseln und Komprimieren von Dateien implementiert. 🎜🎜Als nächstes implementieren wir die Funktionen zum Hochladen und Herunterladen von Dateien. Um diese Funktion zu erreichen, können wir die Bibliothek net/http und die Bibliothek os verwenden. 🎜rrreee🎜Im obigen Code haben wir zunächst eine uploadFile-Funktion implementiert, um die Funktion zum Hochladen von Dateien zu verwalten. In dieser Funktion erhalten wir die hochgeladene Datei über die Methode r.FormFile und speichern sie im lokalen Dateisystem des Servers. 🎜🎜Dann haben wir eine downloadFile-Funktion implementiert, um die Funktion zum Herunterladen von Dateien zu verwalten. In dieser Funktion öffnen wir die angegebene Datei über die Methode os.Open und schreiben sie zur Vereinfachung über die Methode io.Copy in ResponseWriter Client-Download. 🎜🎜Abschließend geben wir die Route für die Verarbeitung von Uploads und Downloads an, indem wir die Methode http.HandleFunc aufrufen und dann mit http.ListenAndServe einen lokalen Server starten und den Port überwachen 8080. 🎜🎜Durch den obigen Code realisieren wir die Verschlüsselungs-, Komprimierungs-, Upload- und Download-Funktionen von Dateien. Sie können den Dateinamen und den Schlüssel zu Testzwecken selbst ersetzen. Ich hoffe, dass dieser Artikel Ihnen beim Erlernen der Dateioperationsfunktionen in der Go-Sprache hilfreich sein wird. 🎜

Das obige ist der detaillierte Inhalt vonLernen Sie die Dateioperationsfunktionen in der Go-Sprache und implementieren Sie die Verschlüsselungs-, Komprimierungs-, Upload- und Download-Funktionen von Dateien. 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)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
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)

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Apr 02, 2025 pm 04:12 PM

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Warum ist es notwendig, Zeiger zu verabschieden, wenn sie GO- und Viper -Bibliotheken verwenden? Warum ist es notwendig, Zeiger zu verabschieden, wenn sie GO- und Viper -Bibliotheken verwenden? Apr 02, 2025 pm 04:00 PM

Go Zeigersyntax und Probleme bei der Verwendung der Viper -Bibliothek bei der Programmierung in Go -Sprache. Es ist entscheidend, die Syntax und Verwendung von Zeigern zu verstehen, insbesondere in ...

See all articles