2010-01-03 19 views
6

मेरी प्रोजेक्ट में, मैंने उपयोगकर्ताओं को FileReference क्लास का उपयोग करके चित्रों को चुनने दिया। मैं लोड() फ़ंक्शन का उपयोग करके इन चित्रों को उनके .डेट गुणों में लोड करता हूं। इसके बाद मैं कुछ स्थानीय हेरफेर करता हूं और उन्हें सर्वर पर भेजता हूं।फ्लेक्स: फ़ाइल प्रोजेक्शन की दीप कॉपी (

मैं क्या करना चाहता हूं, चुने गए फ़ाइल संदर्भों को फिर से चलाने में सक्षम होना, उन्हें डेटा गुणों में लोड करना, अलग-अलग हेरफेर करना और उन्हें एक बार फिर सर्वर पर भेजना है। मुझे पता है कि मुझे उपयोगकर्ता द्वारा आमंत्रित घटना से ऐसा करने में सक्षम होना चाहिए, यह यहां कोई मुद्दा नहीं है।

समस्या यह है कि, फ़ाइल रीफरेंस पहली बार लोड होने के बाद, मैं इसे किसी भी तरह से अनलोड नहीं कर सकता, और मैं स्मृति में सभी चित्रों के लिए डेटा नहीं रख सकता क्योंकि ये बहुत बड़े हैं।

तो मुझे लगता है कि केवल एक चीज है जो मैं कर सकता हूं, जो फ़ाइल संदर्भ पर दीप कॉपी कर रहा है ... फिर मैं पहला संस्करण लोड कर सकता हूं, इसे स्क्रैप कर सकता हूं और दूसरी 'रन' के लिए प्रतिलिपि का उपयोग कर सकता हूं।

मैंने ObjectUtil.copy का उपयोग करने का प्रयास किया, लेकिन जब मैं उदा।

Error #2037: Functions called in incorrect sequence, or earlier call was unsuccessful. 
flash.net::FileReference/get नाम() पर

प्रासंगिक स्निपेट:

registerClassAlias("FileReference",FileReference); 
masterFileList.addItem(FileReference(ObjectUtil.copy(fr_load.fileList[i]))); 
trace(masterFileList[i].name) 

यह सच है कि वहाँ है नकल की .name संपत्ति, इसके साथ विफल रहता है FileReference क्लास के कुछ संरक्षित गुण हैं जो इसे कॉपी करने से रोकते हैं? यदि ऐसा है, तो क्या मैं इसे किसी भी तरह से हटा सकता हूं? या क्या मेरी समग्र समस्या का कोई अन्य समाधान है?

मैं किसी भी संकेत/विचारों की सराहना करता हूं!

+0

मैं इसे actionscript.org पर लाया और थोड़ा और विस्तार किया, लेकिन अभी भी कोई उम्मीद नहीं है। वैसे भी यहां धागा है: http://www.actionscript.org/forums/showthread.php3?t=227441 – supo

+0

मुझे लगता है कि यह नहीं किया जा सकता है, क्योंकि शायद फ़ाइल रिफरेंस ऑब्जेक्ट में कुछ हैंडल हैं जो पहुंच योग्य नहीं हैं एक्शनस्क्रिप्ट का उपयोग कर बिल्कुल। अगर मुझे एक्शनस्क्रिप्ट में फ़ाइल रेफरेंस क्लास भी लागू नहीं किया गया तो मुझे आश्चर्य नहीं होगा। –

उत्तर

1

आप ऑब्जेक्टयूटिल.copy का उपयोग नहीं कर सकते हैं। यह विधि केवल डेटा ऑब्जेक्ट्स (वीओ कक्षाओं) की प्रतिलिपि बनाने के लिए डिज़ाइन की गई है।

आपको एक नया फ़ाइल संदर्भ बनाना चाहिए और porperties की प्रतिलिपि बनाना चाहिए, एक-एक करके। ऐसा करने के लिए एक फ़ंक्शन बनाएं ..

+0

हाय, उत्तर के लिए धन्यवाद। लेकिन क्या आपने कभी ऐसा फ़ाइल रेफरेंस ऑब्जेक्ट कॉपी करने का प्रयास किया है? मेरा मतलब है, महत्वपूर्ण गुण शायद संरक्षित हैं और एक बार सार्वजनिक होने पर ही पढ़ा जा सकता है। आप लोड() एफआर के बाद ही .data तक पहुंच सकते हैं, ताकि आप इसके बाद डेटा कॉपी कर सकें। लेकिन यह वही नहीं है जो मैं चाहता था। मुझे इसे लोड करने से पहले इसे कॉपी करने की आवश्यकता है। इस तरह मैं इसे पहले रन में और दूसरे रन में अलग से लोड कर सकता हूं। – supo

1

इसे एक अस्थायी फ़ाइल में कॉपी करना और फिर अस्थायी फ़ाइल कार्य अपलोड करना होगा? उदाहरण के लिए

 var fileRef:FileReference = new FileReference(); 
     fileRef.browse(); 

     ...................... 

     var tmpFile:File = File.createTempFile(); 
     try { 
      var tmpFileStream:FileStream = new FileStream(); 
      tmpFileStream.open(tmpFile, FileMode.WRITE); 
      trace("Opened file: " + tmpFile.nativePath); 
      tmpFileStream.writeBytes(fileRef.data); 
      trace("copied file"); 
     } catch (error:Error) { 
      trace("Unable to open file " + tmpFile.nativePath + "\n"); 
      throw error; 
     } 
+0

क्या आप स्मृति में पूर्ण गुणवत्ता में सभी चित्रों को संग्रहीत करने और फिर स्मृति से अपलोड करने का सुझाव देते हैं? यह मदद करने वाला नहीं है, क्योंकि यहां तक ​​कि छवियों की छोटी संख्या (जैसे 10) भी सर्वोत्तम गुणवत्ता के नहीं हैं (चलिए 3 एमबी/प्रत्येक कहते हैं) कुछ सैकड़ों मेगाबाइट रैम लेते हैं, भले ही मैं उन्हें जेपीईजी और स्टोर में एन्कोड करता हूं उसके बाद उन्हें। और मैं 100 छवियों या उससे अधिक के साथ काम करना चाहता हूं। – supo

+0

हम्म एक सेकंड प्रतीक्षा करें, अब मैंने देखा है कि आप वहां एक फाइल बना रहे हैं। एईआर के लिए बाध्य TempFile नहीं बना है? मैं इसका उल्लेख करने में असफल रहा, लेकिन यह एक एआईआर आवेदन नहीं है। – supo

1

मुझे लगता है कि ऑपरेशन पूरी तरह से अस्वीकार कर दिया गया है, अच्छे कारणों से। यदि आप एक्शनस्क्रिप्ट कोड के माध्यम से एक नया फ़ाइल रेफरेंस डुप्लिकेट कर सकते हैं, तो आप एक्शनस्क्रिप्ट कोड के माध्यम से एक फ़ाइल रेफरेंस ऑब्जेक्ट का निर्माण करने में भी सक्षम होंगे। बेशक, यह एक बहुत ही खराब सुरक्षा छेद होगा यदि आप एक मनमानी फ़ाइल अपलोड करने के लिए मजबूर कर सकते हैं।

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

इस समस्या का एक पूरी तरह से अलग संभावित समाधान फ्लेक्स द्वारा छवि कुशलता से बचने के लिए है। फ्लेक्स अपलोड की गई फ़ाइल को सीधे सर्वर पर पोस्ट कर सकता है, और सर्वर छवि मैनिपुलेशन स्वयं ही कर सकता है। बेशक, यदि मैनिपुलेशन उपयोगकर्ता इंटरैक्शन के माध्यम से संचालित होता है, तो वह बिल्कुल काम नहीं करेगा।

+0

कुछ सौ अतिरिक्त एमबी? AFAIK कोई तरीका नहीं है कि मैं 50 एमबी रैम से कम में 1 तस्वीर स्टोर कर सकता हूं। डिस्क पर संकुचित होने पर ये चित्र jpegs और वजन 1-5MB हैं। मैं कम से कम 100 चित्रों के साथ काम करना चाहता हूं, जो इसे 5 जीबी रैम बनाता है, जो किसी भी माध्यम से स्वीकार्य नहीं है। आपके द्वारा सुझाए गए अन्य विकल्प ने भी मुझे बताया। हेरफेर उपयोगकर्ता संचालित नहीं है, लेकिन इस दृष्टिकोण के लिए उपयोगकर्ता को तब तक इंतजार करना होगा जब तक कि सभी चित्र अच्छी गुणवत्ता में अपलोड नहीं हो जाते हैं और इसमें एक घंटे लग सकते हैं। मैं उपयोगकर्ता को ऐप के साथ अपने काम की शुरुआत में लंबे समय तक इंतजार नहीं करना चाहता हूं .. – supo

+0

यदि आप रैम में छवियों को अधिक कुशलता से स्टोर करने का तरीका सुझा सकते हैं, तो यह अच्छा होगा। अब तक मैंने बुनियादी बिटमैप्स की कोशिश की है जो बेवकूफ है और फिर मैंने उन्हें जेपीईजी को एन्कोड करने और बाइट्स के रूप में स्टोर करने की कोशिश की .. – supo

+0

आपको एक ही समय में सभी सैकड़ों चित्रों को स्टोर नहीं करना पड़ेगा। आप एक बार में एक को संसाधित कर सकते हैं, आप प्रत्येक के साथ खत्म करने के बाद अस्थायी बफर जारी कर सकते हैं। – Jacob

1

मैं लगभग वही करने की कोशिश कर रहा था जो आप कर रहे थे, और मैंने कुछ जवाब पढ़ने के बाद लगभग छोड़ दिया, लेकिन मुझे लगता है कि मुझे ऐसा करने का कोई तरीका मिला है।मैंने पाया है कि यदि आपके पास फ़ाइल रेफरेंस ऑब्जेक्ट है, तो यदि आप load() कई बार कॉल करते हैं, तो यह काम करेगा, लेकिन मुख्य समस्या यह है कि आप पहले लोड के बाद मेमोरी में हाई-रेज बाइट्स रख रहे हैं। जैसा कि आपने उल्लेख किया है, उन लोगों के लिए जो छवि प्रसंस्करण नहीं जानते हैं, यह एक बड़ा नो-नो है।

इस के आसपास जाने का तरीका यह है कि आपके पहले load() के बाद, आपको FileReference पर cancel() विधि कॉल करने की आवश्यकता है। अब तक मेरे परीक्षण से, ऐसा लगता है कि FileReference में बाइट को साफ़ कर देगा, और load() अभी भी काम करेगा यदि आप इसे दूसरी बार कॉल करते हैं। मैंने अभी तक अपने सिस्टम पर अभी कोशिश की है, लेकिन यह ठीक काम करता है। सावधानी बरतने का एक शब्द, यह एपीआई में स्पष्ट रूप से परिभाषित व्यवहार नहीं है, इसलिए यह निश्चित रूप से परिवर्तन के अधीन है, लेकिन यह आपको उस समय प्राप्त करने में सहायता कर सकता है जहां आपको औसत समय में जाना है।

उम्मीद है कि मदद करता है।