This uses the SwiftyDropbox library to upload a file from a NSFileHandle
to the Dropbox account using upload sessions, handling every error case:
import UIKit
import SwiftyDropbox
class ViewController: UIViewController {
// filled in later in doUpload:
var fileHandle : NSFileHandle? = nil
var data : NSData? = nil
let chunkSize = 5 * 1024 * 1024 // 5 MB
var offset = 0
var sessionId = ""
// replace this with your desired destination path:
let destPath = "/SwiftyDropbox_upload.txt"
override func viewDidLoad() {
super.viewDidLoad()
Dropbox.authorizedClient = DropboxClient(...)
doUpload()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func doUpload() {
// replace this with the path to the file you want to upload
let filePath = "/path/to/file"
print("Getting file at \(filePath) for uploading...")
fileHandle = NSFileHandle.init(forReadingAtPath: filePath)!
print("Using chunked uploading with chunk size \(chunkSize)...")
uploadFirstChunk()
}
func uploadFirstChunk() {
data = fileHandle!.readDataOfLength(chunkSize)
let size = data!.length
print("Have \(size) bytes to upload.")
Dropbox.authorizedClient!.files.uploadSessionStart(input:data!)
.response { response, error in
if let result = response {
self.sessionId = result.sessionId
self.offset += size
print("So far \(self.offset) bytes have been uploaded.")
self.uploadNextChunk()
} else if let callError = error {
print("uploadSessionStart failed")
switch callError as CallError {
case .RouteError(let error, let requestId):
print("RouteError[\(requestId)]: \(error)")
case .BadInputError(let message, let requestId):
print("BadInputError[\(requestId)]: \(message)")
case .HTTPError(let code, let message, let requestId):
print("HTTPError[\(requestId)]: \(code): \(message)")
case .InternalServerError(let code, let message, let requestId):
print("InternalServerError[\(requestId)]: \(code): \(message)")
case .OSError(let err):
print("OSError: \(err)")
case .RateLimitError:
print("RateLimitError")
}
}
}
}
func uploadNextChunk() {
data = fileHandle!.readDataOfLength(chunkSize)
let size = data!.length
print("Have \(size) bytes to upload.")
if size < chunkSize {
print("Last chunk!")
Dropbox.authorizedClient!.files.uploadSessionFinish(
cursor: Files.UploadSessionCursor(sessionId: self.sessionId, offset: UInt64(offset)),
commit: Files.CommitInfo(path:destPath),
input: data!)
.response { response, error in
if let callError = error {
print("uploadSessionFinish failed")
switch callError as CallError {
case .RouteError(let boxed, let requestId):
print("RouteError[\(requestId)]:")
switch boxed.unboxed as Files.UploadSessionFinishError {
case .Path(let writeError):
print("Path: ")
switch writeError {
case .MalformedPath(let malformedPathError):
print("MalformedPath: \(malformedPathError)")
case .Conflict(let writeConflictError):
print("Conflict:")
switch writeConflictError {
case .File:
print("File")
case .FileAncestor:
print("FileAncestor")
case .Folder:
print("Folder")
case .Other:
print("Other")
}
case .DisallowedName:
print("DisallowedName")
case .InsufficientSpace:
print("InsufficientSpace")
case .NoWritePermission:
print("NoWritePermission")
case .Other:
print("Other")
}
case .LookupFailed(let uploadSessionLookupError):
print("LookupFailed:")
switch uploadSessionLookupError {
case .Closed:
print("Closed")
case .IncorrectOffset(let uploadSessionOffsetError):
print("IncorrectOffset: \(uploadSessionOffsetError)")
case .NotFound:
print("NotFound")
case .NotClosed:
print("NotFound")
case .Other:
print("Other")
}
case .TooManySharedFolderTargets:
print("TooManySharedFolderTargets")
case .Other:
print("Other")
}
case .BadInputError(let message, let requestId):
print("BadInputError[\(requestId)]: \(message)")
case .HTTPError(let code, let message, let requestId):
print("HTTPError[\(requestId)]: \(code): \(message)")
case .InternalServerError(let code, let message, let requestId):
print("InternalServerError[\(requestId)]: \(code): \(message)")
case .OSError(let err):
print("OSError: \(err)")
case .RateLimitError:
print("RateLimitError")
}
} else if let result = response {
print("Done!")
print(result)
}
}
} else {
Dropbox.authorizedClient!.files.uploadSessionAppendV2(
cursor: Files.UploadSessionCursor(sessionId: self.sessionId, offset: UInt64(offset)),
input: data!)
.response { response, error in
if error == nil {
self.offset += self.chunkSize
print("So far \(self.offset) bytes have been uploaded.")
self.uploadNextChunk()
} else if let callError = error {
print("uploadSessionAppend failed")
switch callError as CallError {
case .RouteError(let boxed, let requestId):
print("RouteError[\(requestId)]:")
switch boxed.unboxed as Files.UploadSessionLookupError {
case .Closed:
print("Closed")
case .IncorrectOffset(let uploadSessionOffsetError):
print("IncorrectOffset: \(uploadSessionOffsetError)")
case .NotFound:
print("NotFound")
case .NotClosed:
print("NotClosed")
case .Other:
print("Other")
}
case .BadInputError(let message, let requestId):
print("BadInputError[\(requestId)]: \(message)")
case .HTTPError(let code, let message, let requestId):
print("HTTPError[\(requestId)]: \(code): \(message)")
case .InternalServerError(let code, let message, let requestId):
print("InternalServerError[\(requestId)]: \(code): \(message)")
case .OSError(let err):
print("OSError: \(err)")
case .RateLimitError:
print("RateLimitError")
}
}
}
}
}
}