iPhone - Dữ liệu NSD từ URL của tệp cục bộ


85

Tôi có một NSURLđối tượng 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 NSDatađối tượng 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 SDKtrả về đường dẫn.

Ai đó có thể vui lòng cho tôi biết cách tôi có thể lấy một NSDatađối tượng từ URLtệp cục bộ không?

Cảm ơn.


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

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

Có vẻ như bạn đang cố chuyể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 là URL chứ không phải NSString không?
Marco

@AliKhaki: Vui lòng không thực hiện các chỉnh sửa tầm thường, cần hai người trong hàng đợi đánh giá để xem xét các thay đổi của bạn. Nếu bạn chỉnh sửa câu hỏi để cải thiện câu hỏi đó, hãy xóa những thứ vô ích như "cảm ơn", nhưng đừng chỉnh sửa câu hỏi chỉ vì điều đó. Cảm ơn!
Cris Luengo

Câu trả lời:


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

Mã Swift:

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

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

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

2
Tài liệu NSFileManager có điều này để nói trong phần Xem xét phân luồng: "Các phương thức của đối tượng NSFileManager được chia sẻ 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 lệnh gọi lại ủy quyền từ hoạt động của trình quản lý tệp; Tôi không tin rằng điều đó áp dụng ở đây.
Tim

Lưu ý rằng đường dẫn là 'Đường dẫn đầy đủ' của tệp, bạn có thể tìm thấy đường dẫn này trong Trình kiểm tra tệp của XCode
Burak

29

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

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

Đảm bảo rằng URL cục bộ của bạn bắt đầu bằng "file: //", sau đó bạn chỉ cần thực hiện điều này:

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

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

Điều đó chỉ hợp lệ cho Nội dung (Ảnh và video). OP đang hỏi về một tệp từ thư mục tài liệu
ahbou

khi tôi tạo đối tượng dữ liệu từ url đã chọn vì asset_library nó cho tôi nil @ahbou
Mansuu ....

Nội dung chỉ được xử lý bởi AssetsLibrary hoặc Photos.framework. Để truy xuất nội dung, bạn cần gọi tài sản.assetForURL {} Tìm kiếm phương pháp này hoặc đặt một câu hỏi mới vì đây là một chủ đề riêng biệt.
ahbou

0

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

(Tôi đã nhận được đường dẫn sau khi chụp ảnh bằng plugin phonegap

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

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

nếu let videoURL = URL (string: urlString), hãy thử videodata =? Data (contentOf: videoURL) {// Thêm mã của Alamofire tại đây}


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.