14

Meine App mit GCDWebServer Ich bekomme ein Foto von meinem iPhone-Album mit AssetsLibrary und ich speichern sie in NSDocumentDirectory. Ich möchte nur auf dieses Foto zugreifen, um sie auf einer Webseite anzuzeigen.Send UIImage an LocalwebServer mit GCDWebServer

Es ist mein Code:

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

Hallo, Sie eine Lösung für diese es gefunden hat.? – Hasnain

Antwort

3

Für DocumentDirectory Weg

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

für gebündelte Ressource

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

diesen Code Versuchen.

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

Sehen aus wie niemand hier die eigentliche Frage zu beantworten: Dies ist ein Foto von iOS auf einen Web-Server oder sehen sie in einem lokalen UIWebView Hochladen nicht über, sondern um das Foto dient GCDWebServer mit, so dass Benutzer anzeigen können, es durch den Anschluss an das Gerät mit einem Web-Browser z indem Sie zu http://my-device.local/photo-1234.jpg gehen.

Der Beispielcode Sie zur Verfügung gestellt hat zwei wichtige Fragen:

  • Sie einen Handler für POST Anfragen zu schaffen, während Sie GET Anfragen bearbeiten müssen (POST ist, wenn Formulare von Web-Browsern einreichen, während GET für regulär Surfen im Internet und Erhalten von Webseiten).
  • Anstatt die Bilddaten zurückzugeben, geben Sie eine HTML-Webseite zurück, die eine URL zu der Bilddatei lokal (z. B. file:///some/path/photo-1234.jpg) anstelle der HTTP-URL enthält, die von GCDWebServer behandelt wird (z. B. http://my-device.local/photo-1234.jpg). Datei-URLs sind außerhalb des Geräts nicht sinnvoll und funktionieren nicht.

Wenn Sie alle Fotos als Dateien in Ihren Dokumenten-Ordner haben, können Sie einfach einen GET Handler GCDWebServer fügen Sie den Inhalt des gesamten Dokumentenordner zu dienen:

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

Dies ist keine sehr eine gute Lösung, da das Kopieren von Fotos aus der Objektbibliothek in den Dokumentenordner erforderlich ist, was eine Verschwendung darstellt. Erwägen Sie stattdessen, die Fotoassets dynamisch bereitzustellen, wie ich in meiner Antwort auf eine verwandte Frage hier erläutere: https://stackoverflow.com/a/31778726/463432.

+0

Schöne Erklärung! – ViruMax

+0

Wie generiere ich eine öffentliche IP-Adresse? Ich stehe hier vor einem Problem, ich habe export.mov Video in Dokumenten (iOS) Verzeichnis gespeichert. Ich erhalte die Server-Basis-URL mit webServer.serverURL, die auf das Dokumentenverzeichnis verweist. Aber das gibt mir URL mit interner IP-Adresse wie zB. http://192.168.1.129:8080/export.mov, das vom lokalen Maschinenbrowser funktioniert, funktioniert jedoch nicht in den Browsern anderer Computer, die ebenfalls im selben Netzwerk verbunden sind. – ViruMax

+0

@ViruMax Das ist ein Netzwerkproblem, kein GCDWebServer. Vielleicht ist Port 8080 in Ihrem Netzwerk blockiert? – Pol

0

Sie können eine GET Anfrage erstellen, die alle benutzerdefinierten URLs der Fotoassets zurückgibt.

Erstellen Sie danach einen Handler dieser benutzerdefinierten URLs, der angeforderte URL-Image-Daten zurückgibt.

In einem benutzerdefinierten URL-Handler Code unten verwenden

//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 
    } 
}