Swift保存下载的视频NSURLSession

时间:2016-03-05 18:15:51

标签: swift video download nsurl

我需要从服务器下载视频并保存视频以供日后观看。

所以我需要下载视频并将其保存在应用程序的文件系统中,并使用自定义名称到目前为止我可以下载数据(我猜)但无法存储。

不,我不想使用额外的消亡框架或其他任何东西。

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

1 个答案:

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