14

我的应用程序使用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];

                      }];
4

4 回答 4

5

对于 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];
于 2015-04-17T09:38:41.043 回答
4

试试这个代码。

GCDWebServer* webServer = [[GCDWebServer alloc] init];
[webServer addGETHandlerForBasePath:@"/" directoryPath:[[NSBundle mainBundle] bundlePath] indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[webServer runWithPort:8080];
于 2015-04-17T10:09:22.130 回答
2

看起来没有人在这里回答实际问题:这不是关于将照片从 iOS 上传到 Web 服务器或在本地 UIWebView 中查看它,而是关于使用提供该照片GCDWebServer以便用户可以通过使用连接到设备来查看它Web 浏览器,例如通过转到http://my-device.local/photo-1234.jpg.

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

  • POST当您需要处理请求时,您正在为请求创建一个处理程序GETPOST从 Web 浏览器提交表单时,而GET用于常规 Web 浏览和获取网页时)。
  • 不是返回图像数据,而是返回一个 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 。

于 2015-08-03T02:51:44.880 回答
1

您可以创建一个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
    }
}
于 2017-07-09T13:14:45.160 回答