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

WBOY
Lepaskan: 2023-06-23 11:04:43
asal
1474 orang telah melayarinya

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>
Salin selepas log masuk

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"
Salin selepas log masuk

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"]`)
Salin selepas log masuk

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()
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!