Как загрузить файл с помощью Siesta Framework в Swift?

Вопрос довольно прост:
Мне нужно загрузить ZIP-файл на сервер. Как мне это сделать в Swift с использованием Siesta Framework?

Спасибо.

2 ответа

Решение

Согласно странице GitHub Siesta, в настоящее время он не поддерживает задачи загрузки / выгрузки файлов. Смотрите эту сравнительную таблицу:

сравнительная таблица

На самом деле приведенный выше ответ не совсем верен. Поскольку Siesta уже давно поддерживает запрос POST, вы можете загружать файлы (Content-Type: multipart/form-data) в классе YourAPI следующим образом (например, для загрузки файлов PNG или JPEG):

class YourAPI {

static let sharedInstance = YourAPI()

private let service = Service(baseURL: "http://your_server/rest/service", standardTransformers: [.text, .image])

private init() {
    // your init code
}

public enum ImageType {
    case png
    case jpeg
}

func generateBoundaryString() -> String {
    return "Boundary-\(UUID().uuidString)"
}

func constructHttpBodyForImageUpload(withBoundary boundary: String, imageData: Data, fileName: String, imageType: ImageType) -> Data {

    let body = NSMutableData()

    var mimetype = "image/png" // default
    if imageType == .jpeg {
        mimetype = "image/jpeg"
    }

    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"file\"; filename=\"\(fileName)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(imageData)
    body.append("\r\n".data(using: String.Encoding.utf8)!)

    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)

    return body as Data
}

@discardableResult func uploadImage(_ imageData: Data, fileName: String, imageType: ImageType, onSuccess: @escaping () -> Void, onFailure: @escaping (String) -> Void) -> Request {

    let boundary = generateBoundaryString()

    let request = service.resource("/files/upload").request(.post) {
        // See comments in Siesta Resource.swift class for .post
        $0.httpBody = self.constructHttpBodyForImageUpload(withBoundary: boundary, imageData: imageData, fileName: fileName, imageType: imageType)
        $0.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    }

    // My Server returns me JSON back
    request.onSuccess { entity in
        guard let json: [String: String] = entity.typedContent() else {
            onFailure("JSON parsing error")
            return
        }
        guard let status = json["status"] else {
            onFailure("Responce status is missing")
            return
        }
        print("status = \(status)")
    }.onFailure { (error) in
        onFailure(error.userMessage)
    }

    return request
}

} // YourAPI

Чтобы использовать его (из вашего ViewController):

@IBAction func uploadImage(_ sender: AnyObject) {

    guard let image = self.imageView.image else {
        return
    }

    guard let imageData = UIImagePNGRepresentation(image) else {
        return
    }

    var fileName = self.fileName.text!
    if fileName.isEmpty {
        fileName = UUID().uuidString + ".png"
    }

    print("fileName = \(fileName)")

    YourAPI.sharedInstance.uploadImage(imageData, fileName: fileName, imageType: .png, onSuccess: {
        print("success")
    }, onFailure: { error in
        print(error)
    })
}

Кроме того, через несколько дней на guthub проекта Siesta поступил запрос на извлечение: удобный метод для запросов multipart / form-data, который вскоре может стать стандартной частью фреймворка и может уменьшить размер вышеприведенного стандартного кода.

Другие вопросы по тегам