# Multipart sample for swift ## Example 1 ```swift= func uploadFileToServiceCloud(caseId: String, replyRecordId: String, attachedData: Data, completion: cloudAPIResponse) { if !checkNetworkReachability() { completion?(false, "NetworkErr") return } let typeApi = ServiceCloudAPI() var urlStr = HttpProtocal.HTTP.rawValue urlStr += typeApi.getCPFileSite() urlStr += typeApi.getApiType(TypeOfServiceCloudAPI: .UploadFileToCase) let webUrl = URL(string: urlStr) var request = URLRequest(url: webUrl!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30) request.addValue(ServiceCloudAPI.token, forHTTPHeaderField: "Authorization") request.httpMethod = HttpRequestType.POST.rawValue // Create httpBody var body = Data() let bodyBoundary = "----\(UUID().uuidString)" body.append(Data("--\(bodyBoundary)\r\n".utf8)) body.append(Data("Content-Disposition:form-data; name=\"file\";\r\n".utf8)) body.append(Data("filename=\"Logs.zip\"\r\n".utf8)) body.append(Data("Content-Type: application/zip\r\n\r\n".utf8)) body.append(attachedData) body.append(Data("\r\n".utf8)) body.append(Data("--\(bodyBoundary)--\r\n".utf8)) body.append(Data("Content-Disposition:form-data; name=caseId\r\n".utf8)) body.append(Data("\(caseId)\r\n".utf8)) body.append(Data("--\(bodyBoundary)--\r\n".utf8)) body.append(Data("Content-Disposition:form-data; name=replyRecordId\r\n".utf8)) body.append(Data("\(replyRecordId)\r\n".utf8)) body.append(Data("--\(bodyBoundary)--\r\n".utf8)) request.httpBody = body // Addtional header let manualHeader: [String: String] = [ "Content-Type": "multipart/form-data; boundary=\(bodyBoundary)" ] request.allHTTPHeaderFields = manualHeader let config = URLSessionConfiguration.default let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) let dataTask = session.dataTask(with: request, completionHandler: { (data, response, error) in guard error == nil else { QnapLogger.i("URL request error: \(String(describing: error))") completion?(false, error as? String) return } let urlres = response as! HTTPURLResponse guard urlres.statusCode == 200 else { let retData = self.handleURLErrCode(apiName: CloudAPIFuncName.uploadFileToServiceCloud, urlRequestCode: urlres.statusCode, returnData: data) completion?(false, retData) return } guard let retData = data, let result = try? JSONSerialization.jsonObject(with: retData, options: []) as? [String: String] else { completion?(false, "No data receive") return } guard result["result"] == "Success" else { completion?(false, result) return } completion?(true, result["url"]) }) dataTask.resume() session.finishTasksAndInvalidate() } ``` ## Example 2 ```swift= func updateAvatars(aImage:UIImage?, completion: cloudAPIResponse) { if !checkNetworkReachability() { completion?(false, "NetworkErr") return } // Check token guard let _loginData = loginData, _loginData.access_token != nil, let _bindResult = bindResult, _bindResult.token != nil else { completion?(false, "Missing access token or device token") return } // Produce URL let typeApi = QcloudAPI(devId: _bindResult.device_id, linkedDevId: nil, itemId: nil) var urlStr = HttpProtocal.HTTPS.rawValue urlStr += typeApi.getSite(siteType: "DeviceAPI") urlStr += typeApi.getApiType(typeAPI: .UpdateOrUploadDeviceAvatar) let webUrl = URL(string: urlStr) // Create httpBody var body = Data() let bodyBoundary = "----\(UUID().uuidString)" body.append(Data("--\(bodyBoundary)\r\n".utf8)) body.append(Data("Content-Disposition:form-data; name=\"avatar_file\";".utf8)) body.append(Data("filename=\"avatar.jpeg\"\r\n".utf8)) body.append(Data("Content-Type: image/jpeg\r\n\r\n".utf8)) body.append(aImage!.jpegData(compressionQuality: 0.8)!) body.append(Data("\r\n".utf8)) body.append(Data("--\(bodyBoundary)--\r\n".utf8)) // Addtional header let manualHeader: [String: String] = [ "Content-Type": "multipart/form-data; boundary=\(bodyBoundary)" ] // Produce url request let request = getQnapRequest(method: .POST, url: webUrl!, loginData: _loginData, bindResult: _bindResult, header: manualHeader, httpBody: body) send(request: request, apiName: .updateAvatars, errorString: "") { (isOk, data) in guard isOk else { completion?(isOk, data) return } guard let retData = data as? Data, let jsonData = try? JSONSerialization.jsonObject(with: retData, options: []) as? [String:Any] else { completion?(false, "Cannot parse return data.") return } completion?(true, jsonData["message"]) } } ```