Я загружаю mp3-файлы из облачных файлов Rackspace, и для больших файлов я сталкиваюсь с проблемой, когда загрузка успешно завершена, но файл еще не загружен полностью. Например, mp3-файл 40 MB
(длительность 01:00:00
) загружается как mp3-файл 4.5 MB
(длительность 00:10:30
). Это не происходит все время.
- Есть какие-нибудь указатели относительно того, что происходит?
- Почему это происходит, и как я могу исправить эту проблему?
- Как создать простую логику контрольной суммы, чтобы проверить, был ли файл загружен полностью?
Вот как я могу создать и отправить асинхронный запрос:
ASIHTTPRequest *request;
request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setShouldAttemptPersistentConnection:NO];
[request setAllowResumeForFileDownloads:YES];
[request setDownloadProgressDelegate:self];
[request setShouldContinueWhenAppEntersBackground:YES];
[request setUserInfo:userInfo];
[request setDownloadDestinationPath:downloadPath];
[request setTemporaryFileDownloadPath:[NSString stringWithFormat:@"%@.download", downloadPath]];
[self.networkQueue addOperation:request];
[self.networkQueue go];
Обратите внимание, я использую сетевую очередь с 4 одновременными загрузками.
Спасибо.
Редактировать (пн 5 марта 2012, 15:25)
Итак, дальнейшее исследование показывает, что ASINetworkQueue
вызывает requestDidFinishSelector
метод делегата вместо requestDidFailSelector
. Код состояния, возвращаемый объектом ASIHTTPRequest
, - 206, HTTP/1.1 206 Partial Content
в методе requestDidFinishSelector
. Код состояния должен быть 200, HTTP/1.1 200 OK
.
Я до сих пор не знаю почему! и я до сих пор не знаю, как это исправить. Кажется, мне придется удалить частично загруженный файл и начать процесс загрузки снова. На этом этапе временный файл, т.е. %@.download
, удаляется, и этот частично загруженный файл помещается в путь назначения.