PySide2(PyQt5)使用form-data上传multipart/form-data表单数据(含文件)

Qt For Python踩坑。搞了好久,自己挖坑。这里记录下PySide2如何上传表单数据(含文件).
上代码:

app = QApplication.instance()  # 获取全局app
# 在开启客户端我手动绑定了QNetworkAcessManager实例,使用setattr()这里不多说啦
network_manager = getattr(app, "_network")  

text_dict = {
    "username": "用户名",
    "password": "密码123",
    "input_code": self.login_code.text(),
    "code_uuid": self._code_uuid
}

file = QFile("icons/app.png")
file.open(QFile.ReadOnly)

file_dict = {
    "file_key": file
}

multi_data = generate_multipart_data(text_dict, file_dict)

url = SERVER + "/login/file/"
request = QNetworkRequest(url=QUrl(url))
# 设置后服务器无法找到边界报400
# request.setHeader(QNetworkRequest.ContentTypeHeader, "multipart/form-data; boundary=%s" % multi_data.boundary())  
reply = network_manager.post(request, multi_data)
# reply.finished.connect(self.user_login_back)   # 请求成功的信号槽
# reply.error.connect(self.user_login_error)  # 请求失败的信号槽
multi_data.setParent(reply)

generate_multipart_data(text_dict, file_dict)函数

from PySide2.QtNetwork import QHttpPart, QHttpMultiPart, QNetworkRequest
from PySide2.QtCore import QFileInfo


def generate_multipart_data(text_dict=None, file_dict=None):
    multipart_data = QHttpMultiPart(QHttpMultiPart.FormDataType)
    if text_dict:
        for key, value in text_dict.items():
            text_part = QHttpPart()
            text_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data;name=\"%s\"" % key)
            text_part.setBody(value.encode("utf-8"))
            multipart_data.append(text_part)
    if file_dict:
        for key, file in file_dict.items():
            file_part = QHttpPart()
            filename = QFileInfo(file.fileName()).fileName()
            file_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=%s; filename=%s" % (key, filename))
            file_part.setBodyDevice(file)
            file.setParent(multipart_data)
            multipart_data.append(file_part)
    return multipart_data
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值