iPhone-ローカルファイルのURLからのNSData


85

NSURLローカルファイル(ドキュメントフォルダー内)のパスを指定するオブジェクトがあります。を入力したいNSDataこのファイルの内容をオブジェクトます。を使用してみましたdataWithContentsOfURL:が、失敗します。iPhoneSDKがパスを返すので、ファイルが存在することはわかっています。

誰かが私がどのように得ることができるか教えてもらえますか NSDataURLローカルファイルからオブジェクトをますか?

ありがとう。


「しかし失敗する」とはどういう意味ですか?
マルコ

この時点でフリーズすることを意味します!例外を与えます。UIImagePickerControllerから取得したURLのビデオのデータにアクセスしようとしています
lostInTransit

NURLではないオブジェクトを渡そうとしているようです。ファイルのURLをどのように取得していますか?NSStringではなくURLであると確信していますか?
マルコ

@AliKhaki:些細な編集は行わないでください。レビューキューにいる2人が変更を確認する必要があります。質問を編集して改善する場合は、「ありがとう」などの役に立たないものを自由に削除してください。ただし、そのためだけに質問を編集しないでください。ありがとう!
CrisLuengo18年

回答:


163
// Given some file path URL: NSURL *pathURL
// Note: [pathURL isFileURL] must return YES
NSString *path = [pathURL path];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];

スウィフトコード:

let data = FileManager.default.contents(atPath: path)

1
contentsOfFileは、ファイルパスとともにNSStringを取ります。NSURLオブジェクトを取得しています。
lostInTransit 2009年

よくわかりませんが、allocの代わりにdefaultManagerを使用すると、initによってスレッドの問題が発生する可能性があります。
カーロスレス2013年

2
NSFileManagerのドキュメントは、このスレッドの考慮事項の下で言っている:「共有NSFileManagerオブジェクトのメソッドを安全に複数のスレッドから呼び出すことができます。」彼らが指摘する唯一の例外は、ファイルマネージャの操作からのデリゲートコールバックを処理する場合です。私はそれがここに当てはまるとは思わない。
ティム

パスはファイルの「フルパス」であることに注意してください。これは、XCodeのファイルインスペクター
Burak

29

この作業を行うには、次のことを行う必要があります。

NSURL *imgPath = [[NSBundle mainBundle] URLForResource:@"search" withExtension:@"png"];
NSString*stringPath = [imgPath absoluteString]; //this is correct  

//you can again use it in NSURL eg if you have async loading images and your mechanism 
//uses only url like mine (but sometimes i need local files to load)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringPath]];
UIImage *ready = [[[UIImage alloc] initWithData:data] autorelease];

2

ローカルURLが「file://」で始まることを確認してください。 そうすれば、次のようにする必要があります。

 NSData *fileData = [NSData dataWithContentsOfFile:fileURL.path];

URLは常にassets-library://asset/asset.MOV?id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70&ext = MOV @ahbou
Mansuu ....

これはアセット(写真とビデオ)にのみ有効です。OPは、documentsフォルダーのファイルについて質問しています
ahbou 2017

選択したURLからasset_libraryからデータオブジェクトを作成すると、nil @ahbou
Mansuu ....

アセットは、AssetsLibraryまたはPhotos.frameworkによってのみ処理されます。アセットを取得するには、asset.assetForURL {}を呼び出す必要があります。このメソッドを検索するか、別のトピックとして新しい質問をしてください。
ahbou 2017

0

swift3の場合、次のURLからの回答が役に立ちました

(phonegapプラグインを使用して画像をキャプチャした後、次のパスを取得していました

file:///var/mobile/Containers/Data/Application/B64B06DE-7976-45CF-9BE2-661F0F309A06/tmp/abcded.jpg)

https://stackoverflow.com/a/41043447/6383908

videoURL = URL(string:urlString)の場合、videodata = try?Data(contentsOf:videoURL){//ここにAlamofireのコードを追加}


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.