web-dev-qa-db-ja.com

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」という形式の名前が返されます。正式に確認したところApple docs。新しいクラスPHAssetResourceが導入され、プロパティoriginalFilenameこれはiOS 9以降で使用できます。問題は、画像ピッカーライブラリ CTAssetsPickerController を使用することです。これは、Photosフレームワークに基づいています。選択した画像をPHAssetオブジェクト。PS。iOS 8と互換性のあるソリューションを探しています:)。ありがとうございました!

16
ProblemSlover

IOS 8では、あなたのソリューションはファイル名を取得するための正しい(そして唯一のアプローチ)です。

IOS 9ではこれは機能します:

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

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.
3
user6838301

多分あなたはメソッドを使うことができます、それは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}
}];
2
Changwei

意味のない名前を返すようになったため、コードを変更する必要がありました。私の解決策は、アセットの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
    }
}
0
szotp