2009-06-30 8 views
7

मैं HTTP पर एक छवि, NSURLConnection का उपयोग कर हो रही है पर प्राप्त इस प्रकार है -iPhone - छवि के लिए भ्रष्ट जेपीईजी डेटा, HTTP

NSMutableData *receivedData; 

- (void)getImage { 
    self.receivedData = [[NSMutableData alloc] init]; 
    NSURLConnection *theConnection = // create connection 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {  
    [receivedData appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [connection release]; 

    UIImage *theImage = [UIImage imageWithData:receivedData]; 
} 

आमतौर पर यह सिर्फ ठीक काम करता है, लेकिन कभी कभी मैं इस लॉग इन करने के दिखाई दे रही है -: भ्रष्ट जेपीईजी डेटा: डेटा सेगमेंट का समयपूर्व अंत

इस बिंदु पर, छवि पूरी तरह से प्रस्तुत नहीं होती है। मैं शायद 75% देखूंगा, और फिर निचले दाएं कोने को एक ग्रे बॉक्स है।

इस पर फ़िक्सिंग करने के तरीके पर कोई विचार? क्या मैं अपनी छवि को अनुचित तरीके से बना रहा हूं?

+0

मैं कई छवियों को डाउनलोड कर रहा हूं और इसे अभी तक नहीं देखा है। क्या आप छवि बहुत बड़ी हैं? क्या यह अन्य उपकरणों (कंप्यूटर, सिम्युलेटर) पर होता है? –

+0

यह विशेष रूप से बड़ा नहीं है, नहीं। और मैं इसे आईफोन और सिम्युलेटर दोनों पर देखता हूं (लेकिन एक वेब ब्राउज़र के माध्यम से छवि को मारकर नहीं)। – bpapa

+0

कृपया अपने इंटरनेट कनेक्शन भी देखें। –

उत्तर

9

आपका HTTP कोड सही दिखता है। लोड होने के बाद आप प्राप्त डेटा के आकार को लॉग करना चाहते हैं और सर्वर पर छवि के अपेक्षित आकार की तुलना कर सकते हैं। यदि यह अपेक्षित आकार है, तो हो सकता है कि छवि स्वयं सर्वर पर दूषित हो।

+7

धन्यवाद, इससे बहुत मदद मिली। ऐसा करने से मुझे एहसास हुआ कि यह मेरी खुद की प्रोग्रामिंग त्रुटि थी (मैं गलती से दो बार अनुरोध को फायर कर रहा था)। – bpapa

+1

मैं बीपीपीए जैसा ही काम कर रहा था। ऐसा लगता है कि यदि आप एक ही यूआरएल में 2 अलग-अलग NSURLConnections लॉन्च करते हैं, तो अंतिम परिणाम दूषित डेटा होगा। – CornPuff

+1

मुझे एक ही समस्या मिली, और यह वास्तव में एक ही कारण से था: एक ही छवि के लिए 2 कनेक्शन। –

1

मैंने इसे भी देखा है। यदि आप डेटा को किसी फ़ाइल में सहेजते हैं और फिर डेटा को किसी छवि में वापस पढ़ते हैं, तो यह पूरी तरह से काम करता है। मुझे संदेह है कि जेपीईजी छवि डेटा में http शीर्षलेख जानकारी है।

आशा है कि किसी को इसका समाधान मिल जाए क्योंकि काम करने के लिए सहेजने के लिए सहेजना बेकार है।

// problem 

UIImage *newImage = [UIImage imageWithData:receivedData]; 

// crappy workaround 

[receivedData writeToFile:[NSString stringWithFormat:@"a.jpg"] atomically:NO]; 
UIImage *newImage = [UIImage imageWithContentsOfFile:@"a.jpg"];
+0

कोशिश की और यह कुछ भी नहीं बदलता – Abramodj

3

एएसआई-HTTP इस समस्या को ठीक कर सकते हैं।

NSURL *coverRequestUrl = [NSURL URLWithString:imageStringURL]; 
ASIHTTPRequest *coverRequest = [[ASIHTTPRequest alloc] initWithURL:coverRequestUrl]; 
[coverRequest setDelegate:self]; 
[coverRequest setDidFinishSelector:@selector(imageRecieved:)]; 

[appDelegate.queue addOperation:coverRequest]; 
[appDelegate.queue go]; 

ऐपडिलेगेट में मेरी कतार परिवर्तक ASINetwork कतार वस्तु है। क्योंकि मैं एसिंक्रोनस अनुरोध भेजता हूं, इसलिए मैं इसका उपयोग करता हूं।

- (void)imageRecieved:(ASIHTTPRequest *)response 
{ 
    UIImage *myImage = [UIImage imageWithData:[response responseData]]; 
} 
2

मैंने एनएसएमयूटेबल डिक्शनरी का उपयोग करके इस समस्या को ठीक किया।

NSMutableDictionary *dataDictionary; 

मेरी loadData समारोह में, मैं अपने डेटा को परिभाषित:

NSMutableData *receivedData = receivedData = [[NSMutableData alloc] init]; 

तब मैं अपने शब्दकोश में डेटा लोड जहां कुंजी [theConnection विवरण] है और वस्तु अपने डेटा है।

[dataDictionary setObject:receivedData forKey:[theConnection description]]; 

प्रतिनिधियों में इस तरह, मैं कनेक्शन है कि प्रतिनिधि को पारित कर दिया है के लिए सही डेटा वस्तु को देखने और नहीं तो मैं जेपीईजी munging/भ्रष्टाचार समस्या के साथ अंत सही डेटा उदाहरण के लिए बचा सकते हैं।

didReceiveData में, मैं डाल:

//get the object for the connection that has been passed to connectionDidRecieveData and that object will be the data variable for that instance of the connection. 
NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]]; 

