我需要从服务器下载视频并保存视频以供日后观看。
所以我需要下载视频并将其保存在应用程序的文件系统中,并使用自定义名称到目前为止我可以下载数据(我猜)但无法存储。
不,我不想使用额外的消亡框架或其他任何东西。
@IBOutlet var progressView: ProgressView!
@IBOutlet var statusLabel: UILabel!
@IBOutlet var downloadButton: DownloadButton!
private var downloadTask: NSURLSessionDownloadTask?
@IBAction func downloadButtonPressed() {
if let downloadTask = downloadTask {
downloadTask.cancel()
statusLabel.text = ""
} else {
statusLabel.text = "Downloading video"
downloadButton.setTitle("Stop download", forState: .Normal)
createDownloadTask()
}
}
func createDownloadTask() {
//small mp4 video link : http://techslides.com/demos/sample-videos/small.mp4
let url = NSURL(string: "http://techslides.com/demos/sample-videos/small.mp4")!
let downloadRequest = NSMutableURLRequest(URL: url)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue: NSOperationQueue.mainQueue())
downloadTask = session.downloadTaskWithRequest(downloadRequest)
downloadTask!.resume()
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
let progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
progressView.animateProgressViewToProgress(progress)
progressView.updateProgressViewLabelWithProgress(progress * 100)
progressView.updateProgressViewWith(Float(totalBytesWritten), totalFileSize: Float(totalBytesExpectedToWrite))
}
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
statusLabel.text = "Download finished"
print(downloadTask.response.suggestedFilename) // Gives file name
resetView()
}
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
if error != nil {
statusLabel.text = "Download failed"
} else {
statusLabel.text = "Download finished"
}
resetView()
}
func resetView() {
downloadButton.setTitle("Start download", forState: .Normal)
downloadTask!.cancel()
}
答案 0 :(得分:0)
我改变了整个功能并修复了它。
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
statusLabel.text = "Download finished"
print(downloadTask.response!.suggestedFilename!)
let documentsUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! as NSURL
// your destination file url
let destinationUrl = documentsUrl.URLByAppendingPathComponent(String(downloadTask.response!.suggestedFilename!))
print(destinationUrl)
if NSFileManager().fileExistsAtPath(destinationUrl.path!) {
print("The file already exists at path")
} else {
let data = NSData(contentsOfURL: (downloadTask.response!.URL)!)
if data!.writeToURL(destinationUrl, atomically: true) {
print("file saved")
} else {
print("error saving file")
}
}
let filePath = String(destinationUrl.path!)
var fileSize : UInt64 = 0
do {
let attr : NSDictionary? = try NSFileManager().attributesOfItemAtPath(filePath)
if let _attr = attr {
fileSize = _attr.fileSize();
print(fileSize)
self.statusLabel.text = String(fileSize)
self.performSegueWithIdentifier("video", sender: self)
}
} catch {
print("Error: \(error)")
}
resetView()
}