我对Swift相当新,我想在录制后将视频保存到文档文件夹(所以我可以上传到服务器)但是我收到了上述错误。我理解错误是什么,但我不知道如何解决它。我在Stack上的另一个答案中得到了以下代码。我错过了什么?
构建在此行上失败:
videoData?.write(toFile: dataPath, atomically: false)
完整的功能是:
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as! NSURL
let videoData = NSData(contentsOf: videoURL as URL)
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let docsDirectory = getDocumentsDirectory()
let dataPath = docsDirectory.appendingPathComponent("/videoFileName.mp4")
videoData?.write(toFile: dataPath, atomically: false)
self.dismiss(animated: true, completion: nil)
}
只需使用数据方法write(to: URL)
而不是write(foFile: String)
或传递URL
路径属性。顺便说一下命名URL
dataPath会产生误导。将其更改为fileURL
并传递其路径fileURL.path
但最好尽可能使用URL
方法对应物。另外正如@vadian的评论中已经提到的那样,没有必要强制转换为NSURL
并返回URL
,并且在附加路径组件时不要传递前导斜杠。这同样适用于NSData
,你应该尽可能删除NS
前缀。 Swift原生类型是Data
。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
if let videoURL = info[.mediaURL] as? URL {
do {
let videoData = try Data(contentsOf: videoURL)
let fileURL = documentsDirectory.appendingPathComponent("videoFileName.mp4")
try videoData.write(to: fileURL)
// pass atomic options if you would like to automatically override any existing file if needed
// try videoData.write(to: fileURL, options: .atomic)
} catch {
print(error)
}
dismiss(animated: true)
}
}