21

我想知道是否有任何方法可以使用 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”的名称,我刚刚检查了苹果官方文档。引入了一个新的类和在 iOS 9+ 中可用PHAssetResource 的属性。originalFilename问题是我使用了基于 Photos 框架的图像选择器库CTAssetsPickerController ;它返回拾取的图像作为PHAsset对象。PS。我正在寻找与 iOS 8 兼容的解决方案 :)。谢谢!

4

4 回答 4

44

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

在 iOS 9 这工作:

NSArray *resources = [PHAssetResource assetResourcesForAsset:asset];
NSString *orgFilename = ((PHAssetResource*)resources[0]).originalFilename;
于 2015-09-21T23:43:14.960 回答
8

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

 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.
于 2017-04-07T06:35:30.103 回答
7

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

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
    }
}
于 2019-12-02T11:32:56.667 回答
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}
}];
于 2016-03-08T15:00:25.733 回答