2009-10-03 19 views
73

Tôi có đối tượng NSURL cung cấp cho tôi đường dẫn của tệp cục bộ (trong thư mục tài liệu). Tôi muốn điền một đối tượng NSData với nội dung của tệp này. Đã thử sử dụng dataWithContentsOfURL: nhưng điều này không thành công. Tôi biết tệp tồn tại vì iPhone SDK trả lại đường dẫn.iPhone - NSData từ URL của tệp cục bộ

Ai đó có thể vui lòng cho tôi biết cách tôi có thể nhận được đối tượng NSData từ URL của tệp cục bộ?

Cảm ơn.

+0

"Nhưng không thành công" nghĩa là gì? – Marco

+0

Có nghĩa là nó bị đóng băng vào thời điểm này! Cung cấp một ngoại lệ. Tôi đang cố gắng truy cập dữ liệu của video, URL mà chúng tôi nhận được từ UIImagePickerController – lostInTransit

+0

Có vẻ như bạn đang cố truyền một đối tượng không phải là NURL. Làm cách nào để bạn nhận được URL của tệp, bạn có chắc chắn là một URL chứ không phải là một NSString không? – Marco

Trả lời

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

contentsOfFile nhận NSString với đường dẫn tệp. Tôi đang nhận được một đối tượng NSURL. – lostInTransit

+0

Tôi không chắc chắn nhưng, bằng cách sử dụng defaultManager thay vì phân bổ, init có thể gây ra vấn đề luồng. – carlossless

+2

[Tài liệu NSFileManager] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html) có điều này để nói theo Luận điểm về luồng: "The các phương thức của đối tượng NSFileManager dùng chung có thể được gọi từ nhiều luồng một cách an toàn. " Ngoại lệ duy nhất mà họ lưu ý là nếu bạn định xử lý các cuộc gọi lại đại biểu từ các hoạt động của trình quản lý tệp; Tôi không tin rằng áp dụng ở đây. – Tim

24

Để có được công việc này, bạn chỉ cần thực hiện:

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]; 
1

Hãy chắc chắn rằng URL địa phương của bạn bắt đầu với "file: //" sau đó bạn sẽ chỉ phải làm điều này:

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

luôn được trả về dưới dạng thư viện tài sản: //asset/asset.MOV? Id = 095AA9E9-A4F5-4035- 9A21-3CFF04F45C70 & ext = MOV @ahbou –

+0

Chỉ có giá trị đối với Nội dung (Ảnh và video). OP là askign về một tập tin từ thư mục tài liệu – ahbou

+0

khi tôi tạo đối tượng dữ liệu từ url đã chọn fro asset_library nó mang lại cho tôi nil @ahbou –

0

Đối swift3 tôi tìm thấy câu trả lời từ URL sau hữu ích

(Tôi đã nhận được đường dẫn sau, sau khi chụp ảnh sử dụng PhoneGap Plugin

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

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

nếu để videoURL = URL (chuỗi: urlString), hãy cho videodata = thử? Dữ liệu (contentOf: videoURL) { // Thêm mã của Alamofire tại đây }

Các vấn đề liên quan