# 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"])
}
}
```