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
}
}
请问有没有办法用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
}
}