Загрузка картинки/изображения в Vapor 4 из iOS приложения, написанного на SwiftUI

Ребят, привет!

Никак не могу написать нормальный код для загрузки изображений.

Нужно сделать так: из приложения iOS (SwiftUI) отправляется запрос в бэкенд, написанный в Vapor, далее в бэкенде проверяется формат файла, и если ОК — загружаю картинку в папку.

Что написано на клиенте:

func addImage(_ image: UIImage) async throws {
    guard let url = URL(string: "\(url)/add-image"),
          let imageData = image.jpegData(compressionQuality: 1)
    else {
        throw URLError(.badURL)
    }
    
    // Вероятнее всего, в filename обрезается формат
    let profileImage = ProfileImage(filename: "profile_id", data: imageData)
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    do {
        request.httpBody = try JSONEncoder().encode(profileImage)
        let (_, _) = try await URLSession.shared.data(for: request)
    } catch {
        throw error
    }
}

Написано в Vapor:

func addImage(req: Request) async throws -> HTTPStatus {
    let img = try req.content.decode(File.self)
    
    if !["png", "jpeg", "jpg", "heic"].contains(img.extension?.lowercased()) {
        throw Abort(.badRequest, reason: "Extension is not acceptable")
    }
    
    let path = req.application.directory.workingDirectory + "Public/Images/Profiles/"
    let fileName = try profile.requireID().uuidString + "." + (img.extension ?? "jpg")
    try await req.fileio.writeFile(img.data, at: path + fileName)
    return .ok
}

По логике это ± написанные…

Помогите, пожалуйста, собрать два метода: один для клиента (iOS), а другой для бэкенда.

Возможно, есть какой-то док/библиотеки по загрузке файлов.


Ответы (0 шт):