【发布时间】:2025-12-24 07:30:17
【问题描述】:
downloadTaskWithURL 函数有时会为不存在的文件返回非零位置。
测试环境http://192.168.0.102:3000/p/1461224691.mp4处没有文件。
大多数情况下,在此 URL 上调用 downloadTaskWithURL 会导致预期的错误消息:
网络操作期间下载消息时出错。下载地址: http://192.168.0.102:3000/p/1461224691.mp4。地点:无。错误: 可选(错误域=NSURLErrorDomain 代码=-1100 "请求的 URL 在此服务器上找不到。” UserInfo=0x17547b640 {NSErrorFailingURLKey=http://192.168.0.102:3000/p/1461224691.mp4, NSLocalizedDescription=在此未找到请求的 URL 服务器。, NSErrorFailingURLStringKey=http://192.168.0.102:3000/p/1461224691.mp4})
有时,downloadTaskWithURL 以不确定的方式认为文件存在并将某些内容写入location 变量。结果,保护条件没有失败,代码继续执行......它不应该这样做。
fileManager.moveItemAtURL(location!, toURL: fileURL)创建的永久文件只有1个字节,确认网络文件从一开始就不存在。
为什么downloadTaskWithURL 会这样?
func download() {
// Verify <networkURL>
guard let downloadURL = NSURL(string: networkURL) where !networkURL.isEmpty else {
print("Error downloading message: invalid download URL. URL: \(networkURL)")
return
}
// Generate filename for storing locally
let suffix = (networkURL as NSString).pathExtension
let localFilename = getUniqueFilename("." + suffix)
// Create download request
let task = NSURLSession.sharedSession().downloadTaskWithURL(downloadURL) { location, response, error in
guard location != nil && error == nil else {
print("Error downloading message during network operation. Download URL: \(downloadURL). Location: \(location). Error: \(error)")
return
}
// If here, no errors so save message to permanent location
let fileManager = NSFileManager.defaultManager()
do {
let documents = try fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let fileURL = documents.URLByAppendingPathComponent(localFilename)
try fileManager.moveItemAtURL(location!, toURL: fileURL)
self.doFileDownloaded(fileURL, localFilename: localFilename)
print("Downloaded file @ \(localFilename). Download URL: \(downloadURL)")
} catch {
print("Error downloading message during save operation. Network URL: \(self.networkURL). Filename: \(localFilename). Error: \(error)")
}
}
// Start download
print("Starting download @ \(downloadURL)")
task.resume()
}
【问题讨论】:
标签: ios swift avfoundation nsurlsession nsurlsessiondownloadtask