14

Moja aplikacja używająca GCDWebServer Dostaję zdjęcie z albumu iPhone'a za pomocą AssetsLibrary i zapisuję je w NSDocumentDirectory. Chcę uzyskać URL dostępu do tego zdjęcia, aby pokazać je na stronie internetowej.Wysyłaj UIImage do LocalwebServer za pomocą GCDWebServer

Jest to mój kod:

[_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]; 

         }]; 
+0

Witam, czy można znaleźć jakieś rozwiązanie dla tej niej.? – Hasnain

Odpowiedz

3

Na ścieżce 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]; 

pakietowych zasobu

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

Spróbuj tego kodu.

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

Wygląda na to nikt nie odpowiada rzeczywistej pytanie tutaj: tu nie chodzi o przesyłając zdjęcie z iOS do serwera WWW lub oglądania go w lokalnym UIWebView, ale o obsługujących tę fotografię przy użyciu GCDWebServer, dzięki czemu użytkownicy mogą oglądać poprzez podłączenie do urządzenia za pomocą przeglądarki internetowej np przechodząc do http://my-device.local/photo-1234.jpg.

Przykładowy kod, który podałeś ma 2 główne zagadnienia:

  • Ty tworzysz obsługi dla POST wniosków natomiast trzeba obsłużyć GET żądań (POST jest przy składaniu form z przeglądarek internetowych, a GET jest regularna przeglądanie stron internetowych i uzyskiwanie stron internetowych).
  • Zamiast zwracać dane obrazu, zwracasz stronę HTML, która zawiera adres URL pliku obrazu lokalnie (np. file:///some/path/photo-1234.jpg) zamiast adresu URL HTTP obsługiwanego przez GCDWebServer (np. http://my-device.local/photo-1234.jpg). Adresy URL plików nie mają sensu poza samym urządzeniem i nie będą działać.

Jeśli masz wszystkie zdjęcia jako pliki w folderze Dokumenty, można po prostu dodać GET obsługi do GCDWebServer służyć zawartość całego folderu Dokumenty:

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

To nie jest bardzo dobre rozwiązanie, ponieważ wymaga kopiowania zdjęć z biblioteki zasobów do folderu dokumentów, co jest marnotrawstwem. Zamiast tego zastanów się nad dynamiczną obsługą zasobów zdjęć, co wyjaśnię w mojej odpowiedzi na pokrewne pytanie tutaj: https://stackoverflow.com/a/31778726/463432.

+0

Ładne wyjaśnienie! – ViruMax

+0

Jak wygenerować publiczny adres IP URL? Mam do czynienia z jednym problemem tutaj, mam przechowywać plik wideo export.mov w dokumentach (iOS). Dostaję podstawowy adres serwera za pomocą serwera webServer.serverURL, który wskazuje katalog dokumentów. Ale to daje mi adres URL z wewnętrznym adresem IP, np. http://192.168.1.129:8080/export.mov, który działa z poziomu lokalnej przeglądarki maszynowej, jednak nie działa w przeglądarkach innych maszyn, które są również podłączone w tej samej sieci. – ViruMax

+0

@ViruMax To jest problem sieciowy, a nie GCDWebServer. Może port 8080 jest zablokowany w twojej sieci? – Pol

0

Możesz utworzyć jedno zlecenie GET, które zwróci wszystkie niestandardowe adresy URL zasobów zdjęć.

Następnie utwórz jedną obsługę niestandardowych adresów URL, które zwrócą żądane dane obrazu URL.

w niestandardowej obsługi URL skorzystać z poniższego kodu

//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 
    } 
} 
Powiązane problemy