Отправить 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];
}];
Ответы
Ответ 1
Для пути 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];
Ответ 2
Попробуйте этот код.
GCDWebServer* webServer = [[GCDWebServer alloc] init];
[webServer addGETHandlerForBasePath:@"/" directoryPath:[[NSBundle mainBundle] bundlePath] indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[webServer runWithPort:8080];
Ответ 3
Похоже, что никто не отвечает на реальный вопрос здесь: речь идет не о загрузке фотографии с 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];
Это не очень хорошее решение, поскольку оно требует копирования фотографий из библиотеки ресурсов в папку документов, что является расточительным. Вместо этого рассмотрите возможность динамического обслуживания фотоисточников, как я объясню в своем ответе на соответствующий вопрос здесь: fooobar.com/questions/383003/....
Ответ 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
}
}