从UIImagePickerController中如何获取图像文件名?

5

我从照片库中无法获取图像名称。 这里有人知道一种正确的方法来获取图像名称吗?

注意:PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil) 已经过时。

仅适用于Swift编程语言

谢谢


请查看此链接:https://dev59.com/YFkR5IYBdhLWcg3w7hbE也许可以帮到您。 - Sagar Chauhan
1
@Jacky PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil) 已经被弃用 - Akshay Sood
7个回答

8
我找到了一种方法。
if let asset = info["UIImagePickerControllerPHAsset"] as? PHAsset{
            if let fileName = asset.value(forKey: "filename") as? String{
            print(fileName)
            }
        }

这将返回您在照片库中实际的文件名。

但在我的情况下它不起作用,asset 总是返回 nil。 - Sujit Baranwal
是的,现在info不提供“UIImagePickerControllerPHAsset”键。 - jomafer
在尝试访问PhAsset信息之前,您需要获取照片权限。 - Dot Freelancer
1
如何获取权限?我已经添加了隐私-照片库使用说明。 - pankaj nigam

7

您是指图像文件名吗?如果是,这应该可以帮助您。在您的UIImagePickerControllerDelegate中:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    guard let fileUrl = info[UIImagePickerControllerImageURL] as? URL else { return }
    print(fileUrl.lastPathComponent)
}

1
lastPathComponent 会返回系统设置的临时文件名。 - Akshay Sood
检查我的答案。这将返回您精确的文件名。我也在Mac上检查了文件名,它会返回您正确的文件名。 - Akshay Sood

6

iOS 12、Swift 4更新:

这将直接为您提供文件名和文件扩展名

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    guard let fileUrl = info[UIImagePickerController.InfoKey.imageURL] as? URL else { return }
    print(fileUrl.lastPathComponent) // get file Name
    print(fileUrl.pathExtension)     // get file extension
    dismiss(animated: true, completion: nil)
}

这段代码运行良好,请在给出负评前尝试运行代码。 - Ankit
刚试了一下,这对相机拍摄的照片不起作用 :)。 - godzilla

3

请尝试以下代码

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {
        if let fileName = (asset.value(forKey: "filename")) as? String {
          print(\(fileName))
        }
    }

    // Other Stuff
}

3

UIImagePickerControllerPHAsset如果您没有获得访问照片库的权限,它将会是nil。操作系统不会自动询问并仍然会给您访问该文件的权限(我不知道背后的逻辑!),但是在信息字典中的PHAsset将会是nil


2

正确的做法是:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
  var imageName = "image_1"
  if let asset = info[.phAsset] as? PHAsset, let fileName = asset.value(forKey: "filename") as? String {
    imageName = fileName
  } else if let url = info[.imageURL] as? URL {
    imageName = url.lastPathComponent
  }
}

PHAsset如果用户没有授权您的应用程序访问库,则将为nil。如果您使用默认的UIImagePickerController,则不再需要此权限,因此,如果您的应用程序没有获得此权限,操作系统将为您提供对图像副本的临时访问权限,您只能回退到路径URL。


0
请尝试这个。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {
        let assetResources = PHAssetResource.assetResources(for: asset)
        print(assetResources.first!.originalFilename)
    }

    dismiss(animated: true, completion: nil)
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接