QString WebView::promptForFilename(const QNetworkRequest& request, QNetworkReply* pReply = NULL) { QString defaultFileName = QFileInfo(request.url().path()).fileName(); // Content-Disposition's filename parameter should be used as the // default, if present. if (pReply && pReply->hasRawHeader("content-disposition")) { QString headerValue = QString::fromAscii(pReply->rawHeader("content-disposition")); QRegExp regexp(QString::fromAscii("filename=(.+)"), Qt::CaseInsensitive); if (regexp.indexIn(headerValue) >= 0) { defaultFileName = regexp.cap(1); } } QString fileName = QFileDialog::getSaveFileName(this, tr("Download File"), defaultFileName, QString(), 0, standardFileDialogOptions()); return fileName; }
void WebPage::handleBase64Download(QWebFrame* pWebFrame, QUrl url) { // look for beginning of base64 data QString base64 = QString::fromUtf8("base64,"); int pos = url.path().indexOf(base64); if (pos == -1) { LOG_ERROR_MESSAGE("Base64 designator not found in data url"); return; } // extract the base64 data from the uri QString base64Data = url.path(); base64Data.remove(0, pos + base64.length()); QByteArray base64ByteArray(base64Data.toStdString().c_str()); QByteArray byteArray = QByteArray::fromBase64(base64ByteArray); // find the a tag in the page with this href QWebElement aTag; QString urlString = url.toString(QUrl::None); QWebElementCollection aElements = pWebFrame->findAllElements( QString::fromUtf8("a")); for (int i=0; i<aElements.count(); i++) { QWebElement a = aElements.at(i); QString href = a.attribute(QString::fromUtf8("href")); href.replace(QChar::fromAscii('\n'), QString::fromUtf8("")); if (href == urlString) { aTag = a; break; } } // if no a tag was found then bail if (aTag.isNull()) { LOG_ERROR_MESSAGE("Unable to finding matching a tag for data url"); return; } // get the download attribute (default filename) QString download = aTag.attribute(QString::fromUtf8("download")); QString defaultFilename = defaultSaveDir_.absoluteFilePath(download); // prompt for filename QString filename = QFileDialog::getSaveFileName( NULL, tr("Download File"), defaultFilename, defaultSaveDir_.absolutePath(), 0, standardFileDialogOptions()); if (!filename.isEmpty()) { // see if we need to force the extension FilePath defaultFilePath(defaultFilename.toUtf8().constData()); FilePath chosenFilePath(filename.toUtf8().constData()); if (chosenFilePath.extension().empty() && !defaultFilePath.extension().empty()) { filename += QString::fromStdString(defaultFilePath.extension()); } // write the file QFile file(filename); if (file.open(QIODevice::WriteOnly)) { if (file.write(byteArray) == -1) { showFileError(QString::fromUtf8("writing"), filename, file.errorString()); } file.close(); } else { showFileError(QString::fromUtf8("writing"), filename, file.errorString()); } // persist the defaultSaveDir defaultSaveDir_ = QFileInfo(file).dir(); } }