PHAsset获取原始文件名

24

我想知道是否有办法使用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]];
   }];
然而,它不会返回原始名称,而是以"img_123"格式命名。我刚刚查看了官方苹果文档。介绍了一个新类PHAssetResource和属性originalFilename,适用于iOS 9+。问题是,我使用的图像选择器库CTAssetsPickerController基于Photos框架;它将选定的图像作为PHAsset对象返回。附注:我正在寻找与iOS 8兼容的解决方案:)。谢谢!
5个回答

45

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

在 iOS 9 上,这个方法可以使用:

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

我应该为iOS 8或之前的版本做些什么? - iHardikTrivedi
5
自 iOS 13 起,这是错误的。你可能会得到 Adjustments.plist 文件或者一个实时照片电影(针对照片)。 - szotp

9

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

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($0.type)}

        return resource ?? resources.first
    }

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

        return result.originalFilename
    }
}

9

用一行代码快速获取文件名的简便方法。Asset有一个属性可访问文件名。

 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.

这个给出的结果与所期望的不同。它是内部名称,而不是原始名称。 - malex

3
也许你可以使用这种方法,它适用于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}
}];

嘿,谢谢。我使用了被接受答案中建议的方法,但在查找源代码(头文件)后,我发现我可以使用类似于你的方法。 - ProblemSlover

2

@holtmann解决方案使用Swift编写

let resource = PHAssetResource.assetResources(for: asset)
let filename = resource.first?.originalFilename ?? "unknown"

1
它节省了很多时间。 - Nayan Dave

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