LINUX.ORG.RU

Как скачивать файл?

 qhttp,


0

2

Доброго времени суток. Есть объект QHttp, он скачивает get-запросом файл. Интересует что будет лучше: каждый раз писать в файл когда возникает сигнал QHttp::readyRead(QHttpResponseHeader) или когда загрузка закончена, по сигналу QHttp::done(bool) ?

★☆☆☆

Ответ на: комментарий от trex6

P.S. Если файл большой, тогда периодически сбрасывать буффер в tmp

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Мм.. а чем хуже по сигналу done сделать readAll() и результат записать в файл?

ПС. файлы не более 300МБ.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от drull

P.S. Если файл большой, тогда периодически сбрасывать буффер в tmp

Именно для этого его лучше читать по кускам и, если кусок большой набрался, то сбрасывать его из оперативки на диск.

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от drull

Соглашусь с двумя верхними комментариями.

Мм.. а чем хуже по сигналу done сделать readAll() и результат записать в файл?

Докачку не получится реализовать. А 300мб - не такой уж и маленький файл, в случае проблем с сетью обидно перекачивать.

//посмотрев в сорцы qt Да и в любом случае, оно у тебя и так и так будет жрать память - не заметил никаких сбросов в файлы при большом объеме контента. Возможно конечно сильно поверхностно прошелся - но у QHttp в качестве контейнера для данных простой QRingBuffer, и никаких дампов на диск при сильно больших файлах не делается. А вот вопрос, как дампить самому и корректно чистить QHttp остаётся открытым.

Reinar
()
Ответ на: комментарий от Reinar

Докачку не получится реализовать. А 300мб - не такой уж и маленький файл, в случае проблем с сетью обидно перекачивать.

Согласен, хороший аргумент.

drull ★☆☆☆
() автор топика
Ответ на: комментарий от Reinar

А вот вопрос, как дампить самому и корректно чистить QHttp остаётся открытым.

Что-то я сильно стормозил - после чтения буфер в QHttp ожидаемо чистится сам.

Так что тут всё ясно - писать по сигналу.

Reinar
()
Ответ на: комментарий от panter_dsd

Юзай QNetworkAccessManager.

+1

В Qt5 QHttp и QFtp не будет (хотя получать список файлов в ftp-директории QNetworkAccessManager так и не научился).

unfo ★★★★★
()

писать кусками по мере прихода, однозначно.

а касательно мелких кусков беспокоиться не нужно, ибо есть такая вещь как файловые буфера ОС. Хотя если уж совсем захочется правду узнать - написать и протестировать.

dmitryalexeeff
()
Ответ на: комментарий от drull

Моё ИМХО такое, раз нет разницы по скорости, то нужно выбирать по другим критериям.
Вариант с сохранением в памяти и записью в конце нехорош тем, что будет отжирать много памяти, и как это видно из теста, безо всякого смысла.

А то что не имеет смысла делать бессмысленно (прошу прощения за тафтологию)

dmitryalexeeff
()

Я решал этот вопрос в зависимости от размера файла. Если он больше некоторого порогового значения, то запись шла сразу в файл, иначе в память. Правда если не ошибаюсь, существуют случаи, когда размер файла получить невозможно. Но мой источник файлов давал информацию о размере, поэтому такое решение работало.

void HttpFetcher::onReadyRead()
{
	QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());

	QVariant v = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
	if(v.isValid())
		return;

	QIODevice* buffer = bufferByReply_[reply];
	if(!buffer) {
		qint64 length = reply->rawHeader("Content-Length").toULongLong();

		if(length == 0 || length > sizeThreshold_) {
			QTemporaryFile* tempFile = new QTemporaryFile;
			tempFile->open();
			buffer = tempFile;
		}

		else {
			QBuffer* tempBuffer = new QBuffer;
			tempBuffer->open(QBuffer::ReadWrite);
			buffer = tempBuffer;
		}

		bufferByReply_.insert(reply, buffer);
	}

	buffer->write(reply->readAll());
}
m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Правда если не ошибаюсь, существуют случаи, когда размер файла получить невозможно.

Да, когда файл формируется динамически (медиа-поток, например) - тогда он будет отдаваться в Chunked Encoding, а поля Content-Length в таком случае может и не быть. А если файл уже готов - по стандарту веб-сервер должен отдать его размер в Content-Length, что обычно и происходит.

Reinar
()
Ответ на: комментарий от Kalashnikov

Не пытайся утверждать что это нельзя подделать.

Я знаю какие файлы будут скачиваться. Я их сам заливаю. Так что размер всех файлов знаю точно.

drull ★☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.