صورة.FromStream(PostedFile.InputStream) فشل.(المعلمة غير صحيحة.) (AsyncFileUpload))

StackOverflow https://stackoverflow.com/questions/1614773

سؤال

انا استخدم AsyncFileUpload (AJAX Toolkit) لتحميل الصور.لدي زر التعامل مع حجم الصورة.هذا وقد عملت غرامة لبعض الوقت ، ولكن ليس بعد الآن...

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 يعمل..!

حاولنا إعادة تشغيل الملقم ، ولكن أي تغيير.نفس الكود يعمل بشكل جيد على الجهاز الخاص بي.(سمعت هذا من قبل ؟ :) )

كما أنني حاولت حفظ الملف على الخادم ، ثم الحصول على ملف الحوض الصورة.FromFile () ، ولكن بعد ذلك الحصول على "لا يمكن الوصول إلى إغلاق الملف."

كيفية حل هذا ؟

هل كانت مفيدة؟

المحلول

وأود أن تأكد من تيار المتمركزة في البداية:

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

var img = Image.FromFile(file);

الشيء الثاني أن تحقق: على requestLengthDiskThreshold الإعداد.ما لم يحدد هذا الإعداد الافتراضي ...نعم 80 كيلو بايت.

ملاحظة: المنظمة البحرية الدولية يجب أن يكون هناك عموما الفرق ما إذا كنت تريد استخدام صورة لقراءة الملف تيار مباشرة أو إذا كنت تستخدم وسيطة MemoryStream (عدا حقيقة أنه في الحالة الأخيرة قمت فعلا بتحميل الملف بأكمله في الذاكرة مرتين).وفي كلتا الحالتين الملف الأصلي تيار سيتم قراءة من ، وبالتالي تيار الموقف ، CAS حقوق أذونات الملف ، وما إلى ذلك لا يزال ساريا.

Note2: ونعم بكل الوسائل تأكد من هذه الموارد يتم التخلص منها بشكل صحيح :)

نصائح أخرى

وهذا هو الصحيح، فهو لن يعمل. المشكلة هي أنك عبور تمكن / غير المدارة الحدود، واجهت في الآونة الأخيرة نفسها. مشاكل أخرى هي أن التيار ليس مباشرة هناك وImage.FromStream ليس لديه فكرة عن كيفية التعامل معها.

والحل واضح وصريح للغاية: قراءة كل شيء من PostedFile إلى MemoryStream (مجرد استخدام new MemoryStream()) واستخدام MemoryStream مع Image.FromStream. وهذا حل مشكلتك.

تأكد من أن يجعل الاستخدام السليم للusing عند العمل مع Image، Graphics وStreams. كل منهم تنفيذ IDisposable وفي بيئة ASP.NET، وليس باستخدام كتل using بشكل صحيح، يمكن وسوف يؤدي إلى زيادة استخدام الذاكرة وغيرها من الآثار الجانبية السيئة على المدى الطويل (وتطبيقات ASP.NET لا تعمل منذ فترة طويلة جدا!).

والحل ينبغي أن ننظر بشيء من هذا القبيل:

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.
    }
}

<القوي> تحديث: كما معبر تمكن قضية الحدود يحدث فقط في الاتجاه المعاكس (باستخدام تيار الاستجابة)، على ما يبدو، وليس مع تيارات تحميل، لكنني لست متأكدا تماما

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top