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 的设计理念注重简洁、易用和高效,同时提供灵活的定制化选项,以满足开发…...

Pytorch入门实例的分解写法
数据集是受教育年限和收入,如下图 代码如下 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pddata pd.read_csv(./Income.csv)X torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) Y torch.from_numpy(data…...

Google单元测试sample分析(一)
本文开始从googletest提供的sample案例分析如何使用单元测试, 代码路径在googletest/googletest/samples/sample1.unittest.cc 本文件主要介绍EXPECT*相关宏使用 EXPECT_EQ 判断是否相等 EXPECT_TRUE 是否为True EXPECT_FALSE 是否为False TEST(FactorialTest, N…...

requests 实践
Requests 常用参数 method: 请求方式 get,或者 post,put,delete 等 url : 请求的 url 地址 接口文档标注的接口请求地址 params:请求数据中的链接,常见的一个 get 请求,请求参数都是在 url 地址…...

UI设计公司成长日记2:修身及持之以恒不断学习是要务
作者:蓝蓝设计 要做一个好的UI设计公司,不仅要在能力上设计能力一直(十几年几十年)保持优秀稳定的保持输出,以及心态的平和宽广。创始人对做公司要有信心,合伙人之间要同甘共苦,遵守规则,做好表…...

辅助驾驶功能开发-功能规范篇(23)-2-Mobileye NOP功能规范
5.2 状态机要求 5.2.1 NOP/HWP 状态机 NOP/HWP状态机如下所示: 下表总结了这些状态: 状态描述Passive不满足功能条件,功能无法控制车辆执行器。Standby满足功能条件。该功能不是由驾驶员激活的。功能不控制车辆执行器。Active - Main功能由驾驶员激活。功能是控制…...

React中如何提高组件的渲染效率
一、是什么 react 基于虚拟 DOM 和高效 Diff算法的完美配合,实现了对 DOM最小粒度的更新,大多数情况下,React对 DOM的渲染效率足以我们的业务日常 复杂业务场景下,性能问题依然会困扰我们。此时需要采取一些措施来提升运行性能&…...

springboot+mybatis3.5.2动态查询某一字段在某一段时间内的统计信息(折线图)
需求: 动态查询某一统计字段在一段时间内的统计折线图信息 controller层 ApiOperation(value "getStatisticDetail", notes "统计折线图")GetMapping("/detail")ResponseStatus(HttpStatus.OK)AccessLogAnnotation(ignoreRequestA…...

关于本地项目上传到gitee的详细流程
如何上传本地项目到Gitee的流程: 1.Gitee创建项目 2. 进入所在文件夹,右键点击Git Bash Here 3.配置用户名和邮箱 在gitee的官网找到命令,注意这里的用户名和邮箱一定要和你本地的Git相匹配,否则会出现问题。 解决方法如下&…...

MarkDown详细入门笔记
本帖整理了MarkDown的入门学习笔记~ 一.介绍 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。 诸如微信公众平台、CSDN博客、还有Typora中写文档的部分,均涉及到MD的功能~ 它…...

算法——贪心算法
贪心算法(Greedy Algorithm)是一种算法设计策略,通常用于解决组合优化问题,其核心思想是在每一步都选择当前状态下最优的解,而不考虑之后的步骤。贪心算法在每一步都做出局部最优选择,期望通过一系列局部最…...