Название: Загрузка файла по ссылке Отправлено: chellenger от Июль 13, 2010, 12:12 Привет всем. Недавно стал изучать возможности WebKit для создания своего браузера.
Возникли вопросы: 1. если по ссылке идет загрузка файла - как определить имя и расширение этого файла? Делаю следующее: QWebView view; QWebPage page; QNetworkAccessManager manager; setPage(&page); page.setNetworkAccessManager(&manager); connect(&manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*))); в MyClass::replyFinished(QNetworkReply* reply) ловлю ответ из reply могу вытащить размер файла и впринципе записать в файл но вот как узнать имя файла и его тип на сервере? 2. Посмотрел на этом сайте примеры почитал мануал, везде QNetworkAccessManager отправляет запрос по ссылке и отлавливается сигнал finished. Но получается следующее: если запрос идет например на прямую ссылку на файл, и этот файл имеет значительный размер, то сигнал не придет пока весь файл не качнется - так что ли? Как же тогда сначало забрать заголовок для анализа? Может и не стоит вообще качать файл Название: Re: Загрузка файла по ссылке Отправлено: SABROG от Июль 13, 2010, 16:05 1. если по ссылке идет загрузка файла - как определить имя и расширение этого файла? Если ссылка прямая, типа "http://myserver/filename.zip", то из этого URL'a извлекаешь имя файла используя методы QUrl класса.Если ссылка относительная, типа "http://myserver/get?fileId=1234", то развитий событий может быть несколько: - сервер начнет передавать данные сразу. Если при этом браузер получает заголовок с типом данных, например "Content-Type: application/zip", то он автоматически предложит его сохранить как файл, но имя файла будет "get?fileId=1234" - сервер передает хедер "Content-Disposition". Тогда браузер возьмет имя файла из этого хедера. - сервер передает заголовок "Content-Type: text/html", а вместо html передает двоичные данные. Браузер попытается их отобразить на странице. - сервер делает редирект с "http://myserver/get?fileId=1234" на "http://myserver/1234/filename.zip". Имя файла берется из URL редиректа Как же тогда сначало забрать заголовок для анализа? Может и не стоит вообще качать файл QNetworkAccessManager::head(). Один и тот же URL передаешь 2 раза - сначала в метод head() и после сигнала finished() уже в метод get(), если содержимое заголовков удовлетворяет твоим условиям.Название: Re: Загрузка файла по ссылке Отправлено: chellenger от Июль 13, 2010, 16:35 1. если по ссылке идет загрузка файла - как определить имя и расширение этого файла? Если ссылка прямая, типа "http://myserver/filename.zip", то из этого URL'a извлекаешь имя файла используя методы QUrl класса.Если ссылка относительная, типа "http://myserver/get?fileId=1234", то развитий событий может быть несколько: - сервер начнет передавать данные сразу. Если при этом браузер получает заголовок с типом данных, например "Content-Type: application/zip", то он автоматически предложит его сохранить как файл, но имя файла будет "get?fileId=1234" - сервер передает хедер "Content-Disposition". Тогда браузер возьмет имя файла из этого хедера. - сервер передает заголовок "Content-Type: text/html", а вместо html передает двоичные данные. Браузер попытается их отобразить на странице. - сервер делает редирект с "http://myserver/get?fileId=1234" на "http://myserver/1234/filename.zip". Имя файла берется из URL редиректа Как же тогда сначало забрать заголовок для анализа? Может и не стоит вообще качать файл QNetworkAccessManager::head(). Один и тот же URL передаешь 2 раза - сначала в метод head() и после сигнала finished() уже в метод get(), если содержимое заголовков удовлетворяет твоим условиям.Имя файла вроде как научился получать, когда ссылка прямая. Когда идет редирект, буду отправлять запрос на редиректную ссылку. Браузер на основе weview ниразу не предложил сохранить файл - что делаю не так? Проблема с finished() - он срабатывает по завершении загрузки!!! А если файл большой то долго будет висеть webview. Как получать сначало заголовок файла? Анализировать его а потом. И уж после всего принимать решение о загрузке. |