//then act on that data 
[theReceivedData appendData:data]; 

इसी तरह, didReceiveResponse में, मैं डाल:

NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]]; 
[theReceivedData setLength:0]; 

और connectionDidFinishLoading में: NSMutableData * theReceivedData = [dataDictionary objectForKey: [कनेक्शन विवरण]] ; आईएमजी = [[यूआईएममेज एलोक] initWithData: theReceivedData];

और ऐसा लगता है कि यह बहुत अच्छा काम करता है। वैसे, मेरा कोड व्यक्तिगत कनेक्शन का ट्रैक रखने के लिए एनएसएमयूटेबल डिक्शनरी के अतिरिक्त Apple's tutorial for NSUrlConnection पर आधारित है। आशा है कि ये आपकी मदद करेगा। अगर आप मुझे अपना पूरा चित्र हैंडलिंग कोड पोस्ट करना चाहते हैं तो मुझे बताएं।

+0

मैं एक ही विधि का उपयोग करता हूं। बहुत अच्छा काम करता है। हालांकि अनुरोध भेजने से पहले शब्दकोश में डेटा ऑब्जेक्ट आवंटित करना और इनिट करना सुनिश्चित करें। अन्यथा आप एक ही गलती के साथ खत्म हो जाएगा – JWKothe

0

receivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length] का उपयोग कर एनएसडीटा सामग्री की प्रतिलिपि भी उपयोगी हो सकती है (और यह डिस्क से सहेजने और पढ़ने से अधिक कुशल है)।

इसका एक संभावित कारण यह है कि मूल प्राप्तडेटा ऑब्जेक्ट अपनी सामग्री को बनाए रखता नहीं है (उदाहरण के लिए [NSData dataWithBytesNoCopy:length:] का उपयोग करते समय बनाया गया) और आप उन्हें मुक्त होने के बाद पढ़ने की कोशिश करते हैं।

यह संभावना है कि जब आप NSData ऑब्जेक्ट को बनाए गए थ्रेड से किसी अन्य थ्रेड पर इस समस्या का सामना करते हैं।

संबंधित मुद्दे