在审核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
的设备文档目录中,如果它已经覆盖,则覆盖它那里。
我该怎么做?
答案 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.moveItemAtURL
。 NSFileManager.moveItemAtURL
的文档说:
如果dstURL中已存在具有相同名称的项目,则此方法将中止移动尝试并返回相应的错误。
因此,它似乎只是保持谨慎,并且使您的应用难以意外覆盖(可能会丢失)数据。如果您肯定知道要覆盖特定文件,则需要在Dropbox API调用后明确地知道。我们会将此视为功能请求。
更新:SwiftyDropbox现在可以直接覆盖version 3.1.0文件,例如使用download(path:rev:overwrite:destination:)。