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