R: help using KIO to download files in Konqueror
aiacovitti at libero.it
aiacovitti at libero.it
Thu Aug 24 15:08:36 BST 2017
Have you checked if there are differences in the http headers sent between the
two requests ?
They could affect the server response.
Andrea
>----Messaggio originale----
>Da: "Stefano Crocco" <stefano.crocco at alice.it>
>Data: 22/08/2017 17.21
>A: <kfm-devel at kde.org>
>Ogg: help using KIO to download files in Konqueror
>
>Hello to everyone,
>I'd need a bit of help to solve an issue I run into while attempting to fix
>Konqueror so that downloads work correctly using QWebEngine.
>
>The issue regards a situation when you try to download a file which is
created
>by a server-side script. It doesn't happen for all such downloads; actually,
I
>only found one site causing this behaviour: unfortunately, it's the web site
of
>my bank so, of course I can't give you the password to try my code.
>
>The issue is the following: I use KParts::BrowserOpenOrSaveQuestion to ask
the
>user whether he wants to save or open the file, then use either KIO::copy or
>KRun, according to the user choice, to download or open the file. In both
>cases, the code is mostly copied from the KDEWebKit framework (in
particular,
>from kwebpage.cpp, lines ...). In both cases, however, what is downloaded is
not
>the file produced by the script on the server (in this case, a PDF) but the
>script itself. What I can't understand is that using KWebKitPart (which
means
>the KDEWebKit framework, whose code I almost copied) produces the correct
>result, downloading or opening the PDF file.
>
>I tried looking at differences between my code and KWebPage and reading all
>related documentation, but I couldn't find anything which could explain the
>different behaviours. Can someone point me in the right direction?
>
>Here are the relevant lines of code (when saving the file)
>
>//From kwebenginepartdownloadmanager.cpp (my code):
>bool WebEnginePartDownloadManager::downloadAndSave(QWebEngineDownloadItem*
it, WebEnginePage* page)
>{
> QString fileName = QDir(QStandardPaths::writableLocation(QStandardPaths::
DownloadLocation)).filePath(it->path());
> QUrl destUrl = QUrl::fromLocalFile(QFileDialog::getSaveFileName(page-
>view(), QString(),fileName));
> if(!destUrl.isValid()) return false;
>
> KIO::Job *job = KIO::copy(it->url(), destUrl);
>
> job->addMetaData(QLatin1String("MaxCacheSize"), QLatin1String("0"));
//Don't store in http cache.
> job->addMetaData(QLatin1String("cache"), QLatin1String("cache")); // Use
entry from cache if available.
> KJobWidgets::setWindow(job, page->view());
> job->uiDelegate()->setAutoErrorHandlingEnabled(true);
> return true;
>}
>
>//From kwebpage.cpp (from KDEWebKit framework)
>static bool downloadResource(const QUrl &srcUrl, const QString &suggestedName
= QString(), QWidget *parent = nullptr, const KIO::MetaData &metaData = KIO::
MetaData())
>{
> const QString fileName = suggestedName.isEmpty() ? srcUrl.fileName() :
suggestedName;
> // convert filename to URL using fromPath to avoid trouble with ':' in
filenames (#184202)
> QUrl destUrl = QUrl::fromLocalFile(QFileDialog::getSaveFileName(parent,
QString(), fileName));
> if (!destUrl.isValid()) {
> return false;
> }
>
> // Using KIO::copy rather than file_copy, to benefit from "dest already
exists" dialogs.
> KIO::Job *job = KIO::copy(srcUrl, destUrl);
>
> if (!metaData.isEmpty()) {
> job->setMetaData(metaData);
> }
>
> job->addMetaData(QL1S("MaxCacheSize"), QL1S("0")); // Don't store in http
cache.
> job->addMetaData(QL1S("cache"), QL1S("cache")); // Use entry from cache
if available.
> KJobWidgets::setWindow(job, parent ? parent->window() : nullptr);
> job->ui()->setAutoErrorHandlingEnabled(true);
> return true;
>}
>
>In case they're useful, I attach both files. The functions I copied above
are
>called respectively from line 97 of webenginepartdownloadmanager.cpp and
line
>608 of kwebpage.cpp.
>
>Thanks in advance for any help
>
>Stefano
>
More information about the kfm-devel
mailing list