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

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

Jul 29, 2023 pm 10:37 PM
言語を移動 ファイル操作 暗号化圧縮

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? GO言語の範囲を使用してマップを通過してマップを保存するのに、なぜすべての値が最後の要素になるのですか? Apr 02, 2025 pm 04:09 PM

GOのマップイテレーションにより、すべての値が最後の要素になるのはなぜですか? Go言語では、いくつかのインタビューの質問に直面したとき、あなたはしばしば地図に遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

言語スライスに行く:シングルエレメントスライスインデックス1インターセプトの場合、なぜエラーを報告しないのですか? 言語スライスに行く:シングルエレメントスライスインデックス1インターセプトの場合、なぜエラーを報告しないのですか? Apr 02, 2025 pm 02:24 PM

Go Language Slice Index:エラーなしでインデックス1からシングルエレメントスライスインターセプトがインターセプトされるのはなぜですか? GO言語では、スライスは底部を参照できる柔軟なデータ構造です...

See all articles