golang版微信小程序图片上传,服务器保存
golang版微信小程序图片上传,服务器保存
golang版微信小程序图片上传,服务器保存
-
其实很简单,小程序那边调
wx.uploadFile
其实就是客户端发起一个 HTTPS POST 请求,其中 content-type 为 multipart/form-data,只不过以前是自己写接口,现在是由微信的api来调用. -
怎么读取呢,你只需要读取FromFile表单中的内容就行了,go很简单不用框架,我为了方便开发用的
gin
file, header, err := c.Request.FormFile("file")
完整代码
func HandleUploadWxFile(c *gin.Context) { defer c.Request.Body.Close() file, header, err := c.Request.FormFile("file") if err != nil {tools.Mlog.Error(err.Error())c.JSON(http.StatusInternalServerError, err.Error())return } //文件流就在file里 defer file.Close() source := c.PostForm("source") contentType := header.Header.Get("Content-Type") name := fmt.Sprintf("%s.%s", source, strings.Split(contentType, "/")[1]) objKey, err := UploadFileWithReader(//阿里云上传部分reqUpdateWXFile{Name: name, File: file, FileCategory: contentType, Source: source}) if err != nil {if err == ErrSupportFileType {tools.Mlog.Error(err.Error())c.JSON(http.StatusOK, code.GeneralRetInvalidParams(err.Error()))} else {tools.Mlog.Error(err.Error())c.JSON(http.StatusInternalServerError, err.Error())}return } c.JSON(http.StatusOK, gin.H{"link": aliyun.GeneralObjectUrl(objKey), }) }
-
最后附上阿里云上传代码
初始化阿里云
func createOSS() (*oss.Client, error) { client, err := oss.New(endPoint, setting.AliyunCloudConf.AccessKeyID, setting.AliyunCloudConf.AccessKeySecret,func(c *oss.Client) {c.Config.IsDebug = setting.IsDebugc.Config.HTTPTimeout = oss.HTTPTimeout{IdleConnTimeout: 90 * time.Second,ConnectTimeout: 30 * time.Second,ReadWriteTimeout: 60 * time.Second,HeaderTimeout: 60 * time.Second,LongTimeout: 300 * time.Second,}}) if err != nil {err := fmt.Errorf("aliyun cloud start failed, err: %s", err.Error())//tools.Mlog.Error(err.Error())return nil, err } return client, nil }
func PutObject(objKey string, reader io.Reader, options ...oss.Option) error { client, err := createOSS() if err != nil {return err } bucket, err := client.Bucket(bucketName) if err != nil {return err } return bucket.PutObject(objKey, reader, options...) }
func UploadFileWithReader(info reqUpdateWXFile) (objKey string, err error) { intn := rand.Intn(10000) if info.Source == aliyun.Avatar {objKey = fmt.Sprintf("%s/%d_%d%s", aliyun.Avatar, time.Now().UTC().Unix(), intn, info.Name) } else if info.Source == aliyun.Photo {objKey = fmt.Sprintf("%s/%d_%d%s", aliyun.Photo, time.Now().UTC().Unix(), intn, info.Name) } else if info.Source == aliyun.Video {objKey = fmt.Sprintf("%s/%d_%d%s", aliyun.Video, time.Now().UTC().Unix(), intn, info.Name) } else if info.Source == aliyun.Other {objKey = fmt.Sprintf("%s/%d_%d%s", aliyun.Other, time.Now().UTC().Unix(), intn, info.Name) } else {return "", ErrSupportFileType }err = aliyun.PutObject(objKey, info.File, oss.ObjectACL(oss.ACLPublicRead), oss.ContentType(info.FileCategory)) if err != nil {return "", err } return }