Получение пути к изображению для post-запроса API — Swift, iOS

#ios #swift #api #rest #webapi

#iOS #swift #API #rest #webapi

Вопрос:

Я использую post-запрос API для получения измененного изображения.

 curl 
    -F 'image=@/path/to/your/file.jpg' 
    -H 'api-key:[myKey]' 
    [api url]
 

Он отлично работал непосредственно на терминале моего Mac, используя:

 curl 
    -F 'image=@/Users/user/image.jpg' 
    -H 'api-key:[myKey]' 
    [api url]
 

Пытаясь использовать его в приложении для iOS, я изо всех сил пытаюсь получить путь к изображению.

API работает с Alamofire, используя другой параметр, который использует URL-адрес изображения. Поэтому я подумал загрузить изображение на сервер и использовать этот URL-адрес, но было бы намного лучше, если бы я мог напрямую использовать параметр path.

Это то, что я пробовал, но это не работает.

 func imagePath(_ image: UIImage, handler: @escaping (String?) -> Void ) {

    let path = NSTemporaryDirectory()
        .appending(UUID().uuidString)
        .appending("png")
    
    let url = URL(fileURLWithPath: path)
    
    let data = image.pngData()
    
    let urlForApi = "@"   path
    
    do {
        
        try data?.write(to: url)
        
        //  Just to check if write above works, it always works fine
        let postData = try UIImage(data: Data(contentsOf: url))
        
        handler (urlForApi)
        
    } catch {
        
        handler (nil)
        
    }
        
}
 

Он возвращает обработчик (urlForApi), но запрос выдает ошибку. Я не получаю правильный путь для запроса.

Комментарии:

1. Прежде всего let urlForApi = "@" path <— это не требуется, обозначение «@» является синтаксисом, специфичным для CURL. Во-вторых: /Users/user/ абсолютный путь сильно отличается от NSTemporaryDirectory()

Ответ №1:

Я мог бы решить эту проблему, используя запрос на загрузку Alamofire.

 
func getPostURL(`fromImage` preImage: UIImage?, postImageURL: @escaping (_ outputImageURL: String) -> (), error: @escaping (_ error: Error?) -> ()) {
        
        if let safeImage = preImage {
            
            let data = safeImage.pngData()!
            
            AF.upload(multipartFormData: { (form) in
                form.append(data, withName: "image", fileName: "image.png", mimeType: "image/png")
            }, to: apiURL!, headers: headers).validate(statusCode: okStatusCodes).responseDecodable(of: ImageResponse.self) {
                
                response in
                
                if let url = response.value?.output_url {
                    postImageURL(url)
                } else {
                    error(response.error)
                }
                
            }
            
        } else {
            error(ImageDataError.gettingPostURL)
        }
        
        
    }

 

Однако было бы интересно узнать, как получить временные пути к файлам.