Exemple #1
0
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();
    }
}