باستخدام WebClient للحصول على الصور عن بعد وتنتج محبب متحركة ولا يمكن التعامل مع+PNG BMP

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

  •  20-08-2019
  •  | 
  •  

سؤال

تحيات!

أنا إنشاء "نموذج ويب" نموذج (ImageLaoder.aspx) التي ستعود صورة بحيث يمكن استخدامها مثل هذا المثال البسيط الأخرى نماذج ويب/صفحات الويب:

<img src="http://www.mydomain.com/ImageLoader.aspx?i=http://images.mydomain.com/img/a.jpg" />

حتى الآن, تحميل JPGs مع أية مشاكل ، ومع ذلك Gif نظرة "محبب" مقارنة orignals و Bmp و PNGs النتيجة في الاستثناء التالي:

النظام.وقت التشغيل.InteropServices.ExternalException:حدث خطأ عام في GDI+

قانون بلدي حتى الآن يبدو مثل هذا:

protected void Page_Load(object sender, EventArgs e)
{
    string l_filePath = Request.QueryString["i"];

    System.Drawing.Image l_image = GetImage(l_filePath);
    if (l_image != null)
    {
        System.Drawing.Imaging.ImageFormat l_imageFormat = DetermineImageFormat(l_filePath);
        WriteImageAsReponse(l_image, l_imageFormat);
    }
}

private System.Drawing.Image GetImage(string filePath)
{
    WebClient l_WebClient = new WebClient();
    byte[] l_imageBytes = l_WebClient.DownloadData(filePath);

    System.Drawing.Image l_image = null;
    using (MemoryStream l_MemStream = new MemoryStream(l_imageBytes, 0, l_imageBytes.Length))
    {
        l_MemStream.Write(l_imageBytes, 0, l_imageBytes.Length);
        l_image = System.Drawing.Image.FromStream(l_MemStream, true);
        l_MemStream.Close();
    }

    return l_image;
}

private System.Drawing.Imaging.ImageFormat DetermineImageFormat(string filePath)
{
    if (filePath.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase))
        return System.Drawing.Imaging.ImageFormat.Jpeg;
    else if (filePath.EndsWith(".gif", StringComparison.OrdinalIgnoreCase))
        return System.Drawing.Imaging.ImageFormat.Gif;
    else if (filePath.EndsWith(".png", StringComparison.OrdinalIgnoreCase))
        return System.Drawing.Imaging.ImageFormat.Png;
    else
        return System.Drawing.Imaging.ImageFormat.Bmp;
}

private void WriteImageAsReponse(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat imageFormat)
{
    if (image == null)
        return;

    System.Drawing.Bitmap l_outputBitMap = new Bitmap(image);

    if (imageFormat == System.Drawing.Imaging.ImageFormat.Jpeg)
        Response.ContentType = "image/jpg";
    else if (imageFormat == System.Drawing.Imaging.ImageFormat.Gif)
        Response.ContentType = "image/gif";
    else if (imageFormat == System.Drawing.Imaging.ImageFormat.Png)
        Response.ContentType = "image/png";
    else
        Response.ContentType = "image/bmp";

    l_outputBitMap.Save(Response.OutputStream, imageFormat);
}

أي أفكار لماذا متحركة محببة PNGs و Bmp يسبب استثناءات ؟

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

المحلول

بعض النقاط حول GetImage الطريقة:

  • عند استخدام الصورة.FromStream يجب أن لا وثيقة (أو التصرف) تيار
  • إذا كنت تدعو التصرف على تيار (مع استخدام البيان) لا تحتاج إلى الاتصال الوثيق
  • أنت الكتابة إلى تيار ، لكن ليس "اللف أنه" حتى l_image لا في الواقع الحصول على أي بيانات بقدر ما أستطيع أن أرى (إلا صورة.FromStream يعيد الموقف نفسه).(يمكن أن يكون ذلك gif/jpg فك الترجيع تيار ولكن bmp/png لا, وبالتالي الخطأ.)
  • لماذا لا يمكنك فقط استخدام MemoryStream منشئ الذي يأخذ صفيف بايت?

باختصار أعتقد GetImage الطريقة يمكن استبدال:

private Image GetImage(string filePath)
{
    WebClient l_WebClient = new WebClient();
    byte[] l_imageBytes = l_WebClient.DownloadData(filePath);
    MemoryStream l_stream = new MemoryStream(l_imageBytes);
    return Image.FromStream(l_stream);
}

الآن, الأهم من ذلك - لماذا تحميل الصورة ؟ لماذا لا تخدم الملف نفسه استجابة تحديد نوع المحتوى كما كنت تفعل الفعل - أو ربما تستند فقط على التمديد ؟ وبعبارة أخرى, كل من التعليمات البرمجية الخاصة بك سوف تصبح:

protected void Page_Load(object sender, EventArgs e)
{
    string filePath = Request.QueryString["i"];
    string extension = l_filePath.Substring(l_filePath.LastIndexOf('.') + 1);
    Response.ContentType = "image/" + extension;
    byte[] data = new WebClient.DownloadData(filePath);
    Response.OutputStream.Write(data, 0, data.Length);
    Response.End();
}

أكثر قليلا من معالجة الخطأ (بما في ذلك "هل هذا معقول التمديد؟") سيكون لطيفا, ولكن بخلاف ذلك اعتقد انه على ما يرام.الفائدة الوحيدة من الواقع تحميل صورة لنفسك هو أن تحصل على صحة ذلك حقا هو صورة بدلا من فيروس أو شيء من هذا القبيل.

تحرير:للفائدة فقط, هل لديك سبب وجيه لماذا تريد صورة الطلبات للذهاب من خلال الخادم الخاص بك ؟ لماذا صفحة ويب الكاتب كتابة:

<img src="http://www.mydomain.com/ImageLoader.aspx?i=http://images.mydomain.com/img/a.jpg" />

بدلا من

<img src="http://images.mydomain.com/img/a.jpg" />

هناك هي بعض الأسباب التي قد تكون مفيدة ، ولكن في كثير من الحالات مجرد نفايات.

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