You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Django/Tastypie服务端传输大体积zip文件的报错及方案咨询

问题根因分析

  • 你调用socket.connect()时传入的第一个参数是完整HTTP URLhttp://192.168.0.21:8000/api/v1/ziptest/,但socket连接只需要纯IP地址,不需要带http://前缀和接口路径,地址解析失败才会抛出Name or service not known错误。
  • 就算修正了连接地址,原生TCP socket传输的是裸二进制流,没有符合HTTP协议的请求头、请求体格式,你的服务端是基于HTTP的REST接口,根本识别不了socket发送的内容,所以资源函数永远不会被触发。

方案选型建议

原生socket不是该场景的最优方案,你需要对接已有的HTTP服务,自己实现HTTP协议的工作量大、容错性差,有更简便的实现方式:

1. 对接现有HTTP接口的推荐方案:用requests库实现文件上传

直接用成熟的HTTP请求库处理协议层逻辑,几行代码就能实现,支持大文件流式上传,不会占用过多内存:
树莓派端示例代码:

import requests

def send_file():
    # zipTypes替换为你实际的文件名前缀列表
    upload_url = "http://192.168.0.21:8000/api/v1/ziptest/"
    for zip_type in zipTypes:
        file_path = f'/logs/rel_5_0608.3800_val2/{zip_type}.zip'
        print(f"正在上传:{file_path}")
        # 流式上传大文件,不会一次性读入内存
        with open(file_path, 'rb') as f:
            files = {'file': f}
            resp = requests.post(upload_url, files=files, timeout=3600)
            resp.raise_for_status()
        print(f"{file_path} 上传完成,响应状态:{resp.status_code}")

服务端需要在ResponseZipTest类中实现POST请求的文件接收逻辑,从request对象中读取上传的文件流保存即可。

2. 无需对接现有HTTP接口的极简方案

如果只是局域网内树莓派到Windows的大文件传输,不需要对接现有业务接口,可以直接用现成工具,不用写自定义代码:

  • Windows端开启samba共享文件夹,树莓派挂载共享目录后直接复制文件即可
  • Windows端打开SSH服务,树莓派用scp命令直接传输文件:scp /本地路径/xxx.zip windows用户名@192.168.0.21:/目标路径/
  • 用Python自带的HTTP服务实现临时传输:Windows端在目标文件夹下运行python -m http.server 8000,树莓派用curl/post请求上传即可。

内容的提问来源于stack exchange,提问作者Toby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:54:10