vue+golang上传微信头像

<button class="avatar" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
							<image :src="avatarUrl" class="avatar-img"></image>
						</button>
// 微信头像修改
			onChooseAvatar(e) {
				this.uploadFile(e.detail.avatarUrl)
			},
/* 上传头像转化格式*/
			    uploadFile(avatarUrl){
			      uni.uploadFile({
			        url: this.fetch.fileUrl() + '/api/upload/uploadimages',//后台接口
			        filePath: avatarUrl,// 上传图片 url
			        name:'image',
			        header: {
			          'content-type': 'multipart/form-data',
			          'token': uni.getStorageSync('token')
			        }, // header 值
			        success: res => {
			          let obj = JSON.parse(res.data)
			          console.log('obj', obj)
			          if (obj. status == 'True') {
			           this.avatarUrl = obj.data
			          } else {
			            this.common.toast(obj.msg)
			          }
			        },
			        fail: e => {
						this.common.toast("上传失败")
			        }
			      });
			    },

api后台接收文件 

/*
 * @Author: lmy
 * @Date: 2023-10-26 15:12:13
 * @LastEditors: lmy
 * @LastEditTime: 2023-10-27 10:40:14
 * @FilePath: \Project_UNI-APP_API\Main_Upload_Images.go
 * @Description: 正式版
 */
package main

import (
	"bytes"
	"io"
	"net/http"
	"path"
	"strings"

	"cntotal.com/sbjapi/xfileserviceapi"
	"cntotal.com/sbjbase/xjson"
	"cntotal.com/sbjlog"
)

// uploadImages 上传图片
func uploadImages(w http.ResponseWriter, r *http.Request) {
	apiWriteHandler("", verifyUploadImages, &APIContext{Writer: w, Request: r, IsReadBody: true}, false)
}

// verifyUploadImages 上传图片
func verifyUploadImages(a *APIContext) bool {
	defer func() {
		if err := recover(); err != nil {
			sbjlog.ExcLog("100", "[%s]verifyUploadImages-小程序登录:%s", a.Flag.Code, err)
		}
	}()
	uploadFile, handle, err := a.Request.FormFile("image")
	ext := strings.ToLower(path.Ext(handle.Filename))
	if ext != ".jpg" && ext != ".png" && ext != ".jpeg" {
		a.Resp.Msg = "只支持jpg/jpeg/png图片上传"
		return false
	}
	var buff = new(bytes.Buffer)
	_, _ = io.Copy(buff, uploadFile)
	buffByte := buff.Bytes()
	dataStr, err := xfileserviceapi.UploadTempFile(handle.Filename, &buffByte)
	if err != nil {
		sbjlog.Debug("xfileserviceapi.UploadTempFile 上传图片失败,图片名称:%v,err:%v ", handle.Filename, err)
		a.Resp.Msg = "上传图片失败"
		return false
	}
	returnData := xjson.JSONToMapString(dataStr)
	fileurl := returnData["fileurl"]
	if fileurl == "" {
		a.Resp.Msg = "上传图片失败"
		return false
	}
	a.Resp.Data = fileurl
	a.Resp.Msg = "上传图片成功"
	return true
}

 上传文件接口

package main

import (
	"net/http"
	"strings"

	"cntotal.com/sbjbase"
	"cntotal.com/sbjlog"

	systemdb "cntotal.com/ProjectDBLibrary/system/DB"
	"cntotal.com/sbjbase/xalgorithm"
	"cntotal.com/sbjbase/xjson"
)

// 上传临时文件
func type23(w http.ResponseWriter, r *http.Request) {
	apiWriteHandler("23", verify23, &APIContext{Writer: w, Request: r})
}

