Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Muat naik lampiran dalam Beego - Jadikan aplikasi web anda lebih kaya

Muat naik lampiran dalam Beego - Jadikan aplikasi web anda lebih kaya

WBOY
WBOYasal
2023-06-23 11:04:431498semak imbas

Dengan pembangunan aplikasi web yang berterusan, pengguna mempunyai permintaan yang lebih tinggi dan lebih tinggi untuk fungsi dan pengalaman yang lebih kaya. Antaranya, muat naik lampiran adalah fungsi asas dan penting Ia bukan sahaja membolehkan pengguna memuat naik dan berkongsi fail mereka sendiri, tetapi juga membolehkan pembangun melaksanakan pelbagai senario perniagaan dengan mudah, seperti muat naik avatar, paparan gambar, muat turun fail, dll. .

Beego ialah rangka kerja web berdasarkan bahasa Go. Ia menyediakan pelbagai fungsi dan alatan, membolehkan pembangun membina aplikasi web yang cekap, berskala dan selamat. Dalam Beego, anda boleh melaksanakan fungsi muat naik lampiran dengan mudah dalam aplikasi web dengan menggunakan alat muat naik lampiran terbina dalamnya.

Dalam artikel ini, kami akan memperkenalkan cara menggunakan fungsi muat naik lampiran dalam Beego, dan memberikan beberapa pertimbangan praktikal dan petua pengoptimuman.

1. Gunakan fungsi muat naik lampiran Beego

Dalam Beego, kunci untuk melaksanakan fungsi muat naik lampiran ialah menggunakan alat muat naik fail terbina dalam - beego.Context.Input. Alat ini menyediakan dua kaedah: RetrieveFile (dapatkan semula fail yang dimuat naik) dan SaveToFile (simpan fail yang dimuat naik ke cakera).

Berikut ialah kod contoh muat naik lampiran ringkas:

// 控制器代码
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>

Dalam kod di atas, kami memperoleh fail yang dimuat naik melalui kaedah c.GetFile("att_file") dalam pengawal Jika kaedah mengembalikan ralat, ini bermakna muat naik gagal Kami boleh mengembalikan maklumat ralat yang sepadan dalam antara muka. Jika muat naik berjaya, simpan fail ke cakera melalui kaedah c.SaveToFile("att_file", header.Filename) dan kembalikan maklumat kejayaan.

Perlu diambil perhatian bahawa kami menentukan atribut enctype borang sebagai jenis data borang berbilang bahagian melalui atribut enctype="multipart / form-data" dalam paparan Ini kerana muat naik lampiran perlu menyokong berbilang jenis fail, jadi atribut ini diperlukan.

2. Konfigurasi berkaitan

Dalam pembangunan sebenar, kami perlu membuat beberapa tetapan untuk muat naik lampiran, seperti had saiz fail, jenis fail yang dibenarkan untuk dimuat naik, direktori untuk fail yang dimuat naik, dsb.

Anda boleh membuat konfigurasi yang berkaitan dalam fail konfigurasi dalam beego.AppConfig, contohnya:

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

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

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

Dalam konfigurasi di atas, kami mengehadkan saiz fail yang dimuat naik pengguna kepada tidak lebih daripada 10M (10< ;< 20 bermaksud ditukar kepada bait), jenis fail yang dibenarkan oleh pengguna untuk memuat naik termasuk jpg, jpeg, png, gif, txt, doc, docx, pdf dan direktori storan untuk fail yang dimuat naik ditentukan sebagai statik/muat naik.

Perlu diambil perhatian bahawa bacaan fail konfigurasi dalam Beego adalah berdasarkan pembacaan pembolehubah persekitaran, yang boleh ditetapkan melalui kaedah os.Setenv ("nama pembolehubah persekitaran", "nilai pembolehubah"). Contohnya:

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

3. Pengoptimuman muat naik lampiran

Selain melaksanakan fungsi muat naik lampiran asas, kami juga perlu memberi perhatian kepada beberapa isu tambahan.

  1. Penskalaan Imej

Dalam aplikasi praktikal, kita biasanya perlu menskala dan menyesuaikan imej yang dimuat naik. Beego menyediakan dua kelas alat, ImageCropper dan ImageFilter, yang boleh memproses imej dengan mudah. Contohnya:

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

Dalam kod di atas, kami menggunakan kelas alat ImageCropper dan ImageFilter untuk masing-masing mencapai penskalaan dan pemprosesan warna yang sama.

  1. Muat naik disekat

Untuk sesetengah fail yang lebih besar, muat naik sekali sering menyebabkan masalah ketinggalan dan tamat masa Untuk meningkatkan pengalaman pengguna, kami boleh menggunakan muat naik Sekat pemisahan kaedah. Beego menyediakan kelas alat MultipartReader, yang boleh menghuraikan dan memproses data borang. Contohnya:

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

Dalam kod di atas, kami menggunakan kelas alat MultipartReader untuk membaca data borang dalam ketulan, membaca 1MB data setiap kali dan menulisnya ke fail sementara. Akhir sekali, kami mencantumkan semua fail chunked secara tak segerak ke dalam fail yang lengkap.

4. Ringkasan

Dalam artikel ini, kami memperkenalkan fungsi muat naik lampiran dalam Beego, dan menerangkan serta mengoptimumkan beberapa masalah praktikal. Dengan menggunakan alat muat naik lampiran Beego, kami boleh melaksanakan fungsi muat naik lampiran pelbagai aplikasi web dengan mudah, dengan itu meningkatkan pengalaman pengguna dan kecekapan pembangunan.

Atas ialah kandungan terperinci Muat naik lampiran dalam Beego - Jadikan aplikasi web anda lebih kaya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn