【问题标题】:Send UIImage to LocalwebServer using GCDWebServer使用 GCDWebServer 将 UIImage 发送到 LocalwebServer
【发布时间】:2015-04-02 22:30:39
【问题描述】:

我的应用程序使用GCDWebServer 我使用AssetsLibrary 从我的iPhone 相册中获取一张照片,并将它们存储在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];

                      }];

【问题讨论】:

  • 嗨,你找到解决办法了吗?

标签: ios objective-c nsdocumentdirectory assetslibrary gcdwebserver


【解决方案1】:

对于文档目录路径

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 上传到 Web 服务器或在本地 UIWebView 中查看它,而是关于使用 GCDWebServer 提供该照片以便用户可以通过以下方式查看它使用网络浏览器连接到设备,例如转至http://my-device.local/photo-1234.jpg

    您提供的示例代码有两个主要问题:

    • 您正在为POST 请求创建处理程序,而您需要处理GET 请求(POST 用于从网络浏览器提交表单,而GET 用于常规网络浏览和获取网页)。
    • 您返回的不是返回图像数据,而是返回一个 HTML 网页,其中包含本地图像文件的 URL(例如 file:///some/path/photo-1234.jpg),而不是 GCDWebServer 处理的 HTTP URL(例如 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

    【讨论】:

    • 很好的解释!
    • 如何生成公网IP地址URL?我在这里面临一个问题,我已将 export.mov 视频存储在文档(iOS)目录中。我使用指向文档目录的 webServer.serverURL 获取服务器基本 URL。但这给了我带有内部 IP 地址的 URL,例如。 192.168.1.129:8080/export.mov ,在本地机器浏览器上工作,但在同样连接在同一网络中的其他机器浏览器中不起作用。
    • @ViruMax 这是一个网络问题,而不是 GCDWebServer 问题。也许您的网络上的 8080 端口被阻止了?
    • @ViruMax - 可以共享代码 sn-p 如上所述,您可以托管视频吗?
    【解决方案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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多