• vue+golang上传微信头像


    1. <image :src="avatarUrl" class="avatar-img">image>
    2. // 微信头像修改
    3. onChooseAvatar(e) {
    4. this.uploadFile(e.detail.avatarUrl)
    5. },
    6. /* 上传头像转化格式*/
    7. uploadFile(avatarUrl){
    8. uni.uploadFile({
    9. url: this.fetch.fileUrl() + '/api/upload/uploadimages',//后台接口
    10. filePath: avatarUrl,// 上传图片 url
    11. name:'image',
    12. header: {
    13. 'content-type': 'multipart/form-data',
    14. 'token': uni.getStorageSync('token')
    15. }, // header 值
    16. success: res => {
    17. let obj = JSON.parse(res.data)
    18. console.log('obj', obj)
    19. if (obj. status == 'True') {
    20. this.avatarUrl = obj.data
    21. } else {
    22. this.common.toast(obj.msg)
    23. }
    24. },
    25. fail: e => {
    26. this.common.toast("上传失败")
    27. }
    28. });
    29. },

    api后台接收文件 

    1. /*
    2. * @Author: lmy
    3. * @Date: 2023-10-26 15:12:13
    4. * @LastEditors: lmy
    5. * @LastEditTime: 2023-10-27 10:40:14
    6. * @FilePath: \Project_UNI-APP_API\Main_Upload_Images.go
    7. * @Description: 正式版
    8. */
    9. package main
    10. import (
    11. "bytes"
    12. "io"
    13. "net/http"
    14. "path"
    15. "strings"
    16. "cntotal.com/sbjapi/xfileserviceapi"
    17. "cntotal.com/sbjbase/xjson"
    18. "cntotal.com/sbjlog"
    19. )
    20. // uploadImages 上传图片
    21. func uploadImages(w http.ResponseWriter, r *http.Request) {
    22. apiWriteHandler("", verifyUploadImages, &APIContext{Writer: w, Request: r, IsReadBody: true}, false)
    23. }
    24. // verifyUploadImages 上传图片
    25. func verifyUploadImages(a *APIContext) bool {
    26. defer func() {
    27. if err := recover(); err != nil {
    28. sbjlog.ExcLog("100", "[%s]verifyUploadImages-小程序登录:%s", a.Flag.Code, err)
    29. }
    30. }()
    31. uploadFile, handle, err := a.Request.FormFile("image")
    32. ext := strings.ToLower(path.Ext(handle.Filename))
    33. if ext != ".jpg" && ext != ".png" && ext != ".jpeg" {
    34. a.Resp.Msg = "只支持jpg/jpeg/png图片上传"
    35. return false
    36. }
    37. var buff = new(bytes.Buffer)
    38. _, _ = io.Copy(buff, uploadFile)
    39. buffByte := buff.Bytes()
    40. dataStr, err := xfileserviceapi.UploadTempFile(handle.Filename, &buffByte)
    41. if err != nil {
    42. sbjlog.Debug("xfileserviceapi.UploadTempFile 上传图片失败,图片名称:%v,err:%v ", handle.Filename, err)
    43. a.Resp.Msg = "上传图片失败"
    44. return false
    45. }
    46. returnData := xjson.JSONToMapString(dataStr)
    47. fileurl := returnData["fileurl"]
    48. if fileurl == "" {
    49. a.Resp.Msg = "上传图片失败"
    50. return false
    51. }
    52. a.Resp.Data = fileurl
    53. a.Resp.Msg = "上传图片成功"
    54. return true
    55. }

     上传文件接口

    1. package main
    2. import (
    3. "net/http"
    4. "strings"
    5. "cntotal.com/sbjbase"
    6. "cntotal.com/sbjlog"
    7. systemdb "cntotal.com/ProjectDBLibrary/system/DB"
    8. "cntotal.com/sbjbase/xalgorithm"
    9. "cntotal.com/sbjbase/xjson"
    10. )
    11. // 上传临时文件
    12. func type23(w http.ResponseWriter, r *http.Request) {
    13. apiWriteHandler("23", verify23, &APIContext{Writer: w, Request: r})
    14. }
    15. // 上传临时文件
    16. func verify23(a *APIContext) bool {
    17. var err error
    18. fileName := a.WordData["fileName"]
    19. uploadType := a.WordData["uploadType"] // 上传方式 10=覆盖上传 | 为空代表非覆盖,生成随机文件名
    20. Tp := a.WordData["Tp"]
    21. CheckKey := a.WordData["CheckKey"]
    22. //检验CheckKey
    23. sCheckKey := xalgorithm.MD5ToUpper32(xalgorithm.MD5ToUpper32(xalgorithm.MD5ToUpper32(fileName + Tp)[:15]))
    24. if CheckKey != sCheckKey {
    25. a.Resp.Msg = "CheckKey 验证不通过"
    26. return false
    27. }
    28. //验证参数值
    29. if fileName == "" {
    30. a.Resp.Msg = "fileName临时文件名不能为空"
    31. return false
    32. }
    33. //写入文件日志
    34. var systemFileLog systemdb.SystemFileLog
    35. systemFileLog.Status = 10 // 状态 = 正常
    36. systemFileLog.EnvironmentType = runEnvironment // 环境变量
    37. systemFileLog.Pid = a.ProgramID // 上传程序ID
    38. systemFileLog.Type = 10 // 类型=上传
    39. systemFileLog.FileType = 40 // 文件类型 40=临时文件
    40. systemFileLog.IP = a.RequestIP // 上传IP
    41. //处理保存 文件属性
    42. fileProgramID := a.ProgramID //文件归属程序 (关系到文件的路径写入)
    43. if a.WordData["isProjectFile"] == "1" {
    44. fileProgramID = a.ProgramID / 100 * 100 //取整数 710020 / 100 = 710000
    45. }
    46. // 定义是否随机文件名 | 如果不是覆盖上传,则填充随机文件名
    47. randomName := uploadType != "10"
    48. // 获取保存文件路径信息
    49. saveFilePath := getPathWithTempFile(fileProgramID, fileName, randomName)
    50. systemFileLog.FilePath = saveFilePath.FilePath
    51. // systemFileLog.FilePath, _, filename, fileext = GetPathWithTempFile(fileProgramID, tempPath)
    52. if strings.Index(saveFilePath.FileName, ".") == 0 {
    53. a.Resp.Msg = "文件名格式不正确"
    54. return false
    55. }
    56. if indexStringArray(tempFileExt, saveFilePath.FileExt) == -1 {
    57. a.Resp.Msg = "不满足临时文件文件格式"
    58. return false
    59. }
    60. // 因为数据已经转为了base64 ,源文件大小 * 133% = 现在大小 。 所以当前大小 / 133% = 原文件大小
    61. // 提前判断的原因:在前面提前读取判断防止无效读取文件,避免流量损失
    62. if a.Request.ContentLength*3/4 > int64(tempFileSize) {
    63. a.Resp.Msg = "临时文件文件超出大小" + getMegabytesString(fileSize) + "限制"
    64. return false
    65. }
    66. // 读取数据保存到指定路径 | 并计算文件md5
    67. var tfMd5 string
    68. systemFileLog.FileLength, tfMd5, err = readBodyFileToPath(a.Request, systemFileLog.FilePath)
    69. if err != nil {
    70. sbjlog.Debug("verify23-readBodyFileToCacheDir Error:%s", err.Error())
    71. a.Resp.Msg = "读取上传文件出现异常"
    72. return false
    73. }
    74. // 写入临时文件上传日志
    75. sflid := systemdb.InsertSystemFileLog(systemFileLog)
    76. if sflid < 1 {
    77. a.Resp.Msg = "新增文件日志失败"
    78. return false
    79. }
    80. a.Resp.Data, _ = sbjbase.AESEncrypt(
    81. xjson.MapToJSON(
    82. map[string]interface{}{
    83. "fileid": sflid,
    84. "fileurl": fileHost + strings.TrimPrefix(systemFileLog.FilePath, "./"),
    85. "filemd5": tfMd5}),
    86. CheckKey[:16])
    87. return true
    88. }

    上传临时文件方法 

    1. // readBodyFileToCacheDir 读取传输的文件保存到缓存文件夹
    2. // 返回 临时存储地址,文件MD5,错误信息
    3. func readBodyFileToCacheDir(r *http.Request) (filepath string, filesize int, md5Str string, err error) {
    4. filepath = cacheFileDir + fmt.Sprintf("%s_%s.temp", time.Now().Format("20060102150405"), xstring.RandomString(12, ""))
    5. filesize, md5Str, err = readBodyFileToPath(r, filepath)
    6. return
    7. }
    8. // readBodyFileToPath 从Body中读取文件保存到指定路径
    9. func readBodyFileToPath(r *http.Request, filepath string) (filesize int, md5Str string, err error) {
    10. var f *os.File
    11. f, err = os.Create(filepath)
    12. if err != nil {
    13. return
    14. }
    15. defer f.Close()
    16. // 按照Base64 编码分块读取数据到文件 ? 问题:未到限定步长
    17. _, err = xbinary.Copy(f, r.Body, 32*1024, xbinary.EncodeBase64)
    18. if err != nil {
    19. return
    20. }
    21. // 重置一下位置
    22. f.Seek(0, 0)
    23. var file os.FileInfo
    24. file, err = f.Stat()
    25. if err != nil {
    26. return
    27. }
    28. filesize = int(file.Size())
    29. if filesize <= 0 {
    30. err = errors.New("文件内容为空")
    31. return
    32. }
    33. // 把文件重新读出来 分块进行 MD5
    34. md5Str, err = xalgorithm.MD5BlocksToUpper32(f, 32*1024, xalgorithm.EncodeHexLower)
    35. return
    36. }

  • 相关阅读:
    六.schema设计
    Git提交代码仓库的两种方式
    技术分享 | Jenkins中,如何管理用户及其相对应权限?
    2022年7月国产数据库大事记-墨天轮
    一些封装好、使用度高的Api(JavaScript)
    【项目分析】仿linux0.11的操作系统内核
    WPF --- 触摸屏下的两个问题
    如何在Mac电脑上安装WeasyPrint:简单易懂的步骤
    Git提交规范
    Python常见面试题006 类方法、类实例方法、静态方法有何区别?
  • 原文地址:https://blog.csdn.net/lmy_loveF/article/details/134072408