Uploading an STL file with Alamofire to Octoprint through API

I have been stuck trying to create a function to upload a file (STL) to Octoprint API using Alamofire in a swift iOS app. All my other API functions are working nicely so I am assuming my trouble with the upload is related to the multipart data required. I keep getting a 403 error.

My current code:

func uploadFile(printer: Printers, localFileURL: URL, completion: @escaping (JSON) -> ()) {

        let url = printer._ipaddress! + "api/files/local"
        let key = printer._apikey!
        let boundary = "Boundary-\(UUID().uuidString)"
        let contentType = "multipart/form-data"
        let fileData = try! String(contentsOf: localFileURL).data(using: String.Encoding.utf8, allowLossyConversion: false)

        Alamofire.upload(
            multipartFormData: { (multipart) in
                multipart.boundary = boundary
                multipart.contentType = contentType
                multipart.append(key.data(using: String.Encoding.utf8, allowLossyConversion: false)!, withName: "X-Api-Key")
                multipart.append(fileData!, withName: "file", fileName: localFileURL.lastPathComponent, mimeType: "application/octet-stream")
        },
            to: url,
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .success(let upload, _, _):
                    upload.responseJSON { response in
                        debugPrint(response)
                    }
                case .failure(let encodingError):
                    print(encodingError)
                }
        }
        )
    }

Error message:

responseValidationFailed(reason: Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(code: 403))
2019-08-22 18:34:51.120426-0400 iOSApp[32279:979456] [] nw_socket_handle_socket_event [C9:2] Socket SO_ERROR [54: Connection reset by peer]
[Request]: POST http://192.168.2.14/api/files/local
[Response]: <NSHTTPURLResponse: 0x600001f28fe0> { URL: http://192.168.2.14/api/files/local } { Status Code: 400, Headers {
    "Content-Length" =     (
        73
    );
    "Content-Type" =     (
        "text/html; charset=UTF-8"
    );
    Date =     (
        "Thu, 22 Aug 2019 22:34:51 GMT"
    );
    "X-Robots-Tag" =     (
        "noindex, nofollow, noimageindex"
    );
} }
[Data]: 73 bytes
[Result]: FAILURE: responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))
[Timeline]: Timeline: { "Request Start Time": 588206091.090, "Initial Response Time": 588206091.092, "Request Completed Time": 588206091.125, "Serialization Completed Time": 588206091.125, "Latency": 0.002 secs, "Request Duration": 0.035 secs, "Serialization Duration": 0.000 secs, "Total Duration": 0.035 secs }

Hi @Maddison556!
What OctoPrint version you are working with?
Keep in mind that since 1.3.11 the Cura engine is no more part of OctoPrint and STL files are no more be recognized. -> CuraEngine Legacy

1 Like