ホームページ  >  記事  >  バックエンド開発  >  Beego での添付ファイルのアップロード - Web アプリケーションをよりリッチにします

Beego での添付ファイルのアップロード - Web アプリケーションをよりリッチにします

WBOY
WBOYオリジナル
2023-06-23 11:04:431458ブラウズ

Web アプリケーションの継続的な開発に伴い、ユーザーはより豊富な機能とエクスペリエンスを求める要求がますます高まっています。その中でも、添付ファイルのアップロードは基本的かつ重要な機能であり、ユーザーが自分のファイルをアップロードして共有できるだけでなく、開発者がアバターのアップロード、画像の表示、ファイルのダウンロードなどのさまざまなビジネスシナリオを簡単に実装できるようにします。 。

Beego は Go 言語に基づく Web フレームワークであり、開発者が効率的でスケーラブルで安全な Web アプリケーションを迅速に構築できるようにする豊富な機能とツールを提供します。 Beego では、組み込みの添付ファイルアップロードツールを使用して、Web アプリケーションに添付ファイルのアップロード機能を簡単に実装できます。

この記事では、Beego の添付ファイルのアップロード機能の使用方法を紹介し、実際的な考慮事項と最適化のヒントをいくつか示します。

1. Beego の添付ファイル アップロード機能を使用する

Beego で添付ファイル アップロード機能を実装するための鍵は、組み込みのファイル アップロード ツール - beego.Context.Input を使用することです。このツールには、RetrieveFile (アップロードされたファイルを取得する) と SaveToFile (アップロードされたファイルをディスクに保存する) という 2 つのメソッドが用意されています。

以下は、簡単な添付ファイルのアップロードのサンプル コードです:

// 控制器代码
func (c *AttachmentController) Post() {
    _, header, err := c.GetFile("att_file")
    if err != nil {
        // 处理上传失败的情况
        c.Data["json"] = map[string]interface{}{
            "code":    1,
            "message": "Upload failed",
        }
    } else {
        // 处理上传成功的情况
        err = c.SaveToFile("att_file", header.Filename)
        if err != nil {
            c.Data["json"] = map[string]interface{}{
                "code":    1,
                "message": "Save file failed",
            }
        } else {
            c.Data["json"] = map[string]interface{}{
                "code":    0,
                "message": "Upload success",
            }
        }
    }
    c.ServeJSON()
}

// 视图代码
<form method="post" enctype="multipart/form-data" action="/attachment/upload">
  <input type="file" name="att_file" required>
  <input type="submit" value="Upload">
</form>

上記のコードでは、コントローラーの c.GetFile("att_file") メソッドを通じてアップロードされたファイルを取得します。メソッドが err を返した場合、アップロードが失敗したことを意味するため、インターフェイスで対応するエラー情報を返すことができます。アップロードが成功した場合は、c.SaveToFile("att_file", header.Filename) メソッドを通じてファイルをディスクに保存し、成功情報を返します。

ビューの enctype="multipart / form-data" 属性を通じて、フォームの enctype 属性をマルチパート フォーム データ型として指定していることに注意してください。これは、添付ファイルのアップロードで複数のデータをサポートする必要があるためです。 types.ファイルなので、この属性は必須です。

2. 関連する設定

実際の開発では、ファイル サイズの制限、アップロードが許可されるファイルの種類、アップロードされるファイルのディレクトリなど、添付ファイルのアップロードに関するいくつかの設定を行う必要があります。

関連する設定は、beego.AppConfig の設定ファイルで行うことができます。例:

# 支持的文件类型
file_types = ["jpg", "jpeg", "png", "gif", "txt", "doc", "docx", "pdf"]

# 上传文件大小限制
file_size = 10 << 20

# 上传文件目录
attachment_dir = "static/upload"

上記の設定では、ユーザーがアップロードしたファイルのサイズを 10M (10<) 以下に制限しています。 ;

Beego での設定ファイルの読み取りは、os.Setenv (「環境変数名」、「変数値」) メソッドを通じて設定できる環境変数の読み取りに基づいていることに注意してください。例:

os.Setenv("file_types", `["jpg", "jpeg", "png", "gif", "txt", "doc", "docx", "pdf"]`)

3. 添付ファイルのアップロードの最適化

基本的な添付ファイルのアップロード機能を実現することに加えて、いくつかの追加の問題にも注意する必要があります。

  1. 画像のスケーリング

実際のアプリケーションでは、通常、アップロードされた画像を拡大縮小して調整する必要があります。 Beego は、画像を簡単に処理できる 2 つのツール クラス、ImageCropper と ImageFilter を提供します。例:

