[Solved]Problem Downloading a file
-
Hi All,
Some of you know how should I create an url that contains "+" to be able to do a get using QNetworkAccessManager?
When a try to perform a get to this link:
http://myStore/zip/myZip+.zip
I have an error: "ContentNotFoundError", but if I try to use it on Firefox it runs.
The real name of my file is: myZip+.zipThanks.
-
Have you tried "this":http://doc.qt.nokia.com/latest/qurl.html#toPercentEncoding ?
-
Yes but it doesn't wirk
-
How are you constructing your url? Have you tried http://doc.qt.nokia.com/latest/qurl.html#fromEncoded-2 using QUrl::TolerantMode as the parsing mode?
-
Well, the QUrl::toPercentEncoding() does exactly what you want, but without code and/or debug messages (how does your percent-encoded URL look?), we probably can't help you.
Try your program with _%2_B instead of the + in the URL (without underscores, this forum doesn't let me post _%2_B without underscores, it allways turns to "+") and see if it works.
-
My url already have %_2_B instead of +, but server when i perform get answer: ContentNotFoundError, but if i put the same url into firefox I'm able to download right file.
-
as LinusA said - provide us with some code, else nobody can really help you further, without seeing what could be wrong. Also, post any qDebug() output you get from your app (most important the results from the http request of QNetworkAccessManager
-
This is my code:
@
iNetReply = iNetManager->get(QNetworkRequest(QUrl("http://myStore-dev.myCompany.com/lmn/00000/fetch?device=00000&file=myFile+.zip")));
@After this request function: connectionError, it's a slot connected in this way:
@
connect(iNetReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(connectionError(QNetworkReply::NetworkError)));
@Write on console: Error code= 203
@
void PlotterDownloadThread::connectionError(QNetworkReply::NetworkError code)
{
qDebug()<<"Error code= "<<code;
}
@ -
as stated earlier, your URL should be percent-encoded. I don't see the .toPercentEncoding() method used, even though you said you used it.
@
iNetReply = iNetManager->get(QNetworkRequest(QUrl("http://myStore-dev.myCompany.com/lmn/00000/fetch?device=00000&file=myFile+.zip")));
@should be
@
iNetReply = iNetManager->get(QNetworkRequest(QUrl("http://myStore-dev.myCompany.com/lmn/00000/fetch?device=00000&file=myFile+.zip").toPercentEncoding()));
@ -
[quote]My url already have %_2_B instead of +, but server when i perform get answer: ContentNotFoundError, but if i put the same url into firefox I’m able to download right file.[/quote]
Can you use wireshark or a similar tool to analyze the HTTP traffic and understand what's going on?
[quote author="Eus" date="1314173671"]as stated earlier, your URL should be percent-encoded. I don't see the .toPercentEncoding() method used, even though you said you used it.
@
iNetReply = iNetManager->get(QNetworkRequest(QUrl("http://myStore-dev.myCompany.com/lmn/00000/fetch?device=00000&file=myFile+.zip")));
@should be
@
iNetReply = iNetManager->get(QNetworkRequest(QUrl("http://myStore-dev.myCompany.com/lmn/00000/fetch?device=00000&file=myFile+.zip").toPercentEncoding()));@
[/quote]This is completely nonsense. Not only that doesn't compile, but there's no QNetworkRequest(QByteArray) ctor, and you don't want to percent encode that url (thus escaping :, /, ?, &, etc.).
-
yeah, my bad, just noticed that too. And I haven't tried to compile it, it was using his code as starting point. He could percent encode the name only.....
-
[quote author="peppe" date="1314174967"]
This is completely nonsense. Not only that doesn't compile, but there's no QNetworkRequest(QByteArray) ctor
[/quote]The compiler will call the non-explicit QString(QByteArray) constructor for this, unless QT_NO_CAST_FROM_ASCII is defined.
-
[quote author="Volker" date="1314177476"]
[quote author="peppe" date="1314174967"]
This is completely nonsense. Not only that doesn't compile, but there's no QNetworkRequest(QByteArray) ctor
[/quote]The compiler will call the non-explicit QString(QByteArray) constructor for this, unless QT_NO_CAST_FROM_ASCII is defined.
[/quote]Nope -- QNetwokRequest wants a QUrl. There are two conversions to be made (QByteArray -> QString -> QUrl), and C++ forbids that (not to mention the fact that you can disable either of them with macros).
-
Then what should i do?
-
Constructing a valid QUrl to pass to QNetworkRequest sounds like a reasonable path to walk...
-
It's what I'm trying to do...
-
[quote author="qwertyuiopearendil" date="1314180408"]Then what should i do?[/quote]
As I said, dump HTTP headers and inspect them.
-
[quote author="peppe" date="1314177763"]
Nope -- QNetwokRequest wants a QUrl. There are two conversions to be made (QByteArray -> QString -> QUrl), and C++ forbids that (not to mention the fact that you can disable either of them with macros).
[/quote]Eek, you're right. I mixed up the parentheses. I need to do more LISP to get used to that ;-)
-
You might want to read the documentation for QUrl::fromUserInput then. It contains some more info on how to deal with string encodings and the likes.
-
Solved!!!
Below the solution about my problem:@
QString strUrl="http://myStore-dev.com/zip/mioFile%2_B.zip";QByteArray baUrl(strUrl.toAscii().data());
QUrl tmpUrl1;
tmpUrl1.setEncodedUrl(baUrl);
iNetReply = iNetManager->get(QNetworkRequest(tmpUrl1));
@Thanks to all.
Bye bye.