2016-03-05 72 views
0

我需要从服务器下载视频并保存视频以备后用。Swift保存下载的视频NSURLSession

因此,我需要下载视频并将其保存在应用程序的文件系统中,至此我可以下载数据(我猜)但无法存储它。

不,我不想使用额外extinsions框架或任何其他。

@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

您可以使用响应suggestedFilename –

+0

'downloadTask.response?.suggestedFilename' –

+0

@LeoDabus确定它给我的文件名,现在我该怎样保存和重新使用它 –

回答

0

那么我改变了整个func并修复它。

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() 
}