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,// 上传图片 urlname:'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 mainimport ("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 = fileurla.Resp.Msg = "上传图片成功"return true
}
上传文件接口
package mainimport ("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 errorfileName := a.WordData["fileName"]uploadType := a.WordData["uploadType"] // 上传方式 10=覆盖上传 | 为空代表非覆盖,生成随机文件名Tp := a.WordData["Tp"]CheckKey := a.WordData["CheckKey"]//检验CheckKeysCheckKey := 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.SystemFileLogsystemFileLog.Status = 10 // 状态 = 正常systemFileLog.EnvironmentType = runEnvironment // 环境变量systemFileLog.Pid = a.ProgramID // 上传程序IDsystemFileLog.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}// 读取数据保存到指定路径 | 并计算文件md5var tfMd5 stringsystemFileLog.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.Filef, 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.FileInfofile, err = f.Stat()if err != nil {return}filesize = int(file.Size())if filesize <= 0 {err = errors.New("文件内容为空")return}// 把文件重新读出来 分块进行 MD5md5Str, err = xalgorithm.MD5BlocksToUpper32(f, 32*1024, xalgorithm.EncodeHexLower)return
}
相关文章:
vue+golang上传微信头像
<button class"avatar" open-type"chooseAvatar" chooseavatar"onChooseAvatar"><image :src"avatarUrl" class"avatar-img"></image></button> // 微信头像修改onChooseAvatar(e) {this.uploadFil…...
JavaScript charCodeAt() 方法
charCodeAt() 方法是 JavaScript 字符串对象的一个方法,它用于返回给定位置的字符的 Unicode 编码值(整数)。Unicode 编码是一个标识字符的数字,它包含了世界上几乎所有字符的映射,包括常见字符、特殊字符和表情符号。…...
Talk | 纽约州立宾汉姆顿大学博士生丁琰:开放环境中机器人的任务与动作规划
本期为TechBeat人工智能社区第541期线上Talk。 北京时间10月26日(周四)20:00,纽约州立宾汉姆顿大学博士生—丁琰的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “开放环境中机器人的任务与动作规划”࿰…...
2023年Q3企业邮箱安全性报告:境内钓鱼邮件超过境外攻击
10月25日,Coremail邮件安全联合北京中睿天下信息技术有限公司发布《2023年第三季度企业邮箱安全性研究报告》。2023年第三季度企业邮箱安全呈现出何种态势?作为邮箱管理员,我们又该如何做好防护? 以下为精华版阅读,如需…...
WebSocket 原理揭秘:让你彻底搞懂 Websocket 原理
WebSocket 的原理 WebSocket 是什么? WebSocket 是一种新型的协议,它可以在客户端和服务器之间建立长连接,实现双向通信。在传统的 HTTP 协议中,当客户端向服务器发送请求后,服务器会返回响应,然后连接就…...
react中的函数式组件和类式组件
一、函数组件 1. 定义函数组件 在React中,函数组件(Functional Component)是一种通过纯粹的JavaScript函数定义的UI组件。函数组件采用函数的方式接收一个输入参数 props,并返回一个React元素或者一组React元素作为输出。定义函…...
Visual Studio 2022 设置 PySide6 扩展工具
前言 本人不想电脑上装一堆的IDE,所以把 Python 开发也交给了 Visual Studio,如果你不是用 Visual Studio 做 Python 开发,下文就不用看了。 PySide简介 PySide跟PyQt类似,都是支持Python的Qt包,不同的是,PyQt是第三方的,PySide是Qt官方的。 PySide的推出比PyQt晚很…...
【高效开发工具系列】Postman
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...
汇编语言王爽第四版17.3完程可运行可调试
汇编语言王爽第四版17.3节完整程序,可调试,可运行。 最基本的字符串输入程序,具备以下功能: 1、在输入的同时需要显示这个字符串; 2、输入回车符后,一个字符串的输入结束; 3、能够删除已经输入…...
CH9329芯片应用—简介
概述 CH9329是一款串口转USB HID设备功能芯片,根据不同的工作模式,HID设备可以识别为:USB键盘设备、USB鼠标设备或者自定义HID类设备。接收串口数据,并自动根据串口工作模式进行数据解析,解析完成后按照HID类设备规范…...
mysql查看插入记录与查看mysql实时查询和插入速度
我真正关心的数据 比如一秒钟到底能插入多少行数据?慢查询有多少? 慢是一个相对概念,慢的绝对值时间是可以设置的,例如我设置long_query_time为10秒,那么但凡超过10秒的查询都可以认为是慢查询查询操作的超时时间mysql中系统变量什么意思?怎么查看系统变量? show varia…...
如何在VScode中让printf输出中文
如何在VScode中让printf输出中文? 1、在“Visual Studio Code”图标上右击,弹出对话框。见下图: 2、点击“以管理员身份运行”,得到下图: 3、点击“UTF-8”按钮,得到下图: 4、点击“通过编码重…...
qt hiRedis封装使用
qt Redis使用...
整理指定文件夹下的所有文件,以类树状图显示并生成对应超链接
最近在整理家里学习资料的时候,由于年代久远,找不到我想要找的文件,windows文件搜索速度感觉太慢。于是想要生成一份类似文件索引的东西来显示所有资料,让我可以快速的找到需要的资料路径 直接上代码 import os import datetim…...
解密代理技术:保障隐私与网络安全
在当今信息时代,网络代理技术是维护隐私和增强网络安全的关键工具。本文将深入研究Socks5代理、IP代理的应用,以及它们在网络安全、爬虫开发和HTTP协议中的关键作用。 引言 随着互联网的不断扩张,我们的在线活动变得日益复杂,也…...
k8s中,“deployment”充当什么角色?有什么功能?
在Kubernetes中,"Deployment"是一种控制器(Controller),它充当了以下主要角色和功能: 应用程序部署和管理: Deployment用于定义和管理应用程序的部署。它允许您指定应用程序的副本数(…...
深度学习:激活函数曲线总结
深度学习:激活函数曲线总结 在深度学习中有很多时候需要利用激活函数进行非线性处理,在搭建网路的时候也是非常重要的,为了更好的理解不同的激活函数的区别和差异,在这里做一个简单的总结,在pytorch中常用的激活函数的…...
Elasticsearch-06-Elasticsearch Java API Client
前言 简介 在 Elasticsearch7.15版本之后,Elasticsearch官方将它的高级客户端 RestHighLevelClient标记为弃用状态。同时推出了全新的 Java API客户端 Elasticsearch Java API Client,该客户端也将在 Elasticsearch8.0及以后版本中成为官方推荐使用的客…...
计算机网络第3章-运输层(2)
可靠数据传输原理 可靠数据传输依靠数据在一条可靠信道上进行传输。 TCP也正是依靠可靠信道进行传数据,从而数据不会被丢失。 而实现这种可靠数据传输服务是可靠数据传输协议的责任 构造可靠数据传输协议 1.经完全可靠信道的可靠数据传输:rdt1.0 在…...
【微信小程序】实现投票功能(附源码)
一、Vant Weapp介绍 Vant Weapp 是一个基于微信小程序的组件库,它提供了丰富的 UI 组件和交互功能,能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发…...
Umi-OCR:完全免费开源的离线OCR神器,3分钟快速上手文字识别
Umi-OCR:完全免费开源的离线OCR神器,3分钟快速上手文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维…...
STM32F407移植QP状态机踩坑实录:从编译报错到成功运行,我解决了这三个关键问题
STM32F407移植QP状态机踩坑实录:从编译报错到成功运行,我解决了这三个关键问题 在嵌入式开发中,状态机是一种极其重要的编程范式,它能有效管理复杂系统的行为逻辑。QP(Quantum Platform)作为一款轻量级的状…...
如何用applera1n免费绕过iOS激活锁:完整指南与操作教程
如何用applera1n免费绕过iOS激活锁:完整指南与操作教程 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否购买了一部二手iPhone或iPad,却发现设备被原主人的Apple ID锁定&a…...
我的Claude Code不再被封号,Taotoken提供了稳定可靠的替代方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 我的Claude Code不再被封号,Taotoken提供了稳定可靠的替代方案 作为一名频繁使用Claude Code进行代码生成和审查的个人…...
从内存视角拆解float和double:用C语言和调试器带你‘看见’IEEE754的二进制世界
从内存视角拆解float和double:用C语言和调试器带你‘看见’IEEE754的二进制世界 在计算机科学中,浮点数的表示和处理是一个既基础又关键的话题。对于从事系统编程、性能优化或逆向工程的开发者来说,理解浮点数在内存中的实际存储形式不仅能帮…...
暗黑3鼠标宏终极指南:D3KeyHelper 5步配置法快速上手
暗黑3鼠标宏终极指南:D3KeyHelper 5步配置法快速上手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为暗黑破坏神3玩…...
【低功耗蓝牙】④ 蓝牙MIDI协议:从ESP32 MicroPython代码到智能乐器DIY
1. 蓝牙MIDI协议入门:从音乐小白到智能乐器开发者 第一次听说蓝牙MIDI协议时,我正盯着桌上的ESP32开发板发呆。作为一个只会弹几个和弦的编程爱好者,完全没想到自己能用代码"演奏"音乐。蓝牙MIDI就像音乐世界的通用语言,…...
FPGA高速ADC数据采集实战——基于AD9253 LVDS接口与ISERDESE2设计
1. AD9253高速ADC核心特性解析 AD9253这颗14位125MSPS四通道ADC芯片,在通信和医疗成像领域堪称经典。我经手过的多个雷达项目中,它的信噪比表现总能带来惊喜——75.3dBFS的实测数据比手册标称值还要稳定。但真正让工程师们又爱又恨的,是它那个…...
安全聚合技术:原理、实现与多场景应用
1. 安全聚合技术概述安全聚合(Secure Aggregation)是一种多方安全计算技术,它允许多个互不信任的参与方在不泄露各自私有数据的前提下,共同计算出一个聚合结果。这项技术的核心价值在于解决了数据隐私与数据共享之间的矛盾&#x…...
Windows Android子系统深度优化:WSABuilds项目架构解析与实战部署指南
Windows Android子系统深度优化:WSABuilds项目架构解析与实战部署指南 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or Ker…...
