صورة.FromStream(PostedFile.InputStream) فشل.(المعلمة غير صحيحة.) (AsyncFileUpload))
-
06-07-2019 - |
سؤال
انا استخدم 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
وStream
s. كل منهم تنفيذ 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.
}
}
<القوي> تحديث: كما معبر تمكن قضية الحدود يحدث فقط في الاتجاه المعاكس (باستخدام تيار الاستجابة)، على ما يبدو، وليس مع تيارات تحميل، لكنني لست متأكدا تماما
.