iPhone - NSData จาก URL ของไฟล์ในเครื่อง


85

ฉันมีNSURLวัตถุที่ให้เส้นทางของไฟล์ในเครื่อง (ในโฟลเดอร์เอกสาร) ฉันต้องการเติมข้อมูลNSDataวัตถุที่มีเนื้อหาของไฟล์นี้ พยายามใช้dataWithContentsOfURL:แต่ล้มเหลว ฉันรู้ว่ามีไฟล์อยู่เนื่องจาก iPhone SDKส่งคืนเส้นทาง

ใครช่วยบอกฉันหน่อยได้ไหมว่าฉันจะรับNSDataวัตถุจากURLไฟล์ในเครื่องได้อย่างไร

ขอบคุณ.


"แต่ล้มเหลว" หมายความว่าอย่างไร
Marco

หมายความว่ามันค้างที่จุดนี้! ให้ข้อยกเว้น ฉันพยายามเข้าถึงข้อมูลของวิดีโอซึ่งเป็น URL ที่เราได้รับจาก UIImagePickerController
lostInTransit

ดูเหมือนว่าคุณกำลังพยายามส่งผ่านวัตถุที่ไม่ใช่ NURL คุณได้รับ URL ของไฟล์อย่างไรคุณแน่ใจหรือไม่ว่าเป็น URL ไม่ใช่ NSString
Marco

@AliKhaki: โปรดอย่าทำการแก้ไขเล็กน้อยต้องใช้คนสองคนในคิวตรวจสอบเพื่อตรวจสอบการเปลี่ยนแปลงของคุณ หากคุณแก้ไขคำถามเพื่อปรับปรุงคำถามอย่าลังเลที่จะลบสิ่งที่ไร้ประโยชน์เช่น "ขอบคุณ" แต่อย่าแก้ไขคำถามเพียงอย่างเดียว ขอบคุณ!
Cris Luengo

คำตอบ:


163

รหัส Swift:

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

1
contentOfFile ใช้ NSString ด้วยพา ธ ไฟล์ ฉันได้รับวัตถุ NSURL
lostInTransit

ฉันไม่แน่ใจ แต่การใช้ defaultManager แทนการจัดสรร init อาจทำให้เกิดปัญหาเธรด
carlossless

2
เอกสาร NSFileManagerมีนี้จะพูดภายใต้การพิจารณา Threading: "วิธีการของวัตถุที่ใช้ร่วมกัน NSFileManager สามารถเรียกจากกระทู้หลายอย่างปลอดภัย." ข้อยกเว้นเดียวที่พวกเขาทราบคือหากคุณต้องการจัดการกับการโทรกลับของผู้รับมอบสิทธิ์จากการดำเนินการของตัวจัดการไฟล์ ฉันไม่เชื่อว่าจะใช้ได้กับที่นี่
ทิม

โปรดทราบว่าเส้นทางคือ 'Full Path' ของไฟล์ซึ่งคุณสามารถค้นหาได้ใน File Inspector of 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 จะถูกส่งคืนเป็น asset-library เสมอ: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 & ext = MOV @ahbou
Mansuu ....

ใช้ได้กับเนื้อหาเท่านั้น (รูปภาพและวิดีโอ) OP กำลังถามเกี่ยวกับไฟล์จากโฟลเดอร์เอกสาร
ahbou

เมื่อฉันสร้างวัตถุข้อมูลจาก url ที่เลือกจาก asset_library มันทำให้ฉันไม่มี @ahbou
Mansuu ....

เนื้อหาจะจัดการโดย AssetsLibrary หรือ Photos.framework เท่านั้น ในการดึงเนื้อหาคุณต้องเรียก asset.assetForURL {} ค้นหาวิธีนี้หรือถามคำถามใหม่เป็นหัวข้อแยกต่างหาก
ahbou

0

สำหรับ swift3 ฉันพบว่าคำตอบจาก URL ต่อไปนี้มีประโยชน์

(ฉันได้รับเส้นทางต่อไปนี้หลังจากจับภาพโดยใช้ปลั๊กอิน phonegap

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

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

ถ้าให้ videoURL = URL (string: urlString) ให้ videodata = ลอง? ข้อมูล (contentsOf: videoURL) {// เพิ่มรหัสของ Alamofire ที่นี่}


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.