Russian Qt Forum
Ноябрь 23, 2024, 22:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка файла по ссылке  (Прочитано 5707 раз)
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. Но получается следующее: если запрос идет например на прямую ссылку на файл, и этот файл имеет значительный размер, то сигнал не придет пока весь файл не качнется - так что ли? Как же тогда сначало забрать заголовок для анализа? Может и не стоит вообще качать файл
« Последнее редактирование: Июль 13, 2010, 12:58 от chellenger » Записан
SABROG
Гость
« Ответ #1 : Июль 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(), если содержимое заголовков удовлетворяет твоим условиям.
Записан
chellenger
Гость
« Ответ #2 : Июль 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. Как получать сначало заголовок файла? Анализировать его а потом. И уж после всего принимать решение о загрузке.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.