Moh*_*hzp 4 python qt http pyqt pyside
我正在尝试将文件和其他POST变量发送到客户服务器上的xfilesharing脚本(在perl中)。
Google上没有很好的资源,我发现的代码示例不起作用。(实际上它们是用c ++编写的,我无法使它们正常工作)
服务器正在使用Apache作为Web服务器
我之前问过一个问题,我得到了一个很好的答案,所以我在这里使用该上传器,代码对于通过http发布来上传文件不起作用
所以任何人都可以首先告诉我我要通过HTTP发布文件的操作,然后如果您能给我一个示例就好了(在本地主机上上传简单的代码就足够了,我只想看看如何以及上传的方式)
这个问题看起来异常困难。确实没有关于此主题的完整示例。
在PyQt4中,我设法运行QHttpMultiPart文档中提供的示例。改编的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_())
Run Code Online (Sandbox Code Playgroud)
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_())
Run Code Online (Sandbox Code Playgroud)
请注意,此方法将所有文件内容加载到内存中。如果要处理大文件,这是不可接受的。python-requests模块本身支持动态发送大文件,但是无法在Qt中使用此功能。如果是这种情况,您可以不使用Qt就使用python-requests。
| 归档时间: |
|
| 查看次数: |
2009 次 |
| 最近记录: |