将 jpg、jpeg、png、heic 格式的图像上传到 Vapor 4。从用 SwiftUI 编写的 iOS 应用程序发送文件

问题描述 投票:0回答:1

我无法以任何方式编写上传图片的代码。

需要这样做:从iOS应用程序(SwiftUI)向后端发送请求,然后在后端检查文件格式(jpg、jpeg、png、heic),如果可以,我将图像上传到文件夹。


这是Vapor中的代码:

func addImage(req: Request) async throws -> HTTPStatus {
    let user = try await getUserByToken(req: req)
    guard let profile = try await Profile.query(on: req.db)
            .filter(\.$user.$id == user.requireID())
            .first()
    else {
        throw Abort(.badRequest, reason: "Profile not found")
    }
    
    let img = try req.content.decode(File.self)
    let path = req.application.directory.publicDirectory + "/images/profiles/"
    let fileName = try profile.requireID().uuidString + "." + (img.extension ?? "jpg")
    try await req.fileio.writeFile(img.data, at: path + fileName)
    return .ok
}

这是iOS中的代码:

func addImage(_ image: UIImage) async throws {
    guard let url = URL(string: "\(url)/add-image"),
          let imageData = image.jpegData(compressionQuality: 1)
    else {
        throw URLError(.badURL)
    }
    
    let profileImage = ProfileImage(filename: "filename.jpg", data: imageData)
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("Bearer \(tokenManager.getToken())", forHTTPHeaderField: "Authorization")
    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
    }
}

此代码仅下载 jpg 文件。我到底如何确定文件格式?

请帮我写两个方法:一个用于客户端(iOS),另一个用于服务器(Vapor)。

也许有一些用于处理文件格式的文档/库。

附注抱歉英语不好,不是我的母语:)

swift swiftui vapor
1个回答
0
投票

通过 HTTP 发送文件

将二进制文件(如图像)发送到服务器时,您应该在上传时使用

Content-Type
标头。

常见

Content-Type
包括:

  • 图像/gif
  • 图像/jpeg
  • 图片/png
  • 图像/svg+xml
  • 图像/heif

验证

服务器端确认文件类型时,必须读取数据。我已经确认 @zdaecq 的 answer 使用

import Vapor
(而不是
Foundation
)工作。

© www.soinside.com 2019 - 2024. All rights reserved.