在Pyside/PyQ中通过http post上传文件

2024-06-08 14:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个文件和其他POST变量发送到客户服务器上的xfilesharing脚本(用perl编写)。在

Google上没有好的资源,我发现的代码示例也不起作用(实际上它们是用c++编写的,我无法让它们正常工作)

服务器正在使用Apache for webserver

我之前问过一个问题,得到了一个很好的答案,所以我在这里使用了uploader,代码不适用于通过httppost上传文件

所以,有谁能先告诉我通过httppost上传文件需要做些什么,然后如果你能给我一个示例(在本地主机上上传简单的代码就足够了,我只想看看如何上传以及如何上传)


Tags: 文件代码服务器脚本示例forapachegoogle
1条回答
网友
1楼 · 发布于 2024-06-08 14:28:21

这个问题似乎很难回答。在这个问题上确实没有完整的例子。在

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。唯一的方法是手动构造post数据内容。幸运的是,Python有自己的库来创建多部分HTTP请求。以下是我写的:

^{pr2}$

请注意,此方法加载内存中的所有文件内容。如果你处理的是大文件,这是不可接受的。pythonrequests模块本身支持动态发送大文件,但无法将此功能用于Qt。如果是这样的话,可以只使用不带Qt的python请求。在

相关问题 更多 >