前言
在使用go-zero框架的时候,因为goctl命令行工具的出现,使得我们在开发的时候减少大量的代码,但是随之而来的又有很多的问题,在api文件中,我们无法定义一个文件类型的数据,但是在使用的时候,免不了需要传视频照片等文件类型,所以这个时候,我们需要有一些方法,来解决这些问题,下面就分享一种方法。
1.接收文件
1.api文件
首先看看api文件中需要进行怎样的修改,比如这个时候我们定义一个图片的服务,然后里面包含一个post上传图片的接口,我们需要将他的接受值变为空,然后在后面接上返回值。后面利用goctl工具进行生成代码,然后就要在/internal/handler的文件下进行修改。
service Image{
@handler ImageUpdata
post /api/image/updata() returns (ImageUpdataResponse)
}
2.handler文件
在这个文件里面我们需要修改上传照片的代码,
func ImageUpdataHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
l := logic.NewImageUpdataLogic(r.Context(), svcCtx)
resp, err := l.ImageUpdata(r)
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
//response.Response(r, w, resp, err)
}
}
可能看不到哪里出现了变化,可以再看看刚生成的代码
func MedicineFind1Handler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
l := logic.NewMedicineFind1Logic(r.Context(), svcCtx)
resp, err := l.MedicineFind1()
if err != nil {
httpx.ErrorCtx(r.Context(), w, err)
} else {
httpx.OkJsonCtx(r.Context(), w, resp)
}
//response.Response(r, w, resp, err)
}
}
在下就很清楚了,我们将http的请求r直接放到了请求的函数里面,这样在调用的时候,就可以对其里面的参数进行操作了,
3.logic文件
接下来就在具体的注册逻辑函数里面了,我们使用了http.Request中的方法对于对里面的数据进行转换
func (l *ImageUpdataLogic) ImageUpdata(r *http.Request) (resp *types.ImageUpdataResponse, err error) {
// todo: add your logic here and delete this line
file, handler, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
return nil, err
}
defer file.Close()
url, err := pkg.UploadToQiNiu(file, handler.Size)
if err != nil {
return nil, err
}
return &types.ImageUpdataResponse{
Code: 200,
Message: "上传成功",
Data: url,
}, nil
}
ok,大概前面的处理过程就是这样的。
2.七牛云
七牛云的配置,有很多的文章讲,我这里主要写一个与之相关可以返回url的代码。
const (
AccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
SerectKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Bucket = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ImgUrl = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)
// 封装上传图片到七牛云然后返回状态和图片的url
func UploadToQiNiu(file multipart.File, fileSize int64) (string, error) {
putPlicy := storage.PutPolicy{
Scope: Bucket,
}
mac := qbox.NewMac(AccessKey, SerectKey)
upToken := putPlicy.UploadToken(mac)
cfg := storage.Config{
Zone: &storage.ZoneHuanan,
UseCdnDomains: false,
UseHTTPS: false,
}
putExtra := storage.PutExtra{}
formUploader := storage.NewFormUploader(&cfg)
ret := storage.PutRet{}
err := formUploader.PutWithoutKey(context.Background(), &ret, upToken, file, fileSize, &putExtra)
if err != nil {
return "", err
}
url := ImgUrl + ret.Key
return url, nil
}
ok,希望上面的代码可以帮助到大家