Ios 如何将图像或视频从UIPickerViewController保存到文档目录?

Ios 如何将图像或视频从UIPickerViewController保存到文档目录?,ios,swift,nsfilemanager,Ios,Swift,Nsfilemanager,处理选定的图像或视频: func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { print("ok") if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { //what to do to s

处理选定的图像或视频:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    print("ok")

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        //what to do to save that image
    } else {
        //how to get the video and save
    }
}
  • 将其保存到文档目录:

    let path = try! NSFileManager.defaultManager().URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: false)
    let newPath = path.URLByAppendingPathComponent("image.jpg") //or video.mpg for example
    
  • 如何将该图像保存到以下
    newPath

    • 使用以下步骤将图像保存到文档目录
    步骤1:获取文档目录的路径

    let path = try! NSFileManager.defaultManager().URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: false)
    
    步骤2:在路径中追加文件名

    let newPath = path.stringByAppendingPathComponent("image.jpg")
    
    步骤3:确定图像的文件类型为JPEG或PNG,并将图像转换为数据(字节)

    步骤4:将文件写入创建的路径

    let result = jpgImageData!.writeToFile(newPath, atomically: true)
    
    将上述代码添加到
    didFinishPickingImage
    函数中

    • 使用以下func将视频保存到文档目录

      func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) 
      {
          // *** store the video URL returned by UIImagePickerController *** //
          let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL
      
          // *** load video data from URL *** //
          let videoData = NSData(contentsOfURL: videoURL)
      
          // *** Get documents directory path *** //
          let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
      
          // *** Append video file name *** //
          let dataPath = documentsDirectory.stringByAppendingPathComponent("/videoFileName.mp4")
      
          // *** Write video file data to path *** //
          videoData?.writeToFile(dataPath, atomically: false)
      }
      

    在Xcode 8.3.3中更新Swift 3的接受答案

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
            let path = try! FileManager.default.url(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil, create: false)
            let newPath = path.appendingPathComponent("image.jpg")
            let jpgImageData = UIImageJPEGRepresentation(image, 1.0)
            do {
                try jpgImageData!.write(to: newPath)
            } catch {
                print(error)
            }
    
        } else {
            let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL
            let videoData = NSData(contentsOf: videoURL as URL)
            let path = try! FileManager.default.url(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask, appropriateFor: nil, create: false)
            let newPath = path.appendingPathComponent("/videoFileName.mp4")
            do {
                try videoData?.write(to: newPath)
            } catch {
                print(error)
            }
        }
    }
    

    Swift 5

    func getDocumentsDirectory() -> URL {
            let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
            return paths[0]
        }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            picker.dismiss(animated: true)
            guard let image = info[.editedImage] as? UIImage else {
                print("No image found")
                return
            }
            // saving to application directory
            let imageName = UUID().uuidString
            let imagePath = getDocumentsDirectory().appendingPathComponent(imageName)
            if let jpegData = image.jpegData(compressionQuality: 0.8) {
                print("Image Save to path \(imagePath)")
                try? jpegData.write(to: imagePath)
            }
         }
    

    我可以为视频做类似的事情吗?请用视频示例更新您的答案。是@Bartłomiejsemanńczyk,如果可以,我将更新我的答案。但是,同样需要使用视频选择器及其委托。同样的委托方法将不起作用。最后一件事,我们如何知道视频的扩展名是什么?我们可以区别于从
    mediaInfo
    中播放它吗?只有当它存储在iOS设备中时,它才会是
    .mp4
    视频,尽管您可以从
    mediaInfo
    字典中的UIImagePickerControllerMediaURL中找到它。
    func getDocumentsDirectory() -> URL {
            let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
            return paths[0]
        }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            picker.dismiss(animated: true)
            guard let image = info[.editedImage] as? UIImage else {
                print("No image found")
                return
            }
            // saving to application directory
            let imageName = UUID().uuidString
            let imagePath = getDocumentsDirectory().appendingPathComponent(imageName)
            if let jpegData = image.jpegData(compressionQuality: 0.8) {
                print("Image Save to path \(imagePath)")
                try? jpegData.write(to: imagePath)
            }
         }