// 上传临时文件
func verify23(a *APIContext) bool {
	var err error
	fileName := a.WordData["fileName"]
	uploadType := a.WordData["uploadType"] // 上传方式 10=覆盖上传 | 为空代表非覆盖,生成随机文件名
	Tp := a.WordData["Tp"]
	CheckKey := a.WordData["CheckKey"]
	//检验CheckKey
	sCheckKey := xalgorithm.MD5ToUpper32(xalgorithm.MD5ToUpper32(xalgorithm.MD5ToUpper32(fileName + Tp)[:15]))

	if CheckKey != sCheckKey {
		a.Resp.Msg = "CheckKey 验证不通过"
		return false
	}
	//验证参数值
	if fileName == "" {
		a.Resp.Msg = "fileName临时文件名不能为空"
		return false
	}
	//写入文件日志
	var systemFileLog systemdb.SystemFileLog
	systemFileLog.Status = 10                      // 状态 = 正常
	systemFileLog.EnvironmentType = runEnvironment // 环境变量
	systemFileLog.Pid = a.ProgramID                // 上传程序ID
	systemFileLog.Type = 10                        // 类型=上传
	systemFileLog.FileType = 40                    // 文件类型 40=临时文件
	systemFileLog.IP = a.RequestIP                 // 上传IP
	//处理保存 文件属性
	fileProgramID := a.ProgramID //文件归属程序 (关系到文件的路径写入)
	if a.WordData["isProjectFile"] == "1" {
		fileProgramID = a.ProgramID / 100 * 100 //取整数 710020 / 100 = 710000
	}
	// 定义是否随机文件名 | 如果不是覆盖上传,则填充随机文件名
	randomName := uploadType != "10"
	// 获取保存文件路径信息
	saveFilePath := getPathWithTempFile(fileProgramID, fileName, randomName)
	systemFileLog.FilePath = saveFilePath.FilePath
	// systemFileLog.FilePath, _, filename, fileext = GetPathWithTempFile(fileProgramID, tempPath)
	if strings.Index(saveFilePath.FileName, ".") == 0 {
		a.Resp.Msg = "文件名格式不正确"
		return false
	}
	if indexStringArray(tempFileExt, saveFilePath.FileExt) == -1 {
		a.Resp.Msg = "不满足临时文件文件格式"
		return false
	}
	// 因为数据已经转为了base64 ,源文件大小 * 133% = 现在大小 。 所以当前大小 / 133% = 原文件大小
	// 提前判断的原因:在前面提前读取判断防止无效读取文件,避免流量损失
	if a.Request.ContentLength*3/4 > int64(tempFileSize) {
		a.Resp.Msg = "临时文件文件超出大小" + getMegabytesString(fileSize) + "限制"
		return false
	}
	// 读取数据保存到指定路径 | 并计算文件md5
	var tfMd5 string
	systemFileLog.FileLength, tfMd5, err = readBodyFileToPath(a.Request, systemFileLog.FilePath)
	if err != nil {
		sbjlog.Debug("verify23-readBodyFileToCacheDir Error:%s", err.Error())
		a.Resp.Msg = "读取上传文件出现异常"
		return false
	}
	// 写入临时文件上传日志
	sflid := systemdb.InsertSystemFileLog(systemFileLog)
	if sflid < 1 {
		a.Resp.Msg = "新增文件日志失败"
		return false
	}
	a.Resp.Data, _ = sbjbase.AESEncrypt(
		xjson.MapToJSON(
			map[string]interface{}{
				"fileid":  sflid,
				"fileurl": fileHost + strings.TrimPrefix(systemFileLog.FilePath, "./"),
				"filemd5": tfMd5}),
		CheckKey[:16])
	return true
}

上传临时文件方法 

// readBodyFileToCacheDir 读取传输的文件保存到缓存文件夹
// 返回 临时存储地址,文件MD5,错误信息
func readBodyFileToCacheDir(r *http.Request) (filepath string, filesize int, md5Str string, err error) {
	filepath = cacheFileDir + fmt.Sprintf("%s_%s.temp", time.Now().Format("20060102150405"), xstring.RandomString(12, ""))
	filesize, md5Str, err = readBodyFileToPath(r, filepath)
	return
}

