当前位置: 首页 > news >正文

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 字符串对象的一个方法&#xff0c;它用于返回给定位置的字符的 Unicode 编码值&#xff08;整数&#xff09;。Unicode 编码是一个标识字符的数字&#xff0c;它包含了世界上几乎所有字符的映射&#xff0c;包括常见字符、特殊字符和表情符号。…...

Talk | 纽约州立宾汉姆顿大学博士生丁琰:开放环境中机器人的任务与动作规划

本期为TechBeat人工智能社区第541期线上Talk。 北京时间10月26日&#xff08;周四&#xff09;20:00&#xff0c;纽约州立宾汉姆顿大学博士生—丁琰的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “开放环境中机器人的任务与动作规划”&#xff0…...

2023年Q3企业邮箱安全性报告:境内钓鱼邮件超过境外攻击

10月25日&#xff0c;Coremail邮件安全联合北京中睿天下信息技术有限公司发布《2023年第三季度企业邮箱安全性研究报告》。2023年第三季度企业邮箱安全呈现出何种态势&#xff1f;作为邮箱管理员&#xff0c;我们又该如何做好防护&#xff1f; 以下为精华版阅读&#xff0c;如需…...

WebSocket 原理揭秘:让你彻底搞懂 Websocket 原理

WebSocket 的原理 WebSocket 是什么&#xff1f; WebSocket 是一种新型的协议&#xff0c;它可以在客户端和服务器之间建立长连接&#xff0c;实现双向通信。在传统的 HTTP 协议中&#xff0c;当客户端向服务器发送请求后&#xff0c;服务器会返回响应&#xff0c;然后连接就…...

react中的函数式组件和类式组件

一、函数组件 1. 定义函数组件 在React中&#xff0c;函数组件&#xff08;Functional Component&#xff09;是一种通过纯粹的JavaScript函数定义的UI组件。函数组件采用函数的方式接收一个输入参数 props&#xff0c;并返回一个React元素或者一组React元素作为输出。定义函…...

Visual Studio 2022 设置 PySide6 扩展工具

前言 本人不想电脑上装一堆的IDE,所以把 Python 开发也交给了 Visual Studio,如果你不是用 Visual Studio 做 Python 开发,下文就不用看了。 PySide简介 PySide跟PyQt类似,都是支持Python的Qt包,不同的是,PyQt是第三方的,PySide是Qt官方的。 PySide的推出比PyQt晚很…...

【高效开发工具系列】Postman

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

汇编语言王爽第四版17.3完程可运行可调试

汇编语言王爽第四版17.3节完整程序&#xff0c;可调试&#xff0c;可运行。 最基本的字符串输入程序&#xff0c;具备以下功能&#xff1a; 1、在输入的同时需要显示这个字符串&#xff1b; 2、输入回车符后&#xff0c;一个字符串的输入结束&#xff1b; 3、能够删除已经输入…...

CH9329芯片应用—简介

概述 CH9329是一款串口转USB HID设备功能芯片&#xff0c;根据不同的工作模式&#xff0c;HID设备可以识别为&#xff1a;USB键盘设备、USB鼠标设备或者自定义HID类设备。接收串口数据&#xff0c;并自动根据串口工作模式进行数据解析&#xff0c;解析完成后按照HID类设备规范…...

mysql查看插入记录与查看mysql实时查询和插入速度

我真正关心的数据 比如一秒钟到底能插入多少行数据?慢查询有多少? 慢是一个相对概念,慢的绝对值时间是可以设置的,例如我设置long_query_time为10秒,那么但凡超过10秒的查询都可以认为是慢查询查询操作的超时时间mysql中系统变量什么意思?怎么查看系统变量? show varia…...

如何在VScode中让printf输出中文

如何在VScode中让printf输出中文&#xff1f; 1、在“Visual Studio Code”图标上右击&#xff0c;弹出对话框。见下图&#xff1a; 2、点击“以管理员身份运行”&#xff0c;得到下图&#xff1a; 3、点击“UTF-8”按钮&#xff0c;得到下图&#xff1a; 4、点击“通过编码重…...

qt hiRedis封装使用

qt Redis使用...

整理指定文件夹下的所有文件,以类树状图显示并生成对应超链接

最近在整理家里学习资料的时候&#xff0c;由于年代久远&#xff0c;找不到我想要找的文件&#xff0c;windows文件搜索速度感觉太慢。于是想要生成一份类似文件索引的东西来显示所有资料&#xff0c;让我可以快速的找到需要的资料路径 直接上代码 import os import datetim…...

解密代理技术:保障隐私与网络安全

在当今信息时代&#xff0c;网络代理技术是维护隐私和增强网络安全的关键工具。本文将深入研究Socks5代理、IP代理的应用&#xff0c;以及它们在网络安全、爬虫开发和HTTP协议中的关键作用。 引言 随着互联网的不断扩张&#xff0c;我们的在线活动变得日益复杂&#xff0c;也…...

k8s中,“deployment”充当什么角色?有什么功能?

在Kubernetes中&#xff0c;"Deployment"是一种控制器&#xff08;Controller&#xff09;&#xff0c;它充当了以下主要角色和功能&#xff1a; 应用程序部署和管理&#xff1a; Deployment用于定义和管理应用程序的部署。它允许您指定应用程序的副本数&#xff08;…...

深度学习:激活函数曲线总结

深度学习&#xff1a;激活函数曲线总结 在深度学习中有很多时候需要利用激活函数进行非线性处理&#xff0c;在搭建网路的时候也是非常重要的&#xff0c;为了更好的理解不同的激活函数的区别和差异&#xff0c;在这里做一个简单的总结&#xff0c;在pytorch中常用的激活函数的…...

Elasticsearch-06-Elasticsearch Java API Client

前言 简介 在 Elasticsearch7.15版本之后&#xff0c;Elasticsearch官方将它的高级客户端 RestHighLevelClient标记为弃用状态。同时推出了全新的 Java API客户端 Elasticsearch Java API Client&#xff0c;该客户端也将在 Elasticsearch8.0及以后版本中成为官方推荐使用的客…...

计算机网络第3章-运输层(2)

可靠数据传输原理 可靠数据传输依靠数据在一条可靠信道上进行传输。 TCP也正是依靠可靠信道进行传数据&#xff0c;从而数据不会被丢失。 而实现这种可靠数据传输服务是可靠数据传输协议的责任 构造可靠数据传输协议 1.经完全可靠信道的可靠数据传输&#xff1a;rdt1.0 在…...

【微信小程序】实现投票功能(附源码)

一、Vant Weapp介绍 Vant Weapp 是一个基于微信小程序的组件库&#xff0c;它提供了丰富的 UI 组件和交互功能&#xff0c;能够帮助开发者快速构建出现代化的小程序应用。Vant Weapp 的设计理念注重简洁、易用和高效&#xff0c;同时提供灵活的定制化选项&#xff0c;以满足开发…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...