PHAsset 获取原始文件名

PHAsset get original file name

请问有没有办法用PHAsset获取原始文件名?

我使用以下代码提取文件信息。

   [[PHImageManager defaultManager] requestImageDataForAsset:asset options:requestOption resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
    entity.fileUrl =  [info objectForKey:@"PHImageFileURLKey"];
    entity.filename = [[NSFileManager defaultManager] displayNameAtPath:[ entity.fileUrl path]];
   }];

但是,它不是return原来的名字,而是"img_123"格式的名字 我刚刚查看了苹果官方文档。 class PHAssetResource 和 属性 originalFilename 在 iOS 9+ 中可用。问题是我使用了基于 Photos 框架的图像选择器库 CTAssetsPickerController;它 returns 选择图像作为 PHAsset 对象。 PS。我正在寻找与 iOS 8 兼容的解决方案 :)。 谢谢!

在 iOS 8 上,您的解决方案是获取文件名的正确方法(也是唯一方法)。

在 iOS 9 上有效:

NSArray *resources = [PHAssetResource assetResourcesForAsset:asset];
NSString *orgFilename = ((PHAssetResource*)resources[0]).originalFilename;

也许你可以使用上面的方法,它有效 iOS8:

 [asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {

    CIImage *fullImage = [CIImage imageWithContentsOfURL:contentEditingInput.fullSizeImageURL];
    NSLog(@"%@",contentEditingInput.fullSizeImageURL);//get url
    NSLog(@"%@", fullImage.properties.description);//get {TIFF}, {Exif}
}];

一行代码获取文件名的快捷方式。资产有一个 属性 用于访问文件名。

 NSString*FileName=[asset valueForKey:@"filename"];
 NSLog(@"File name %@",FileName);

Its done.

Note: Accepted answer takes lots of time to load a phasset but it works.

我不得不修改我的代码,因为它开始返回无意义的名称。我的解决方案是根据资产的媒体类型和资源类型选择资源,但也许有更简单的方法:

extension PHAsset {
    var primaryResource: PHAssetResource? {
        let types: Set<PHAssetResourceType>

        switch mediaType {
        case .video:
            types = [.video, .fullSizeVideo]
        case .image:
            types = [.photo, .fullSizePhoto]
        case .audio:
            types = [.audio]
        case .unknown:
            types = []
        @unknown default:
            types = []
        }

        let resources = PHAssetResource.assetResources(for: self)
        let resource = resources.first { types.contains([=10=].type)}

        return resource ?? resources.first
    }

    var originalFilename: String {
        guard let result = primaryResource else {
            return "file"
        }

        return result.originalFilename
    }
}