go-zero框架上传图片至七牛云


前言

在使用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,希望上面的代码可以帮助到大家

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在uni-app中上传本地图片到七牛云,可以按照以下步骤进行: 1. 在七牛云上创建一个存储空间,并获取该空间的Access Key和Secret Key。 2. 安装uni-app的官方插件uni-upload,并在项目根目录下的vue.config.js中进行配置,添加以下代码: ``` const qiniuUploader = require('uniapp-qiniu-sdk'); const qiniuOptions = { region: 'your region', // 七牛云存储区域 uptokenURL: 'your uptokenURL', // 服务端提供获取上传凭证的接口 domain: 'your domain', // 七牛云存储空间绑定的域名 }; module.exports = { configureWebpack: { plugins: [ { apply: (compiler) => { compiler.hooks.afterEmit.tapPromise('afterEmit', (compilation) => { return new Promise((resolve, reject) => { qiniuUploader.upload(compilation.assets['your upload file name'].existsAt, 'your key', qiniuOptions, (res) => { console.log(res); resolve(); }, (error) => { console.log(error); reject(); }); }); }); }, }, ], }, }; ``` 3. 在需要上传图片的页面中,添加以下代码: ``` <template> <view> <input type="file" @change="upload"> </view> </template> <script> export default { methods: { upload(event) { const file = event.target.files[0]; const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { const base64Img = reader.result; qiniuUploader.upload(base64Img, (res) => { console.log(res); }, (error) => { console.log(error); }); }; }, }, }; </script> ``` 其中,首先使用FileReader将本地图片转换为base64格式,然后调用qiniuUploader.upload函数上传图片。 以上就是在uni-app中上传本地图片到七牛云的基本步骤,具体使用细节可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值