我是靠谱客的博主 名字长了才好记,最近开发中收集的这篇文章主要介绍使用 goframe 框架开发一个压缩包文件上传解压导入数据库的接口,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

以下是一个使用 GoFrame 框架实现的文件上传接口示例,功能包括上传压缩包、解压、校验图片信息、保存图片和记录数据,同时返回导入成功与失败的图片数量及原因。

项目结构

project/
├── main.go
├── router/
│   └── router.go
├── service/
│   └── upload.go
└── static/
    └── uploads/

main.go

package main

import (
	_ "project/router"
	"github.com/gogf/gf/v2/frame/g"
)

func main() {
	s := g.Server()
	s.Run()
}

router/router.go

package router

import (
	"github.com/gogf/gf/v2/net/ghttp"
	"project/service"
)

func init() {
	s := g.Server()
	s.Group("/api", func(group *ghttp.RouterGroup) {
		group.POST("/upload", service.UploadHandler)
	})
}

service/upload.go

package service

import (
	"archive/zip"
	"fmt"
	"io"
	"mime/multipart"
	"os"
	"path/filepath"
	"strings"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

const (
	MaxFileSize = 5 * 1024 * 1024 // 单个文件最大为 5MB
	UploadDir   = "./static/uploads/"
)

type UploadResponse struct {
	SuccessCount int               `json:"success_count"`
	FailCount    int               `json:"fail_count"`
	FailReasons  map[string]string `json:"fail_reasons"`
}

func UploadHandler(r *ghttp.Request) {
	// 获取上传的文件
	file := r.GetUploadFile("file")
	if file == nil {
		r.Response.WriteJson(g.Map{
			"code": 400,
			"msg":  "请上传文件",
		})
		return
	}

	// 保存上传文件到临时目录
	tempFile := fmt.Sprintf("%s%s", UploadDir, file.Filename)
	if err := file.Save(tempFile); err != nil {
		r.Response.WriteJson(g.Map{
			"code": 500,
			"msg":  "文件保存失败: " + err.Error(),
		})
		return
	}
	defer os.Remove(tempFile)

	// 解压文件
	files, err := unzipFile(tempFile)
	if err != nil {
		r.Response.WriteJson(g.Map{
			"code": 500,
			"msg":  "解压失败: " + err.Error(),
		})
		return
	}

	// 校验与处理图片
	response := validateAndSaveImages(files)

	r.Response.WriteJson(g.Map{
		"code": 200,
		"msg":  "处理完成",
		"data": response,
	})
}

func unzipFile(zipPath string) ([]string, error) {
	var files []string
	reader, err := zip.OpenReader(zipPath)
	if err != nil {
		return nil, err
	}
	defer reader.Close()

	for _, file := range reader.File {
		if file.FileInfo().IsDir() {
			continue
		}

		outputPath := filepath.Join(UploadDir, file.Name)
		if err := os.MkdirAll(filepath.Dir(outputPath), os.ModePerm); err != nil {
			return nil, err
		}

		outFile, err := os.Create(outputPath)
		if err != nil {
			return nil, err
		}
		defer outFile.Close()

		rc, err := file.Open()
		if err != nil {
			return nil, err
		}
		defer rc.Close()

		_, err = io.Copy(outFile, rc)
		if err != nil {
			return nil, err
		}
		files = append(files, outputPath)
	}
	return files, nil
}

func validateAndSaveImages(files []string) UploadResponse {
	response := UploadResponse{
		FailReasons: make(map[string]string),
	}
	for _, file := range files {
		ext := strings.ToLower(filepath.Ext(file))
		if ext != ".jpg" && ext != ".png" {
			response.FailCount++
			response.FailReasons[file] = "不支持的文件格式"
			continue
		}

		info, err := os.Stat(file)
		if err != nil {
			response.FailCount++
			response.FailReasons[file] = "无法读取文件信息: " + err.Error()
			continue
		}
		if info.Size() > MaxFileSize {
			response.FailCount++
			response.FailReasons[file] = "文件大小超过限制"
			continue
		}

		// 假设这里插入数据库成功
		// InsertToDB(file)

		// 移动文件到正式目录
		newPath := filepath.Join(UploadDir, "images", filepath.Base(file))
		if err := os.Rename(file, newPath); err != nil {
			response.FailCount++
			response.FailReasons[file] = "文件保存失败: " + err.Error()
			continue
		}
		response.SuccessCount++
	}
	return response
}

功能说明

  1. 文件上传:通过 file.Save 将压缩包保存到临时目录。

  2. 解压缩:使用 archive/zip 解压文件到指定目录。

  3. 校验文件

    • 校验文件格式(仅支持 .jpg.png)。

    • 校验文件大小(不超过 5MB)。

  4. 保存文件:将校验成功的文件移动到指定目录。

  5. 记录数据:假设插入数据库操作可以在 InsertToDB 方法中完成。

  6. 返回结果:成功和失败的数量及失败原因。

测试建议

  • 使用各种合法与非法的压缩包测试。

  • 检查日志或接口返回的数据,确保符合预期。

如果需要更详细的优化或扩展,可以继续完善!


最后

以上就是名字长了才好记为你收集整理的使用 goframe 框架开发一个压缩包文件上传解压导入数据库的接口的全部内容,希望文章能够帮你解决使用 goframe 框架开发一个压缩包文件上传解压导入数据库的接口所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(100)

评论列表共有 0 条评论

立即
投稿
返回
顶部