ASIHTTPRequest и ASIWebPageRequest при загрузке локального файла HTML ошибка - PullRequest
4 голосов
/ 01 июня 2011

Я пытаюсь использовать ASIWebPageRequest для загрузки локального HTML-файла, чтобы я мог использовать встроенное кэширование в ASIWebPageRequest.Я знаю, что это может звучать немного бессмысленно, однако я хочу использовать удаленные изображения в моих локальных файлах, которые обновляются только раз в неделю или около того.Если это имеет смысл.

Вот что я делаю в коде:

//OUTPUT: file:///Users/ledixonuk/Library/Application%20Support/iPhone%20Simulator/4.3.2/Applications/FDF21331-CC80-4ECB-9A33-16AEC073D117/Documents/ItemOne.html
NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:[FileSystemHelper dataFilePathInDocuments:@"ItemOne.html"]];

// Assume request is a property of our controller
// First, we'll cancel any in-progress page load
[[self webRequest] setDelegate:nil];
[[self webRequest] cancel];

[self setWebRequest:[ASIWebPageRequest requestWithURL:fileUrl]];
[[self webRequest] setDelegate:self];
[[self webRequest] setDidFailSelector:@selector(webPageFailed:)];
[[self webRequest] setDidFinishSelector:@selector(webPageFinished:)];

// Tell the request to replace urls in this page with local urls
//[[self webRequest] setUrlReplacementMode:ASIReplaceExternalResourcesWithLocalURLs];

// Tell the request to embed external resources directly in the page
[[self webRequest] setUrlReplacementMode:ASIReplaceExternalResourcesWithData];

// It is strongly recommended you use a download cache with ASIWebPageRequest
// When using a cache, external resources are automatically stored in the cache
// and can be pulled from the cache on subsequent page loads
[[self webRequest] setDownloadCache:[ASIDownloadCache sharedCache]];

// Ask the download cache for a place to store the cached data
// This is the most efficient way for an ASIWebPageRequest to store a web page
[[self webRequest] setDownloadDestinationPath:[[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:[self webRequest]]];

[[self webRequest] startAsynchronous];

И вот ошибка, которую я получаю:

404Не найдено

Не найдено

Запрошенный URL / Пользователи / ledixonuk / Библиотека / Поддержка приложений / iPhone Simulator / 4.3.2 / Приложения / FDF21331-CC80-4ECB-9A33-16AEC073D117 / Documents /ItemOne.html> не был найден на этом сервере.

Очевидно, что ASIWebPageRequest не может найти файл ItemOne.html в папке документа приложения, однако я дважды проверил ифайл определенно там.

У кого-нибудь еще была похожая проблема с этим?Это сводит меня с ума, пытаясь разобраться!

Ответы [ 2 ]

1 голос
/ 02 июня 2011

ASIWebPageRequest является подклассом ASIHTTPRequest, и, к сожалению, ASIHTTPRequest не поддерживает выборку файла: URL-адреса - только http и https.

В основном у вас есть весь необходимый код, вам просто нужно найти способчтобы соединить это вместе.Вы можете создать подкласс ASIHTTPRequest, который может загружать файл: URL-адреса (по сути, предоставляют собственную реализацию startAsyncronous, которая вместо этого просто вызывает делегатов после настройки правильных файлов данных), или создать подкласс ASIWebPageRequest, который это делает.Я еще не думал об этом подробно, поэтому понятия не имею, какой путь будет наилучшим.

(я думаю, что вы видите страницу 404, поскольку ASIHTTPRequest удается связаться с веб-сервером где-то - возможно, этопытается извлечь из http://127.0.0.1/Users/ledixonuk/Library/....)

0 голосов
/ 28 сентября 2012

См. Ниже простую реализацию, которую я добавил в свой подкласс ASIHTTPRequest для поддержки URL на основе file: //.Он ни в коем случае не завершен и, возможно, пропускает некоторые свойства, которые должны быть установлены, и не вызовет всех делегатов, но для моих собственных целей этого было достаточно.

- (void)startRequest
{        
    if ([url isFileURL])
    {
        // ASIHTTPRequest does not support handling file:// URLs, this is my own simple implementation here

        if ([self isCancelled]) {
            return;
        }

        [self performSelectorOnMainThread:@selector(requestStarted) withObject:nil waitUntilDone:[NSThread isMainThread]];

        NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease];
        NSString *filePath = [url path];
        BOOL isDirectory = NO;

        if ([fileManager fileExistsAtPath:filePath isDirectory:&isDirectory] && !isDirectory)
        {
            responseStatusCode = 200;
            [self setRawResponseData:[NSData dataWithContentsOfFile:filePath]];
            [self setContentLength:rawResponseData.length];
            [self setTotalBytesRead:[self contentLength]];
        }
        else
        {
            responseStatusCode = 404;
            [self setContentLength:0];
            [self setError:[NSError errorWithDomain:NetworkRequestErrorDomain code:ASIFileManagementError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Cannot open file at path '%@'",filePath],NSLocalizedDescriptionKey,error,NSUnderlyingErrorKey,nil]]];
        }

        complete = YES;
        downloadComplete = YES;

        [self requestFinished];
        [self markAsFinished];
    }
    else
    {
        // let the original implementation deal with all the other URLs
        [super startRequest];
    }
}
...