ホームページ  >  記事  >  バックエンド開発  >  Go言語によるファイル操作機能を学び、ファイルの暗号化、圧縮、アップロード、ダウンロード機能を実装する

Go言語によるファイル操作機能を学び、ファイルの暗号化、圧縮、アップロード、ダウンロード機能を実装する

WBOY
WBOYオリジナル
2023-07-29 22:37:091667ブラウズ

Go 言語のファイル操作機能を学び、ファイルの暗号化、圧縮、アップロード、ダウンロード機能を実装する

Go 言語は、オープンソースの静的型付けプログラミング言語であり、開発現場で人気があります。効率的なパフォーマンスと簡潔な構文で非常に人気があります。 Go 言語の標準ライブラリには豊富なファイル操作関数が用意されており、ファイルの読み書き、暗号化や圧縮、アップロードやダウンロードなどが非常に簡単に行えます。この記事では、Go言語のファイル操作関数を使って、ファイルの暗号化、圧縮、アップロード、ダウンロードの機能を実装する方法を紹介します。

まず、関連するサードパーティ ライブラリをインポートする必要があります。 Go 言語では、

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

ファイルの暗号化と圧縮関数を実装するコードを作成しましょう:

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

Above Inコードでは、まず

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

上記のコードでは、最初にファイル アップロード関数を処理する

uploadFile 関数を実装しました。この関数では、r.FormFile メソッドを通じてアップロードされたファイルを取得し、サーバーのローカル ファイル システムに保存します。

次に、ファイルのダウンロード機能を処理する

downloadFile 関数を実装しました。この関数では、os.Open メソッドを通じて指定されたファイルを開き、io.Copy メソッドを通じてそれを ResponseWriter に書き込み、クライアントがダウンロードできるようにします。

最後に、

http.HandleFunc メソッドを呼び出してアップロードとダウンロードを処理するルートを指定し、http.ListenAndServe を使用してローカル サーバーを起動してリッスンします。ポート 8080 に接続します。

上記のコードにより、ファイルの暗号化、圧縮、アップロード、ダウンロード機能を実現します。テストのためにファイル名とキーを自分で置き換えることができます。この記事がGo言語のファイル操作関数の学習に役立つことを願っています。

以上がGo言語によるファイル操作機能を学び、ファイルの暗号化、圧縮、アップロード、ダウンロード機能を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。