如何使用SwiftyDropbox"目的地"下载

时间:2016-01-29 05:02:43

标签: dropbox-api

在审核v2 Dropbox API中的SwiftyDropbox tutorial时,它会显示如何执行下载:

// Download a file
let destination : (NSURL, NSHTTPURLResponse) -> NSURL = { temporaryURL, response in
    let fileManager = NSFileManager.defaultManager()
    let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    // generate a unique name for this file in case we've seen it before
    let UUID = NSUUID().UUIDString
    let pathComponent = "\(UUID)-\(response.suggestedFilename!)"
    return directoryURL.URLByAppendingPathComponent(pathComponent)
}

client.files.download(path: "/MyFile.db", destination: destination).response { response, error in
    if let (metadata, url) = response {
        print("*** Download file ***")
        let data = NSData(contentsOfURL: url)
        print("Downloaded file name: \(metadata.name)")
        print("Downloaded file url: \(url)")
        print("Downloaded file data: \(data)")
    } else {
        print(error!)
    }
}

我不清楚destination部分发生了什么。为什么我需要为文件名生成一个随机字符串?

当我尝试指定自己的文件名时,下载似乎不起作用:

let destination : (NSURL, NSHTTPURLResponse) -> NSURL = { temporaryURL, response in
  let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
  return directoryURL.URLByAppendingPathComponent("MyFile.db")
}

我想从Dropbox下载一个名为MyFile.db的文件,我想把它放在名为MyFile.db的设备文档目录中,如果它已经覆盖,则覆盖它那里。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

当你说它似乎不起作用时,我希望你的意思是你得到这样的错误:

  

错误域= NSCocoaErrorDomain代码= 516"“CFNetworkDownload_bPYhu1.tmp”无法移动到“文档”,因为已经存在具有相同名称的项目。" UserInfo = {NSSourceFilePathErrorKey = ...,NSUserStringVariant =(      移动   ),NSDestinationFilePath = ...,NSUnderlyingError = 0x7fda0a67cea0 {错误域= NSPOSIXErrorDomain代码= 17"文件存在"}}

SwiftyDropbox由于使用了AlamoFire,目前还没有使用download函数覆盖文件。

具体来说,AlamoFire中的SwiftyDropbox calls download和AlamoFire calls NSFileManager.moveItemAtURLNSFileManager.moveItemAtURL的文档说:

  

如果dstURL中已存在具有相同名称的项目,则此方法将中止移动尝试并返回相应的错误。

因此,它似乎只是保持谨慎,并且使您的应用难以意外覆盖(可能会丢失)数据。如果您肯定知道要覆盖特定文件,则需要在Dropbox API调用后明确地知道。我们会将此视为功能请求。

更新:SwiftyDropbox现在可以直接覆盖version 3.1.0文件,例如使用download(path:rev:overwrite:destination:)