import (
    "github.com/astaxie/beego/utils/captcha"
    "github.com/astaxie/beego/utils/captcha/drivers"
)

func (c *AttachmentController) Post() {
    f, h, err := c.GetFile("att_file")
    if err != nil {
        // 处理上传失败的情况
        c.Data["json"] = map[string]interface{}{
            "code":    1,
            "message": "Upload failed",
        }
    } else {
        // 处理上传成功的情况
        fileDir := beego.AppConfig.String("attachment_dir")
        fileName := beego.Date(time.Now(), "20060102150405")+filepath.Ext(h.Filename)
        fPath := fileDir + "/" + fileName
        err = c.SaveToFile("att_file", fPath)
        if err != nil {
            c.Data["json"] = map[string]interface{}{
                "code":    1,
                "message": "Save file failed",
            }
        } else {
            c.Data["json"] = map[string]interface{}{
                "code":    0,
                "message": "Upload success",
                "url":     "/"+fPath,
            }
            fUrl := beego.URLFor("AttachmentController.ShowAttachment", ":filename", fileName)
            c.Data["json"].(map[string]interface{})["url"] = fUrl
        }

        // 图片缩放
        scaleWidth := 800 // 等比例缩放至800
        imageCropper := captcha.NewImageCrop(captcha.DriverImaging, fPath)
        err := imageCropper.Resize(scaleWidth)
        if err != nil {
            beego.Error(err)
        }

        // 图片滤镜
        imageFilter := captcha.NewImageFilter(captcha.DriverImaging, fPath)
        err = imageFilter.Hue(-25).Saturation(10).Brightness(-10).Contrast(-5)
        if err != nil {
            beego.Error(err)
        }
    }
    c.ServeJSON()
}

上記のコードでは、ImageCropper ツール クラスと ImageFilter ツール クラスを使用して、それぞれ画像の均等なスケーリングとカラー処理を実現します。

  1. ブロックされたアップロード

一部の大きなファイルの場合、1 回限りのアップロードでは遅延やタイムアウトの問題が発生することがよくあります。ユーザー エクスペリエンスを向上させるために、分割ブロック アップロードを使用できます。方法。 Beego は、フォーム データを解析して処理できる MultipartReader ツール クラスを提供します。例:

func (c *AttachmentController) ChunkUpload() {
    // 读取表单数据
    reader, _ := c.Ctx.Request.MultipartReader()
    var (
        bigFile *os.File
        noi     int
    )
    for {
        part, err := reader.NextPart()
        if err == io.EOF {
            // 读取完成
            break
        }
        if part.FileName() == "" {
            continue
        }
        fileName := part.FileName()
        bigFile, err = os.OpenFile("static/chunk/"+fileName, os.O_WRONLY|os.O_CREATE, 0666)
        defer bigFile.Close()
        if err != nil {
            c.Data["json"] = map[string]interface{}{
                "code":    1,
                "message": "Create file failed",
            }
            c.ServeJSON()
            return
        }
        buf := make([]byte, 1024*1024) // 1MB的缓存
        for {
            n := 0
            n, err = part.Read(buf)
            noi += n // 总共读取的字节数
            if err != nil {
                if err == io.EOF {
                    break
                } else {
                    c.Data["json"] = map[string]interface{}{
                        "code":    1,
                        "message": "Read file failed",
                    }
                    c.ServeJSON()
                    return
                }
            }
            if _, err = bigFile.Write(buf[:n]); err != nil {
                c.Data["json"] = map[string]interface{}{
                    "code":    1,
                    "message": "Write file failed",
                }
                c.ServeJSON()
                return
            }
        }
    }
    // 返回上传结果
    c.Data["json"] = map[string]interface{}{
        "code":     0,
        "message":  "Upload success",
        "fileSize": noi,
    }
    c.ServeJSON()
}

上記のコードでは、MultipartReader ツール クラスを使用してフォーム データをチャンクで読み取り、毎回 1 MB のデータを読み取り、一時ファイルに書き込みます。最後に、すべてのチャンク ファイルを完全なファイルに非同期的にマージします。

4. 概要

この記事では、Beego の添付ファイルのアップロード機能を紹介し、いくつかの実際的な問題について説明および最適化しました。 Beegoの添付ファイルアップロードツールを利用することで、さまざまなWebアプリケーションの添付ファイルアップロード機能を簡単に実装でき、ユーザーエクスペリエンスと開発効率が向上します。

以上がBeego での添付ファイルのアップロード - Web アプリケーションをよりリッチにしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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