以下是一个使用 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
}功能说明
文件上传:通过
file.Save将压缩包保存到临时目录。解压缩:使用
archive/zip解压文件到指定目录。校验文件:
校验文件格式(仅支持
.jpg和.png)。校验文件大小(不超过 5MB)。
保存文件:将校验成功的文件移动到指定目录。
记录数据:假设插入数据库操作可以在
InsertToDB方法中完成。返回结果:成功和失败的数量及失败原因。
测试建议
使用各种合法与非法的压缩包测试。
检查日志或接口返回的数据,确保符合预期。
如果需要更详细的优化或扩展,可以继续完善!
最后
以上就是名字长了才好记最近收集整理的关于使用 goframe 框架开发一个压缩包文件上传解压导入数据库的接口的全部内容,更多相关使用内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复