为什么QNetworkReply readAll()返回零字节?

时间:2011-08-21 07:22:31

标签: python networking network-programming pyqt4 qtwebkit

我在pyqt4中使用qtwebkit通过QNetworkReply下载图像:

import os 
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage

class dxBrowser(QWebPage):
def __init__(self,url):
    QWebPage.__init__(self)
    self._url=url
    self.manager=self.networkAccessManager()
    self.connect(self.manager,SIGNAL("finished(QNetworkReply *)"),self.onFinished)

def crawl(self):
    self.mainFrame().load(QUrl(self._url))

def onFinished(self,networkReply):
    if networkReply.rawHeader('Content-Type')=='image/png':
        print 'find the image'
        l=int(networkReply.rawHeader('Content-Length'))
        print l
        byteArray=networkReply.readAll()
        print byteArray.size()
        im=QImage.fromData(byteArray)
        if not im.save('test.jpg','jpg'):
            print 'image save error'


def main():
    app=QApplication(sys.argv)
    url='http://www.yiyaows.cn/DrsPath.do?kid=6666686E686E69673334333632303335&username=mylibddrz&spagenum=251&pages=50&fid=7534992&a=95cb07394dbf1d43c1fe61bdf6d4a36d&btime=2011-08-19&etime=2011-09-08&template=bookdsr1&firstdrs=http%3A%2F%2Fbook1.duxiu.com%2FbookDetail.jsp%3FdxNumber%3D000005609810%26d%3DA30222298F3C6715323B5476CB66D650'
    dx=dxBrowser(url)
    dx.crawl()
    sys.exit(app.exec_())

if __name__=='__main__':
    main()    

虽然内容长度不为零,但byteArray.size()为0.所以我无法保存图像。为什么?任何人都可以帮助我。

修改 也许我想出来了。 qtwebkit可能已经检索了qnetworkreply的内容,一个QIODevice,在readall()之后它的大小将是0。也许作为浏览器的qtwebkit已经读取它用于渲染,我猜。

1 个答案:

答案 0 :(得分:2)

  编辑:也许我想出来了。 qtwebkit可能已经检索了   qnetworkreply的内容,一个QIODevice,它的大小将为0   在readall()之后。也许作为浏览器的qtwebkit已经读过它了   渲染,我想。

是的并且有一个简单的解决方法:向经理添加QNetworkDiskCacheQNetworkAccessManager.setCache)并从广告位onFinished中的缓存中检索图片。

如果网站使用“Pragma:no-cache”或“Cache-control”提示浏览器不将文件保存到磁盘,则必须重新定义方法prepare(也许{{1} }}} updateMetaData在调用原始方法之前覆盖标志QNetworkDiskCache