Отправить UIImage в LocalwebServer с помощью GCDWebServer

Мое приложение, использующее GCDWebServer Я получаю фотографию из своего iPhone-альбома с помощью AssetsLibrary, и я храню их в NSDocumentDirectory. Я просто хочу получить доступ к Url на эту фотографию, чтобы показать их на веб-странице.

Есть мой код:

[_webServer addHandlerForMethod:@"POST"
                              path:@"/"
                      requestClass:[GCDWebServerURLEncodedFormRequest class]
                      processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {

                          ALAsset *asset = [self.arrayPictures objectAtIndex:0];
                          ALAssetRepresentation *rep = [asset defaultRepresentation];
                          CGImageRef iref = [rep fullResolutionImage];
                          UIImage *thumbnail = [UIImage imageWithCGImage:iref];
                          NSString* path ;
                          if (thumbnail != nil)
                          {
                              NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                              NSString *documentsDirectory = [paths objectAtIndex:0];
                               path =  [[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"test.png"]];
                              NSData* data = UIImagePNGRepresentation(thumbnail);
                              [data writeToFile:path atomically:YES];
                          }

                          NSURL *url = [NSURL fileURLWithPath:path];
                          NSString* html = [NSString stringWithFormat:@"<html><body><img src=\"%@\" width=\"400\" height=\"500\"/></body></html>", url];
                          return [GCDWebServerDataResponse responseWithHTML:html];

                      }];

Ответы

Ответ 1

Для пути DocumentDirectory

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath = [[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"test.jpg"]];
NSURL *baseURL2 = [NSURL fileURLWithPath:documentsDirectory];
NSString* html2 = [NSString stringWithFormat:@"<html><body><img src=\"%@\" width=\"400\" height=\"500\"/></body></html>", imagePath];

[_webView loadHTMLString:html2 baseURL:baseURL2];

Для связанного ресурса

NSString *path = [[NSBundle mainBundle] pathForResource:@"ahsan" ofType:@"jpg"]; // path to your image source.

NSURL *baseURL = [NSURL fileURLWithPath:path];

NSString* html = [NSString stringWithFormat:@"<html><body><img src=\"%@\" width=\"400\" height=\"500\"/></body></html>", path];

Ответ 2

Попробуйте этот код.

GCDWebServer* webServer = [[GCDWebServer alloc] init];
[webServer addGETHandlerForBasePath:@"/" directoryPath:[[NSBundle mainBundle] bundlePath] indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[webServer runWithPort:8080];

Ответ 3

Похоже, что никто не отвечает на реальный вопрос здесь: речь идет не о загрузке фотографии с iOS на веб-сервере или ее просмотре в локальном UIWebView, а об обслуживании этой фотографии с помощью GCDWebServer, чтобы пользователи могли ее просматривать подключение к устройству с помощью веб-браузера, например перейдя к http://my-device.local/photo-1234.jpg.

Пример кода, который вы предоставили, имеет две основные проблемы:

  • Вы создаете обработчик для запросов POST, пока вам нужно обрабатывать запросы GET (POST - это отправка форм из веб-браузеров, а GET - для обычного просмотра веб-страниц и получения веб-страниц).
  • Вместо того, чтобы возвращать данные изображения, вы возвращаете HTML-страницу, которая содержит URL-адрес файла изображения локально (например, file:///some/path/photo-1234.jpg) вместо URL-адреса HTTP, обрабатываемого GCDWebServer (например, http://my-device.local/photo-1234.jpg). URL-адреса файлов не имеют смысла вне самого устройства и не будут работать.

Если у вас есть все фотографии в виде файлов в папке с документами, вы можете просто добавить обработчик GET в GCDWebServer для обслуживания содержимого всей папки документов:

[webServer addGETHandlerForBasePath:@"/"
                      directoryPath:<PATH_TO_DOCUMENTS_DIRECTORY>
                      indexFilename:nil
                           cacheAge:3600
                 allowRangeRequests:YES];

Это не очень хорошее решение, поскольку оно требует копирования фотографий из библиотеки ресурсов в папку документов, что является расточительным. Вместо этого рассмотрите возможность динамического обслуживания фотоисточников, как я объясню в своем ответе на соответствующий вопрос здесь: fooobar.com/questions/383003/....

Ответ 4

Вы можете создать один запрос GET, который вернет все пользовательские URL-адреса фотоактивных ресурсов.

После этого создайте один обработчик этих настраиваемых URL-адресов, которые возвратят требуемые данные изображения URL-адреса.

В пользовательском обработчике URL-адреса используйте код

//Get PHAsset image name with extionsion.
let filename = NSURL(string: (asset as! PHAsset).originalFilename!)

// Retrive image data from PHAsset object
PHImageManager.default().requestImageData(for: asset as! PHAsset, options: nil, resultHandler: { (imageData, str, nil, info) in

    //Check imageData is nil or not.
    if (imageData) {

        //Return image Data with contentType
        let imageDatas = UIImagePNGRepresentation(imageData)

        completionBlock!(GCDWebServerDataResponse(data: imageDatas, contentType: "image/\((filename?.pathExtension)!)"))
    } else {

        // Image retrive error message return.
        let jsonResponse = ["type":"failed","Message":"Image not avilable."] as [String : Any]
        completionBlock!(GCDWebServerDataResponse(jsonObject: jsonResponse))
    }
})

// MARK:- Get File name from PHAsset.
extension PHAsset {

    var originalFilename: String? {

        var fname:String?

        if #available(iOS 9.0, *) {
            let resources = PHAssetResource.assetResources(for: self)
            if let resource = resources.first {
                fname = resource.originalFilename
            }
        }

        if fname == nil {
            // this is an undocumented workaround that works as of iOS 9.1
            fname = self.value(forKey: "filename") as? String
        }

        return fname
    }
}