// readBodyFileToPath 从Body中读取文件保存到指定路径
func readBodyFileToPath(r *http.Request, filepath string) (filesize int, md5Str string, err error) {
	var f *os.File
	f, err = os.Create(filepath)
	if err != nil {
		return
	}
	defer f.Close()
	// 按照Base64 编码分块读取数据到文件 ? 问题:未到限定步长
	_, err = xbinary.Copy(f, r.Body, 32*1024, xbinary.EncodeBase64)
	if err != nil {
		return
	}
	// 重置一下位置
	f.Seek(0, 0)
	var file os.FileInfo
	file, err = f.Stat()
	if err != nil {
		return
	}
	filesize = int(file.Size())
	if filesize <= 0 {
		err = errors.New("文件内容为空")
		return
	}
	// 把文件重新读出来 分块进行 MD5
	md5Str, err = xalgorithm.MD5BlocksToUpper32(f, 32*1024, xalgorithm.EncodeHexLower)
	return
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue、Spring Boot、微信H5支付、电商、Git 是一些常见的技术和工具。下面我将依次对它们进行解释和描述: Vue 是一个现代化的前端框架,采用了一种响应式的编程方式,可以轻松构建交互丰富、高性能、可维护的web应用程序。Vue 提供了诸多的功能和特性,例如组件化开发、虚拟DOM、数据双向绑定等,极大地提高了前端开发的效率。 Spring Boot 是一个轻量级、快速开发的Java后端框架,它简化了Spring应用程序的配置和部署,提供了自动化配置和快速启动的特性。Spring Boot具有强大的生态系统和丰富的功能,可以方便地构建高效、安全且可扩展的后端应用程序。 微信H5支付是微信公众平台提供的一种在线支付方式,可以通过微信支付接口实现在手机浏览器中进行支付。它支持用户在H5页面中通过微信进行支付,适用于电商、在线购物等需要在线支付的场景。微信H5支付具有便捷、安全的特点,可以提供良好的用户支付体验。 电商是指以电子商务技术为支撑,通过互联网进行商品、服务的交易和商务活动的行业。电商平台的建设包括商品展示、购物车、订单管理、支付处理等模块,需求复杂多样。Vue和Spring Boot可以结合使用,前端通过Vue来实现电商平台的用户界面,后端采用Spring Boot来开发后台接口和处理业务逻辑。 Git 是一个分布式版本控制系统,用于保存和管理软件开发过程中的各个版本。团队可以通过Git来协同开发,追踪代码变更、回滚、合并等。在开发电商平台时,Git助力多人合作开发,有效地管理代码库,解决并发开发、版本控制的问题。团队成员可以通过Git来共享和提交自己的代码,并通过分支管理功能来进行并行开发和版本控制。 总结来说,Vue是一个前端框架,Spring Boot是一个后端框架,微信H5支付是一种在线支付方式,电商是基于电子商务技术的行业,Git是一个用于版本控制的工具。这些技术和工具可以相互结合,用于开发电商平台,并实现高效、可靠的软件开发和交付。 ### 回答2: Vue是一种流行的前端框架,它使用JavaScript和HTML来构建交互式的用户界面。它具有简单易学、灵活性强以及性能优化等优势,因此在前端开发中得到了广泛的应用。 Spring Boot是一个用于简化基于Java的应用程序开发的框架。它提供了开箱即用的功能,使开发人员能够快速构建高效、可扩展的应用程序。Spring Boot还具有自动化配置和简化部署等特性,使开发过程更加便捷。 微信H5支付是一种在线支付方式,允许用户在手机端使用微信进行购物支付。它具有支付安全、使用便捷以及适用范围广泛的特点,已经成为电商领域中非常常见的支付方式。 Git是一个分布式版本控制系统,它用于跟踪文件的修改和历史记录。在开发过程中,开发人员可以使用Git来管理代码版本,通过分支、合并等功能来协同开发和解决冲突。 综上所述,Vue和Spring Boot是用于构建应用程序的框架,微信H5支付是一种在线支付方式,而Git是用于版本控制的工具。它们在电商领域中都扮演着重要角色,能够使开发人员更加高效地开发、部署和维护应用程序。 ### 回答3: Vue是一个用于构建用户界面的开源JavaScript框架,它采用了MVVM的架构模式,能够使开发者更高效地构建Web应用程序。Vue具有简单易学、灵活可扩展以及高性能等特点,因此在前端开发中广受欢迎。 Spring Boot是一个基于Spring框架的快速开发框架,它通过内嵌的Web服务器、自动化配置和约定优于配置的原则,极大地简化了Java Web应用的开发工作。Spring Boot提供了丰富的开发工具和组件,使得开发人员可以更轻松地构建出高效、健壮的后端应用。 微信H5支付是指在移动端浏览器中使用微信支付功能的一种支付方式,用户可以通过浏览器直接打开商户的H5页面进行支付。微信H5支付不需要下载或安装微信客户端,能够为电商平台提供更便捷的支付方式,提升用户体验并增加交易转化率。 Git是一个分布式版本控制系统,它可以记录和管理代码的版本变更。在团队协作开发中,Git可以帮助开发人员更好地进行代码管理、合并和回滚等操作,确保团队开发的代码始终处于一个稳定的状态。Git也是目前最流行的版本控制工具之一,被广泛应用于软件开发行业。 综上所述,Vue、Spring Boot、微信H5支付和Git分别代表了前端开发、后端开发、支付方式和版本控制等不同方面的技术和工具。结合这些技术和工具,我们可以构建出一个使用Vue作为前端框架,Spring Boot作为后端框架,集成微信H5支付的电商平台,并且通过Git进行代码版本管理和团队协作开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值