http_upload_file.lua 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. --[[
  2. @module http_upload_file
  3. @summary TF卡大文件httpplus上传模块
  4. @version 1.0.0
  5. @date 2025.08.25
  6. @author 王棚嶙
  7. @usage
  8. 本文件演示通过httpplus库将TF卡中的大文件上传到HTTP服务器:
  9. 1. 网络就绪检测
  10. 2. TF卡文件系统挂载
  11. 3. 大文件上传功能
  12. 4. 上传结果记录
  13. 本文件没有对外接口,直接在main.lua中require "http_upload_file"即可
  14. ]]
  15. -- 加载httpplus扩展库,不可省略
  16. local httpplus = require "httpplus"
  17. local function http_upload_task()
  18. -- 阶段1: 网络就绪检测
  19. while not socket.adapter(socket.dft()) do
  20. log.warn("HTTP上传", "等待网络连接", socket.dft())
  21. -- 待IP_READY消息,超时设为1秒
  22. sys.waitUntil("IP_READY", 1000)
  23. end
  24. -- 检测到了IP_READY消息
  25. log.info("HTTP上传", "网络已就绪", socket.dft())
  26. -- 阶段2: TF卡文件系统初始化
  27. local spi_id, pin_cs = 1, 20
  28. spi.setup(spi_id, nil, 0, 0, 400 * 1000)
  29. -- 同一spi总线上的所有从设备在初始化时必须要先拉高CS脚,防止从设备之间互相干扰。
  30. -- 在air8000开发板上,TF卡和ch390共用SPI1总线。
  31. gpio.setup(pin_cs, 1)
  32. local mount_ok = fatfs.mount(fatfs.SPI, "/sd", spi_id, pin_cs, 24 * 1000 * 1000)
  33. if not mount_ok then
  34. log.error("HTTP上传", "文件系统挂载失败")
  35. fatfs.unmount("/sd")
  36. spi.close(spi_id)
  37. return
  38. end
  39. -- 阶段3: 检查要上传的文件是否存在
  40. -- 替换为实际的文件路径
  41. local upload_file_path = "/sd/3_23MB.bin"
  42. if not io.exists(upload_file_path) then
  43. log.error("HTTP上传", "要上传的文件不存在", upload_file_path)
  44. fatfs.unmount("/sd")
  45. spi.close(spi_id)
  46. return
  47. end
  48. -- 获取文件大小
  49. local file_size = io.fileSize(upload_file_path)
  50. log.info("HTTP上传", "准备上传文件", upload_file_path, "大小:", file_size, "字节")
  51. -- 阶段4: 执行文件上传
  52. log.info("HTTP上传", "开始上传任务")
  53. -- 使用httpplus库上传文件,参考httpplus_app_post_file的实现
  54. -- hhtplus.request接口支持单文件上传、多文件上传、单文本上传、多文本上传、单/多文本+单/多文件上传
  55. -- http://airtest.openluat.com:2900/uploadFileToStatic 仅支持单文件上传,并且上传的文件name必须使用"uploadFile"
  56. -- 所以此处仅演示了单文件上传功能,并且"uploadFile"不能改成其他名字,否则会出现上传失败的应答
  57. local code, response = httpplus.request({
  58. url = "http://airtest.openluat.com:2900/uploadFileToStatic",
  59. files = {
  60. -- 服务器要求文件名必须为"uploadFile"
  61. ["uploadFile"] = upload_file_path,
  62. },
  63. })
  64. -- 阶段5: 记录上传结果
  65. log.info("HTTP上传", "上传完成",
  66. code == 200 and "success" or "error",
  67. code)
  68. if code == 200 then
  69. log.info("HTTP上传", "服务器响应头", json.encode(response.headers or {}))
  70. local body = response.body and response.body:query()
  71. log.info("HTTP上传", "服务器响应体长度", body and body:len() or 0)
  72. -- 可以进一步解析服务器响应
  73. if body then
  74. log.info("HTTP上传", "服务器响应内容", body:len() > 512 and "内容过长,不显示" or body)
  75. end
  76. else
  77. log.error("HTTP上传", "上传失败", code)
  78. end
  79. -- 阶段6: 资源清理
  80. fatfs.unmount("/sd")
  81. spi.close(spi_id)
  82. log.info("HTTP上传", "资源清理完成")
  83. end
  84. -- 创建上传任务
  85. sys.taskInit(http_upload_task)