1***@qq.com
1***@qq.com
  • 发布:2026-03-09 15:30
  • 更新:2026-03-09 15:31
  • 阅读:15

wx.uploadFile上传文件到云函数失败,云函数接收到的body是空字符串

分类:uniCloud

我想在微信原生小程序上次图片到uniCloud的云存储,我在云函数里面调用了uniCloud.uploadFile,但是没接到数据,情况如下:

云函数已url化,我在微信原生小程序里面上传图片,

export const uploadFile = (params) => {  
  return new Promise((resolve, reject) => {  
    wx.uploadFile({  
      url: env.baseUrl + '/uploadFile',  
      filePath: params.filePath,  
      name: params.name,  
      success(res) {  
        const data = res.data  
        console.log(data);  
        resolve(res)  
      },  
      fail(err) {  
        reject(err)  
      }  
    })  
  })  
}

云函数能接收到请求,

请求入参: {  
  "args": {  
    "path": "/uploadFile",  
    "httpMethod": "POST",  
    "headers": {  
      "content-length": "3052",  
      "referer": "https://servicewechat.com/wx0a164eeed8ef3f9c/devtools/page-frame.html",  
      "x5-uuid": "bf3e7d95b9723dbd70f85c1231fd115c",  
      "x-client-ip": "113.105.41.47",  
      "x-forwarded-for": "113.105.41.47, 60.205.193.107",  
      "x-real-ip": "113.105.41.47",  
      "x-sinfo": "on",  
      "host": "ae3110cd-7aaf-42ba-bae9-9a18b6ac0ad7.bspapp.com",  
      "content-type": "multipart/form-data; boundary=--------------------------549400157136678777750143",  
      "x-forwarded-by": "172.28.211.155:80",  
      "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 wechatdevtools/2.01.2510270 MicroMessenger/8.0.5 Language/zh_CN webview/"  
    },  
    "queryStringParameters": {},  
    "isBase64Encoded": false,  
    "body": ""  
  },  
  "requestId": "ac1cd39b1773039208620177919"  
}  
请求响应状态: success

但是接收到的body是空的,也解析不了,有没有大佬帮看看是什么问题?

2026-03-09 15:30 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

你遇到的问题是:
微信小程序使用 wx.uploadFile 上传文件到 uniCloud 云函数(已 URL 化)时,云函数接收到的 body 为空字符串。


✅ 问题根因

根据知识库中关于 云函数 URL 化 的说明,云函数 URL 化后,默认只支持 application/json 格式的请求体,而 wx.uploadFile 使用的是 multipart/form-data不会自动解析为 JSON,因此 event.body 为空。


✅ 正确做法(官方推荐)

✅ 方法一:使用 uniCloud.uploadFile(推荐,不走 URL 化)

客户端(微信小程序)

wx.chooseImage({  
  success(res) {  
    const tempFilePaths = res.tempFilePaths  
    uniCloud.uploadFile({  
      filePath: tempFilePaths[0],  
      cloudPath: 'test.jpg',  
      success(res) {  
        console.log('上传成功', res)  
      },  
      fail(err) {  
        console.error('上传失败', err)  
      }  
    })  
  }  
})

✅ 不需要 URL 化,直接走 uniCloud.uploadFile,自动上传到云存储。


✅ 方法二:如果你必须走 URL 化,需要手动解析 multipart/form-data

云函数中需使用 busboyformidable 等库手动解析 multipart/form-datauniCloud 默认不会解析

云函数示例(需安装依赖)

const Busboy = require('busboy')  

exports.main = async (event, context) => {  
  return new Promise((resolve, reject) => {  
    const busboy = Busboy({ headers: event.headers })  
    const files = []  
    const fields = {}  

    busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {  
      const chunks = []  
      file.on('data', chunk => chunks.push(chunk))  
      file.on('end', () => {  
        const buffer = Buffer.concat(chunks)  
        files.push({ fieldname, filename, buffer, mimetype })  
      })  
    })  

    busboy.on('field', (fieldname, val) => {  
      fields[fieldname] = val  
    })  

    busboy.on('finish', () => {  
      // 你可以在这里使用 uniCloud.uploadFile 上传 buffer 到云存储  
      resolve({ files, fields })  
    })  

    busboy.write(event.body, event.isBase64Encoded ? 'base64' : 'binary')  
    busboy.end()  
  })  
}

⚠️ 注意:你需要在云函数根目录安装 busboy

npm install busboy

✅ 总结建议

方案 是否推荐 说明
使用 uniCloud.uploadFile ✅ 强烈推荐 无需 URL 化,自动上传,兼容性好
使用 wx.uploadFile + URL 化 ⚠️ 不推荐 需手动解析 multipart,复杂且易出错

如你仍坚持使用 URL 化上传,请确保云函数中正确解析 multipart 数据。否则建议改用 uniCloud.uploadFile 方式。

内容为 AI 生成,仅供参考

要回复问题请先登录注册