Отправить 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];

                      }];

person Community    schedule 03.02.2015    source источник
comment
Привет, ты нашел какое-нибудь решение для этого?   -  person Hasnain    schedule 17.04.2015


Ответы (4)


Для пути 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];
person aahsanali    schedule 17.04.2015
comment
вышеприведенный метод загрузки изображения из каталога документов работает только в симуляторе, а не в реальном устройстве :( - person Harish Pathak; 27.06.2018

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

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

Похоже, что здесь никто не отвечает на настоящий вопрос: речь идет не о загрузке фотографии с 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];

Однако это не очень хорошее решение, так как оно требует копирования фотографий из библиотеки ресурсов в папку документов, что расточительно. Вместо этого рассмотрите возможность динамического обслуживания фоторесурсов, как я объясняю в своем ответе на соответствующий вопрос здесь: https://stackoverflow.com/a/31778726/463432.

person Pol    schedule 03.08.2015
comment
Хорошее объяснение! - person ViruMax; 04.01.2017
comment
Как сгенерировать URL общедоступного IP-адреса? Я столкнулся с одной проблемой: я сохранил видео export.mov в каталоге документов (iOS). Я получаю базовый URL-адрес сервера, используя webServer.serverURL, который указывает на каталог документов. Но это дает мне URL-адрес с внутренним IP-адресом, например, например. 192.168.1.129:8080/export.mov , который работает из браузера локального компьютера, но не работать в браузерах других машин, которые также подключены к той же сети. - person ViruMax; 04.01.2017
comment
@ViruMax Это проблема с сетью, а не с GCDWebServer. Может в вашей сети заблокирован порт 8080? - person Pol; 04.01.2017
comment
@ViruMax - не могли бы поделиться фрагментом кода, как указано выше, вы смогли разместить видео? - person sia; 21.05.2019

Вы можете создать один запрос 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
    }
}
person Nikhlesh Bagdiya    schedule 09.07.2017