Laravel+Python请求失败但Postman可正常运行问题排查
解决树莓派Python脚本发送multipart/form-data视频失败的问题
嘿,太懂这种“Postman能跑自己的脚本不行”的憋屈感了!之前用Base64凑合用肯定不是长久之计,毕竟视频文件大的话Base64会额外增加体积,效率太低。咱们一步步排查问题:
最常见的坑:错误手动设置Content-Type
很多人写脚本的时候会手动加headers={"Content-Type": "multipart/form-data"},这反而会搞砸请求!因为multipart/form-data需要自动生成的boundary分隔符,requests库会在你使用files参数时自动处理这个header,手动设置会覆盖掉正确的boundary,导致后端无法解析。
正确的requests用法示例
import requests # 替换成你的目标API地址 target_url = "https://your-api-endpoint.com/upload" # 树莓派上的视频文件路径 video_file_path = "/home/pi/recordings/test_video.mp4" # 构造files字典,注意键名要和后端接收的字段完全一致(比如Postman里用的是"file"还是"video") upload_files = { "video": ( "test_video.mp4", # 上传时的文件名,可选,不传的话会用原文件名 open(video_file_path, "rb"), # 二进制模式打开文件!必须是rb "video/mp4" # MIME类型,后端可能会校验这个 ) } # 如果需要附带其他表单参数,用data字典 form_data = { "device_id": "raspberry_pi_001", "timestamp": "2024-05-20T12:34:56" } try: response = requests.post(target_url, files=upload_files, data=form_data) # 打印响应信息,方便排查 print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}") except Exception as e: print(f"请求出错: {str(e)}") finally: # 记得关闭文件句柄,避免资源泄漏 upload_files["video"][1].close()
快速排查技巧:对比Postman生成的代码
Postman有个超实用的功能:把你的成功请求转换成Python代码。步骤如下:
- 在Postman里发送成功的视频上传请求
- 点击请求右上角的「Code」按钮
- 在弹出的窗口里选择「Python - requests」
- 把生成的代码复制出来,和你自己的脚本逐行对比,看哪里不一样(比如字段名、文件名、MIME类型、有没有额外的headers)
这种方法能直接定位到你脚本里的细节错误,比如你可能把字段名写成了"video_file"但后端只认"file",或者文件名带了特殊字符没处理。
其他可能的问题点
- 文件权限:树莓派上的Python脚本有没有读取视频文件的权限?可以用
ls -l /home/pi/recordings/test_video.mp4查看权限,必要时用sudo chmod 644 你的视频文件调整。 - 文件损坏:确认视频文件本身没问题,比如在树莓派上用
mpv或者ffplay播放试试,避免上传本身就损坏的文件。 - 网络限制:树莓派是不是在局域网里,目标服务器有没有白名单?可以先试试用
curl模拟请求,比如curl -X POST -F "video=@/home/pi/recordings/test_video.mp4" https://your-api-endpoint.com/upload,看能不能成功。
先试试上面的方法,尤其是Postman生成代码对比,大概率能解决问题!
内容的提问来源于stack exchange,提问作者Nelson Candia
相关产品推荐
相关产品推荐

