Почему QNetworkReply readAll () возвращает ноль байтов? - PullRequest
2 голосов
/ 21 августа 2011

Я использую qtwebkit в pyqt4 для загрузки изображений через 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. Поэтому я не могу сохранить изображение. Зачем? Может ли кто-нибудь помочь мне.

EDIT: Может быть, я понял это. Qtwebkit может получить содержимое qnetworkreply, QIODevice, размер которого после readall () будет равен 0. Возможно, qtwebkit как браузер прочитал его для рендеринга, я думаю.

1 Ответ

2 голосов
/ 27 августа 2011

РЕДАКТИРОВАТЬ: Может быть, я понял это. Qtwebkit, возможно, получил содержимое qnetworkreply, QIODevice, его размер будет 0 после readall (). Может быть, qtwebkit как браузер прочитал его для рендеринг, наверное.

Да, и есть простой обходной путь: добавьте QNetworkDiskCache к менеджеру (с QNetworkAccessManager.setCache) и извлеките изображение из кэша в вашем слоте onFinished.

Если веб-сайт использует «Pragma: no-cache» или «Cache-control», чтобы подсказать браузеру не сохранять файл на диск, вам придется переопределить метод prepare (и, возможно, updateMetaData) QNetworkDiskCache переопределить флаг saveToDisk перед вызовом исходного метода (ов).

...