我只是在Swift imagePickerController中没有"info"所以我不知道如何获取url并将其转换为数据以发送到Web服务.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
var videoDataURL = info[UIImagePickerControllerMediaURL] as! NSURL!
var videoFileURL = videoDataURL.filePathURL
var video = NSData.dataWithContentsOfMappedFile("\(videoDataURL)")
}
Run Code Online (Sandbox Code Playgroud)
有几个问题:
考虑这一行:
var videoDataURL = info[UIImagePickerControllerMediaURL] as! NSURL!
Run Code Online (Sandbox Code Playgroud)
这会强制解包 of info[UIImagePickerControllerMediaURL](这很糟糕,因为如果是nil,应用程序会崩溃)并将其转换为隐式解包的 optional NSURL!。那没有意义。只需进行条件解包(并解包为 a NSURL,而不是 a NSURL!):
if let videoDataURL = info[UIImagePickerControllerMediaURL] as? NSURL { ... }
Run Code Online (Sandbox Code Playgroud)下一行调用filePathURL:
var videoFileURL = videoDataURL.filePathURL
Run Code Online (Sandbox Code Playgroud)
如果你想要一个文件 URL,你已经有了一个,所以不需要转换,而只需使用videoDataURL. 如果你真的想要一条路径,你会使用path方法:
let videoPath = videoDataURL.path
Run Code Online (Sandbox Code Playgroud)
坦率地说,Apple 正试图让我们不再使用字符串路径,因此只需使用原始路径videoDataURL并避免同时使用path和filePathURL。
您正在使用dataWithContentsOfMappedFile:
var video = NSData.dataWithContentsOfMappedFile("\(videoDataURL)")
Run Code Online (Sandbox Code Playgroud)
如果你真的想使用dataWithContentsOfMappedFile,正确的 Swift 语法是:
let video = NSData(contentsOfMappedFile: videoPath!)
Run Code Online (Sandbox Code Playgroud)
但dataWithContentsOfMappedFile已弃用,因此您应该改用:
let video = try NSData(contentsOfFile: videoPath!, options: .DataReadingMappedIfSafe)
Run Code Online (Sandbox Code Playgroud)
或者,videoPath完全绕过它,您可以:
let video3 = try NSData(contentsOfURL: videoDataURL, options: .DataReadingMappedIfSafe)
Run Code Online (Sandbox Code Playgroud)
显然,这些try再现应该在带有do块的catch块内完成。
顺便说一句,正如您将在我上面的所有示例中看到的那样,应该let尽可能使用。
——
坦率地说,我建议完全不要将其加载到 aNSData中。只需使用 复制它NSFileManager,这样可以更有效地使用内存。如果视频很长,它可能会很大,您应该避免在任何给定时间点将整个内容加载到内存中。
所以你可以:
if let videoDataURL = info[UIImagePickerControllerMediaURL] as? NSURL {
do {
// build your destination URL however you want
//
// let tempFolder = NSURL(fileURLWithPath: NSTemporaryDirectory())
// let destinationURL = tempFolder.URLByAppendingPathComponent("test.mov")
// or
let documents = try NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
let destinationURL = documents.URLByAppendingPathComponent("test.mov")
// but just copy from the video URL to the destination URL
try NSFileManager.defaultManager().copyItemAtURL(videoDataURL, toURL: destinationURL)
} catch {
print(error)
}
}
Run Code Online (Sandbox Code Playgroud)
如果您要将其上传到 Web 服务,则可以使用NSURLSessionUploadTask, 使用文件或流选项。这个请求的构建是一个单独的问题,但希望你能明白:对于像照片或特别是视频这样的大型资产,NSData如果你可以避免的话,不要用资产实例化 a 。
Xcode 8.3•Swift 3.1
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {
let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
if let fileURL = info[UIImagePickerControllerMediaURL] as? URL {
do {
try FileManager.default.moveItem(at: fileURL, to: documentsDirectoryURL.appendingPathComponent("videoName.mov")
print("movie saved")
} catch {
print(error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特2
如果让我们打开您的选项,您应该使用.NSData.dataWithContentsOfMappedFileiOS8 也被弃用了.尝试使用NSData方法初始化程序contentsOfURL:
注意:您还需要将didFinishPickingMediaWithInfo声明更改[NSObject : AnyObject]为[String : AnyObject]
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let fileURL = info[UIImagePickerControllerMediaURL] as? NSURL {
if let videoData = NSData(contentsOfURL: fileURL) {
print(videoData.length)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如Rob所述,数据可能非常大,但不是复制文件,而应将文件移动到文档文件夹,如下所示:
let documentsDirectoryURL = try! NSFileManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
if let fileURL = info[UIImagePickerControllerMediaURL] as? NSURL {
do {
try NSFileManagerdefaultManager().moveItemAtURL(fileURL, toURL: documentsDirectoryURL.URLByAppendingPathComponent("videoName").URLByAppendingPathExtension("mov"))
print("movie saved")
} catch {
print(error)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9888 次 |
| 最近记录: |