这个问题看起来非常困难。这个话题确实没有完整的例子。
PyQt
在 PyQt4 中,我设法运行了QHttpMultiPart documentation 中提供的示例。适配的 Python 版本(需要 Qt 4.8):
from PyQt4 import QtGui, QtCore, QtNetwork
import sys
import time
def finished(reply):
print "Finished: ", reply.readAll()
app.quit()
def construct_multipart(data, files):
multiPart = QtNetwork.QHttpMultiPart(QtNetwork.QHttpMultiPart.FormDataType)
for key, value in data.items():
textPart = QtNetwork.QHttpPart()
textPart.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
"form-data; name=\"%s\"" % key)
textPart.setBody(value)
multiPart.append(textPart)
for key, file in files.items():
imagePart = QtNetwork.QHttpPart()
#imagePart.setHeader(QNetworkRequest::ContentTypeHeader, ...);
fileName = QtCore.QFileInfo(file.fileName()).fileName()
imagePart.setHeader(QtNetwork.QNetworkRequest.ContentDispositionHeader,
"form-data; name=\"%s\"; filename=\"%s\"" % (key, fileName))
imagePart.setBodyDevice(file);
multiPart.append(imagePart)
return multiPart
app = QtGui.QApplication(sys.argv)
file1 = QtCore.QFile('/tmp/1.txt')
file1.open(QtCore.QFile.ReadOnly)
url = QtCore.QUrl('http://localhost:3000/qwertytest1');
data = { 'text1': 'test1', 'text2': 'test2' }
files = {'file1': file1 }
multipart = construct_multipart(data, files)
request_qt = QtNetwork.QNetworkRequest(url)
request_qt.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
'multipart/form-data; boundary=%s' % multipart.boundary())
manager = QtNetwork.QNetworkAccessManager()
manager.finished.connect(finished)
request = manager.post(request_qt, multipart)
sys.exit(app.exec_())
PySide
PySide 实现缺少QHttpMultiPart。唯一的方法是手动构建发布数据内容。幸运的是,Python 有自己的库来创建多部分 HTTP 请求。这是我写的:
import sys
from PySide import QtCore, QtGui, QtNetwork
import requests
def finished(reply):
print "Finished: ", reply.readAll()
app.quit()
app = QtGui.QApplication(sys.argv)
url = 'http://localhost:3000/qwertytest1'
data = { 'text1': 'test1', 'text2': 'test2' }
files = {'file1': open('/tmp/1.txt') }
request = requests.Request('POST', url, data=data, files=files).prepare()
request_qt = QtNetwork.QNetworkRequest(url)
for header, value in request.headers.items():
request_qt.setRawHeader(header, value)
manager = QtNetwork.QNetworkAccessManager()
manager.finished.connect(finished)
request = manager.post(request_qt, request.body)
sys.exit(app.exec_())
请注意,此方法会加载内存中的所有文件内容。如果您正在处理大文件,这是不可接受的。 python-requests 模块本身支持动态发送大文件,但是没有办法在 Qt 中使用这个功能。如果是这种情况,您可以在没有 Qt 的情况下使用 python-requests。