PHAsset获取原始文件名

时间:2015-09-21 04:32:15

标签: ios objective-c ios8 phasset

我想知道是否有办法使用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+中使用。问题是我使用了基于Photos框架的图像选择器库CTAssetsPickerController;它将拾取的图像作为PHAsset对象返回。 PS。我正在寻找与iOS 8兼容的解决方案:)。 谢谢!

4 个答案:

答案 0 :(得分:40)

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

在iOS 9上,这有效:

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

答案 1 :(得分:3)

使用一行代码获取文件名的简短方法。资产具有访问文件名的属性。

// Currently inside an F# document
let FS_list = [1;2;3]
let CS_list = ResizeArray<int> FS_list // System.Collections.Generic.List
let FS_converted_back = Seq.toList CS_list

答案 2 :(得分:2)

也许你可以使用这个方法,它可以在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}
}];

答案 3 :(得分:0)

我不得不修改代码,因为它开始返回废话名称。我的解决方案是根据资产的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
    }
}