iPhone - स्थानीय फ़ाइल के URL से NSData


85

मेरे पास एक NSURLऑब्जेक्ट है जो मुझे एक स्थानीय फ़ाइल (दस्तावेज़ फ़ोल्डर में) का रास्ता देता है। मैं NSDataइस फ़ाइल की सामग्री के साथ एक वस्तु को आबाद करना चाहता हूं । का उपयोग करने की कोशिश की, dataWithContentsOfURL:लेकिन यह विफल रहता है। मुझे पता है कि फ़ाइल मौजूद है क्योंकि iPhone SDKपथ देता है।

क्या कोई मुझे बता सकता है कि मुझे स्थानीय फ़ाइल NSDataसे कोई ऑब्जेक्ट कैसे मिल सकता है URL?

धन्यवाद।


"लेकिन यह विफल रहता है" क्या मतलब है?
मार्को

इसका मतलब है कि यह इस बिंदु पर जमा देता है! एक अपवाद देता है। मैं एक वीडियो के डेटा को एक्सेस करने की कोशिश कर रहा हूं, जिसका URL हमें UIImagePickerController
LostInTransit

ऐसा लगता है कि आप एक ऐसा ऑब्जेक्ट पास करने की कोशिश कर रहे हैं जो NURL नहीं है। आप फ़ाइल URL कैसे प्राप्त कर रहे हैं, क्या आप सुनिश्चित हैं कि URL है और NSString नहीं है?
मार्को

@ अलीकहकी: कृपया तुच्छ संपादन न करें, आपके बदलावों को देखने के लिए समीक्षा कतार में दो लोग लगते हैं। यदि आप इसे बेहतर बनाने के लिए किसी प्रश्न को संपादित करते हैं, तो "धन्यवाद" जैसे बेकार सामान को हटाने के लिए स्वतंत्र महसूस करें, लेकिन उसके लिए प्रश्न को संपादित न करें। धन्यवाद!
क्राइस लुआंगो

जवाबों:


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
contentOfFile फ़ाइल पथ के साथ एक NSString लेता है। मुझे एक NSURL वस्तु मिल रही है।
खो दिया है

मुझे यकीन नहीं है लेकिन, आवंटन के बजाय defaultManager का उपयोग करते हुए, init के कारण थ्रेडिंग की समस्या हो सकती है।
carlossless

2
NSFileManager डॉक्स "साझा NSFileManager वस्तु के तरीकों से अधिक थ्रेड सुरक्षित रूप से कहा जा सकता है।": इस थ्रेडिंग विचार के तहत कहना है एकमात्र अपवाद वे नोट करते हैं यदि आप फ़ाइल प्रबंधक के संचालन से प्रतिनिधि कॉलबैक को संभालने का इरादा रखते हैं; मुझे विश्वास नहीं है कि यहाँ लागू होता है।
टिम

ध्यान दें कि पथ फ़ाइल का 'पूर्ण पथ' है, जिसे आप XCode के फ़ाइल इंस्पेक्टर के अधीन पा सकते हैं
बर्क

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 "फ़ाइल: //" से शुरू होता है, तब आपको बस यही करना होगा:

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

url को हमेशा संपत्ति-पुस्तकालय के रूप में लौटाया जाता है: //asset/asset.MOV? id = 095AA9E9-A4F5-4035-9A21-3CFF04F45C70 और ext = MOV @ahbou
Mansuu ....

यह केवल एसेट्स (फोटो और वीडियो) के लिए मान्य है। ओपी दस्तावेज़ फ़ोल्डर से एक फाइल के बारे में पूछ रहा है
ahbou

जब मैं चयनित url fro परिसंपत्ति_library से डेटा ऑब्जेक्ट बनाता हूं तो यह मुझे nil @ahbou
Mansuu ....

आस्तियों को केवल AssetsLibrary या Photos.framework द्वारा नियंत्रित किया जाता है। एक परिसंपत्ति को पुनः प्राप्त करने के लिए आपको wealth.assetForURL {} को कॉल करना होगा इस विधि के लिए खोजें या एक नया प्रश्न पूछें क्योंकि यह एक अलग विषय है।
अब्बू

0

स्विफ्ट 3 के लिए मुझे निम्नलिखित URL सहायक से उत्तर मिला

(मैं फोनगैप प्लगइन का उपयोग करके छवि कैप्चर करने के बाद, निम्नलिखित पथ पा रहा था

फ़ाइल: ///var/mobile/Containers/Data/Application/B64B06DE-7976-45CF-9BE2-661F0F309A06/tmp/abcded.jpg)

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

अगर वीडियोलू = URL (स्ट्रिंग: urlString) होने दें, तो वीडोडाटा दें = कोशिश करें? डेटा (contentOf: videoURL) {// यहाँ Alamofire का कोड जोड़ें}


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.