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」という形式の名前が返されます。正式に確認したところApple docs。新しいクラスPHAssetResource
が導入され、プロパティoriginalFilename
これはiOS 9以降で使用できます。問題は、画像ピッカーライブラリ CTAssetsPickerController を使用することです。これは、Photosフレームワークに基づいています。選択した画像をPHAsset
オブジェクト。PS。iOS 8と互換性のあるソリューションを探しています:)。ありがとうございました!
IOS 8では、あなたのソリューションはファイル名を取得するための正しい(そして唯一のアプローチ)です。
IOS 9ではこれは機能します:
NSArray *resources = [PHAssetResource assetResourcesForAsset:asset];
NSString *orgFilename = ((PHAssetResource*)resources[0]).originalFilename;
1行のコードでファイル名を取得する簡単な方法。アセットには、ファイル名にアクセスするためのプロパティがあります。
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.
多分あなたはメソッドを使うことができます、それは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}
}];
意味のない名前を返すようになったため、コードを変更する必要がありました。私の解決策は、アセットの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
}
}