2012-06-15 25 views
2

下面是使用PySide演示webapps等的最小瀏覽器的代碼。它通常以我想要的方式工作,儘管我似乎無法讓我的頭腦成功下載不支持的內容。PySide QWebView和下載不受支持的內容

在完成的方法self.reply.readAll()返回一個空的QByteArray。

任何幫助將不勝感激。 感謝

import sys 
import os 
from PySide import QtCore, QtGui, QtWebKit, QtNetwork 


class Browser(QtGui.QMainWindow): 

    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     self.web = QtWebKit.QWebView() 
     self.web.page().setForwardUnsupportedContent(True) 
     self.web.page().unsupportedContent.connect(self.download) 

     self.manager = QtNetwork.QNetworkAccessManager() 
     self.manager.finished.connect(self.finished) 

    def download(self, reply): 
     self.request = QtNetwork.QNetworkRequest(reply.url()) 
     self.reply = self.manager.get(self.request) 

    def finished(self): 
     path = os.path.expanduser(os.path.join('~', unicode(self.reply.url().path()).split('/')[-1])) 
     destination = QtGui.QFileDialog.getSaveFileName(self, "Save", path) 
     if destination: 
      filename = destination[0] 
      with open(filename, 'wb') as f: 
       f.write(str(self.reply.readAll())) 
       f.close() 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 

    browser = Browser() 
    browser.web.load(QtCore.QUrl('http://127.0.0.1:8000')) 
    browser.web.show() 

    sys.exit(app.exec_()) 
+0

什麼類型的內容? – nathancahill

+0

今天,我希望它下載一個csv文件,但我希望它具有足夠的通用性,足以用於其他類型的文件類型,如壓縮文件和PDF。 – macdhuibh

回答

4

隨着幫助一個公平位找到了解決辦法。對於那些可能感興趣的用戶,最終版本的下載和完成功能如下:

def download(self, reply): 
    self.request = reply.request() 
    self.request.setUrl(reply.url()) 
    self.reply = self.manager.get(self.request) 

def finished(self): 
    path = os.path.expanduser(
     os.path.join('~', 
        unicode(self.reply.url().path()).split('/')[-1])) 
    if self.reply.hasRawHeader('Content-Disposition'): 
     cnt_dis = self.reply.rawHeader('Content-Disposition').data() 
     if cnt_dis.startswith('attachment'): 
      path = cnt_dis.split('=')[1] 

    destination = QtGui.QFileDialog.getSaveFileName(self, "Save", path) 
    if destination: 
     f = open(destination[0], 'wb') 
     f.write(self.reply.readAll()) 
     f.flush() 
     f.close()