2008-09-05 17 views
13

क्या मेमोरीस्ट्रीम को एएसपी को बांधने का कोई तरीका है: छवि नियंत्रण?एएसपी के लिए मेमोरीस्ट्रीम कैसे बांधें: छवि नियंत्रण?

+0

। Http://imageresizing.net HttpModule इसे बहुत आसान बनाता है। –

+0

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

उत्तर

7

एक हैंडलर किसी अन्य अनुरोध की तरह एक uRL पैरामीटर को स्वीकार कर सकते हैं। तो अपने <asp:image/> से image.ashx को जोड़ने के बजाय आप इसे image.ashx?ImageID=[Your image ID here] पर सेट करेंगे।

+0

में हैंडलर बनाने के लिए लिखना नहीं है और http://imageresizing.net लाइब्रेरी आपके लिए यह करती है। –

40

सर्वश्रेष्ठ शर्त एक HttpHandler बनाने के लिए है जो छवि को वापस कर देगा। फिर एएसपी पर ImageUrl प्रॉपर्टी को बाध्य करें: HttpHandler के यूआरएल पर छवि।

यहां कुछ कोड है। ,

<%@ WebHandler Language="C#" Class="ImageHandler" %> 

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Web; 

public class ImageHandler : IHttpHandler 
{  
    public void ProcessRequest (HttpContext context) 
    { 
     context.Response.Clear(); 

     if (!String.IsNullOrEmpty(context.Request.QueryString["id"])) 
     { 
      int id = Int32.Parse(context.Request.QueryString["id"]); 

      // Now you have the id, do what you want with it, to get the right image 
      // More than likely, just pass it to the method, that builds the image 
      Image image = GetImage(id); 

      // Of course set this to whatever your format is of the image 
      context.Response.ContentType = "image/jpeg"; 
      // Save the image to the OutputStream 
      image.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     } 
     else 
     { 
      context.Response.ContentType = "text/html"; 
      context.Response.Write("<p>Need a valid id</p>"); 
     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 

    private Image GetImage(int id) 
    { 
     // Not sure how you are building your MemoryStream 
     // Once you have it, you just use the Image class to 
     // create the image from the stream. 
     MemoryStream stream = new MemoryStream(); 
     return Image.FromStream(stream); 
    } 
} 

अगला जहां एएसपी का उपयोग कर रहे बस अपने aspx पृष्ठ के अंदर इसे कहते:

पहले HttpHandler बनाने छवि।

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" /> 
     </div> 
    </form> 
</body> 
</html> 

और यही वह है।

+0

क्या एचटीपी हैंडलर के बिना ऐसा करने का कोई तरीका है, मेरे पास प्रोजेक्ट ' –

1

में हो सकता है asp.net से गतिशील छवियों उत्पन्न करने के लिए की जरूरत है जबकि एक छवि के लिए एक MemoryStream databinding संभव नहीं है पेजों में छवियों को एम्बेड करने के लिए लेबल/जेनेरिक कंट्रोल, कुछ कोड और data URI scheme का उपयोग करना संभव हो सकता है, लेकिन उस दृष्टिकोण के साथ गंभीर समस्याएं हैं:

नुकसान

  • एंबेडेड सामग्री निकाला जाता है और पहले परिवर्तन किया जा सकता है, तो फिर से इनकोडिंग और बाद में फिर से एम्बेडेड डीकोड किया जाना चाहिए।
  • कुकीज़ समर्थित नहीं हैं।
  • जानकारी जो कि एक से अधिक बार एम्बेडेड है, युक्त फ़ाइल के हिस्से के रूप में पुनः लोड किया गया है, और इस प्रकार ब्राउज़र के कैश से लाभ नहीं होता है।
  • ब्राउज़र यूआरआई लंबाई को सीमित कर सकते हैं, एक प्रभावी अधिकतम डेटा आकार बना सकते हैं। उदाहरण के लिए, ओपेरा के पिछले संस्करणों में यूआरआई 4kB की सीमा थी, और के लिए IE8 बीटा 1
  • डाटा एक साधारण धारा के रूप में शामिल किया गया है [जरूरत प्रशस्ति पत्र], और कई प्रसंस्करण वातावरण (जैसे कि वेब ब्राउज़र के रूप में) 32 केबी कंटेनरों का इस्तेमाल किया समर्थन नहीं कर सकते (जैसे मल्टीपार्ट/वैकल्पिक या संदेश/आरएफसी 822) मेटाडेटा, डेटा संपीड़न या सामग्री वार्ता जैसे अधिक जटिलता प्रदान करने के लिए।
  • माइक्रोसॉफ्ट के इंटरनेट एक्सप्लोरर, संस्करण 7 (2008 क्यू 2 के रूप में बाजार का लगभग 70%) के माध्यम से, समर्थन की कमी है।

बेहतर दृष्टिकोण एक अलग "Image.aspx" पृष्ठ जो लेता है और अपने MemoryStream आउटपुट, की तरह थोड़े मैं अपने फ़ोटो एल्बम सॉफ्टवेयर में किया था कि मैं बना लिया है जो मैं ASP.net सीखने शुरू कर दिया उपयोग करने के लिए है :

(Don't laugh, that was my first attempt at ASP.net :-)

संपादित करें: ashx पर सहमत, इसके बाद के संस्करण कोड सिर्फ एक नमूना कार्यान्वयन को दिखाने के लिए है। जब मैं फोटो एलबम को अपडेट करने के लिए चारों ओर आ जाता हूं, तो वह इसके लिए एएसएचएक्स का उपयोग करेगा।

2

@ विल और बेन ग्रिसवाल्ड: "image.aspx" के बजाय "image.ashx" का उपयोग करें।

यह पूर्ण एएसपी की तुलना में अधिक हल्का वजन है।नेट पेज, और यह विशेष रूप से टेक्स्ट/एचटीएमएल के अलावा सामग्री-प्रकारों को संभालने के लिए डिज़ाइन किया गया है।

0

नहीं।

लेकिन आप उस छवि को स्ट्रीम करने के लिए एक विशेष पृष्ठ बना सकते हैं। सबसे पहले, आप पेज कि है कि आप जानते हैं कि जहां छवि पाने के लिए कुछ यूआरएल मापदंडों सहित स्ट्रीमिंग, प्रदर्शन करने के लिए छवि का URL सेट करें:

<img src="GetImage.aspx?filename=foo" ... /> 

GetImage.aspx में, आप फ़ाइल नाम मिल (या जो भी) uRL से, अपने MemoryStream में छवि को लोड, और फिर HttpResponse के लिए सीधे कि स्मृति धारा की सामग्री के बारे में:

response.Expires = 0; 
    response.Buffer = false; 
    response.Clear(); 
    response.ClearHeaders(); 
    response.ClearContent(); 
    response.ContentType = "image/jpeg"; 
    response.BinaryWrite(stream); 
    response.Flush(); 
    response.Close(); 
0

मेरे लिए यह "बफ़र =" @Page को झूठा "जोड़ने के लिए जरूरी हो गया था नहीं तो मैं एक ही चित्र हर समय मिलती रहती हैं ...

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