2009-10-23 9 views
5

मैं छवियों को अपलोड करने के लिए एक AsyncFileUpload (AJAX टूलकिट) का उपयोग कर रहा हूं। मेरे पास एक बटन है जो छवि आकार बदलने को संभालता है। यह कुछ समय के लिए ठीक काम किया है, लेकिन अब नहीं ...छवि। फ्रॉमस्ट्रीम (PostFile.InputStream) विफल रहता है। (पैरामीटर वैध नहीं है।) (AsyncFileUpload))

protected void BtnUploadImage_Click(object sender, EventArgs e) 
{ 
    var imageFileNameRegEx = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)$", 
     RegexOptions.IgnoreCase); 
    if (!AsyncFileUpload1.HasFile || 
     !imageFileNameRegEx.IsMatch(AsyncFileUpload1.FileName)) 
    { 
     AsyncFileUpload1.FailedValidation = true; 
     ErrorLabel.Visible = true; 
     return; 
    } 
    ErrorLabel.Visible = false; 

    var file = AsyncFileUpload1.PostedFile.InputStream; 

    var img = Image.FromStream(file, false, false); 

... 
} 

एक और बात जो मैं अजीब लगता है: अगर मैं एक छवि है जो तुलना में छोटी है कोशिश 80kb यह काम करता है ..!

हमने सर्वर को पुनरारंभ करने का प्रयास किया है, लेकिन कोई बदलाव नहीं है। वही कोड मेरी मशीन पर ठीक चलाता है। (सुना है कि पहले ?? :))

मैंने फ़ाइल को फ़ाइल को सहेजने की कोशिश की, फिर फ़ाइल गड़बड़ पाने के लिए Image.FromFile(), लेकिन फिर मुझे "बंद फ़ाइल तक नहीं पहुंच सकता।"

इसे कैसे हल करें?

+0

आपके स्निपेट में कोड लापता है सुनिश्चित करें। –

+0

@ जोसेफ, मुझे लगता है कि फ़ंक्शन पर अंतिम ब्रेस जोड़ना गलत है, यह केवल वहां नहीं रुक सकता है, 'img' चर का उपयोग नहीं किया जाता है। –

+0

नहीं सोचा था कि बाकी प्रासंगिक था, छवि के बाद क्या होता है।FromStream() वैसे भी निष्पादित नहीं करता है। –

उत्तर

7

मुझे यकीन है कि धारा शुरू में तैनात किया जाता होगा: जांच करने के लिए

var file = AsyncFileUpload1.FileContent; 
file.Seek(0, SeekOrigin.Begin); 

var img = Image.FromFile(file); 

दूसरी बात: the requestLengthDiskThreshold सेटिंग। जब तक निर्दिष्ट नहीं किया गया है इस सेटिंग में डिफ़ॉल्ट है ... हाँ, 80 केबी।

नोट: चाहे आप छवि का उपयोग प्रत्यक्ष या फ़ाइल धारा को पढ़ने के लिए imo वहाँ कोई समग्र अंतर होना चाहिए आप तथ्य यह है कि बाद के मामले में आप वास्तव में स्मृति में पूरे फाइल लोड के अलावा अन्य एक मध्यवर्ती MemoryStream का उपयोग करता है, तो (दो बार)। किसी भी तरह से मूल फ़ाइल स्ट्रीम से पढ़ा जाएगा, इस प्रकार स्ट्रीम स्थिति, सीएएस अधिकार, फ़ाइल अनुमतियां, आदि अभी भी लागू होते हैं।

टिप्पणी 2: और हाँ, हर तरह से उन संसाधनों का ठीक से निपटारा कर रहे हैं :)

+1

धन्यवाद, यह एक आकर्षण की तरह काम करता है। मैंने HttRuntime सेटिंग्स को देखा था, लेकिन किसी भी तरह से अनुरोध LengthDiskThreshold सेटिंग पूरी तरह से अनदेखा किया। :( फिर भी आप दिन को बचाते हैं: डी –

+0

@ पीटर लिटिलवॉल्ड AJAX टूलकिट –

+0

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

1

यह सही है, यह काम नहीं करेगा। समस्या यह है कि आप एक प्रबंधित/अप्रबंधित सीमा पार कर रहे हैं, मुझे हाल ही में इसका सामना करना पड़ा। अन्य समस्याएं हैं कि स्ट्रीम सीधे और छवि नहीं है। फ्रॉमस्ट्रीम को पता नहीं है कि इससे कैसे निपटें।

समाधान काफी सरल है: पोस्टफाइल से मेमोरीस्ट्रीम में सबकुछ पढ़ें (बस new MemoryStream() का उपयोग करें) और Image.FromStream के साथ मेमोरीस्ट्रीम का उपयोग करें। यह आपकी समस्या का समाधान करेगा।

using के समुचित उपयोग सुनिश्चित करने के लिए जब आप के साथ Image, Graphics और Stream रों काम सुनिश्चित करें। उनमें से सभी IDISposable और ASP.NET वातावरण में लागू होते हैं, using ब्लॉक का सही उपयोग नहीं करते हैं, और लंबे समय तक स्मृति उपयोग और अन्य दुष्प्रभावों को बढ़ा सकते हैं (और एएसपी.नेट ऐप्स बहुत लंबे समय तक चलते हैं!)।

समाधान कुछ इस तरह दिखना चाहिए:

using(Stream memstr = new MemoryStream()) 
{ 
    // copy to a memory stream 
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream; 
    byte[] all = new byte[uploadStream.Length]; 
    uploadStream.Read(all, 0, uploadStream.Length); 
    memstr.Write(all, 0, uploadStream.Length); 
    memstr.Seek(0, SeekOrigin.Begin); 
    using(Graphics g = Graphics.FromStream(memstr)) 
    { 
     // do your img manipulation, or Save it. 
    } 
} 

अद्यतन: पार सीमा मुद्दे कामयाब (रिस्पांस धारा का प्रयोग करके), रिवर्स में ही होता है ऐसा लगता है अपलोड धाराओं के साथ नहीं है, लेकिन मैं मैं पूरी तरह से यकीन नहीं है।

+0

क्या आप मेमोरी स्ट्रीम में सभी बाइट्स को पढ़ने के तरीके पर एक उदाहरण प्रदान कर सकते हैं? –

+0

नोट: यह गारंटी नहीं है कि 'रीड' काम करता है। यदि नहीं, तो वापसी मूल्य में बाइट्स की मात्रा होती है जो वास्तव में पढ़ी जाती थीं। आप सभी कोडों को पढ़े जाने तक हमेशा 'रीड()', या लूप के वापसी मूल्य की जांच करके अपना कोड अधिक मजबूत बना सकते हैं। – Abel

+0

यह कोशिश की: स्ट्रिंग imageID; \t \t का उपयोग कर (वर mStream = नए MemoryStream()) \t { \t \t वर uploadStream = AsyncFileUpload1.PostedFile.InputStream; \t \t var all = new byte [uploadStream.Length]; \t \t uploadStream.Read (सभी, 0, (int) uploadStream.Length); \t \t mStream.Write (सभी, 0, (int) uploadStream.Length); \t \t mStream.Seek (0, SeekOrigin.Begin); \t \t का उपयोग कर (वर img = Image.FromStream (mStream)) \t \t { \t \t \t imageID = ImageCreation.SaveImage (img, सच); \t \t} \t} लेकिन मुझे {"पैरामीटर वैध नहीं है।"}, अभी भी छवि पर है। फ्रॉमस्ट्रीम। (अब भी स्थानीय मशीन पर) –

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