2010-02-12 12 views
14

Czy można wyświetlić obraz (lub dowolny typ pliku) w łączu pobierania, gdy użytkownik kliknie łącze z innej strony ASP.NET?ASP.NET Obraz zwrotny z łącza .aspx

Mam nazwę pliku i bajtu [].

<a href="getfile.aspx?id=1">Get File</a> 

... gdzie getfile zwraca plik zamiast do strony getfile.aspx.

Odpowiedz

19

co chcesz .ashx for that naprawdę;)

public class ImageHandler : IHttpHandler 
{ 
    public bool IsReusable { get { return true; } } 

    public void ProcessRequest(HttpContext ctx) 
    { 
    var myImage = GetImageSomeHow(); 
    ctx.Response.ContentType = "image/png"; 
    ctx.Response.OutputStream.Write(myImage); 
    } 
} 
+0

Czy istnieje dobry powód, aby użyć tego na stronie ASPX? –

+1

.aspx przejdzie przez cykl życia strony. .ashx jest tutaj lepszy, ponieważ nie ma takiej potrzeby, więc prawdopodobnie działa lepiej. Zobacz także: http: // stackoverflow.com/questions/5469491/aspx-vs-ashx-main-difference – ziya

1

Tak, trzeba wyczyścić odpowiedź całkowicie i zastąpić go z danymi obrazu bajtowych jako ciąg i trzeba się upewnić, aby ustawić nagłówek odpowiedzi dla zawartości typu w zależności od rodzaju obrazu

+0

Co zrobić, jeśli nie mam typ zawartości? –

+0

Wywód z rozszerzenia pliku. To wszystko system operacyjny robi mimo to (zmień rozszerzenie jpg na gif i zapytaj dowolną wbudowaną funkcję lub narzędzie, jaki to plik). – Rich

+2

Zgodnie z http://www.w3.org/Protocols/rfc1341/4_Content-Type.html i http://en.wikipedia.org/wiki/Internet_media_type powinieneś użyć "application/octet-stream" dla nieznanej treści -rodzaj. Ale jeśli Twoje zdjęcie zostanie wyświetlone na stronie, przeglądarka będzie musiała znać typ zawartości i musisz zrobić to, co mówi @Rich. Ale typ zawartości strumienia oktetowego zadziała, jeśli jedyne, co należy zapisać, to przeglądarka nie dba o to, co to jest. –

3

Oto jak zrobiłem to w przeszłości:

Response.Clear(); 
Response.Buffer = true; 
Response.AddHeader("Content-Disposition", string.Format("inline;filename=\"{0}.pdf\"",Guid.NewGuid())); 
Response.ContentType = @"application/pdf"; 
Response.WriteFile(path); 
+0

Posiadanie spacji między "inline;" i "nazwa pliku" wydawała się mieć znaczenie na moim serwerze –

5

How to Create Text Image on the fly with ASP.NET

coś takiego:

string Path = Server.MapPath(Request.ApplicationPath + "\image.jpg"); 
Bitmap bmp = CreateThumbnail(Path,Size,Size); 
Response.ContentType = "image/jpeg"; 
bmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg); 
bmp.Dispose(); 
+0

ashx jest najczęściej tym, czego potrzebujesz, ALE czasami naprawdę potrzebujesz strony aspx na przykład, jeśli używasz MapPageRoute, który nie akceptuje ashx. – Zyo

0

kod codebehind dla getfile.aspx musi mieć content-type i przeglądarka będzie wiedzieć, że jest to obraz lub nieznany plik i pozwoli go zapisać.

w ASP.NET można ustawić ContentType przy użyciu obiektu Response, tj

Response.ContentType = "image/GIF" 

Here masz poradnik dla dynamicznie generowanego obrazu

1

Tak, jest to możliwe. Istnieją dwie części obiektu Response, które należy ustawić: Content-Type i nagłówek HTTP. Obiekt MSDN documentation zawiera szczegóły obiektu odpowiedzi, ale główna koncepcja jest dość prosta. Po prostu ustaw kod na coś takiego (dla dokumentu Worda).

Response.ContentType="application/ms-word"; 
Response.AddHeader("content-disposition", "attachment; filename=download.doc"); 

Jest bardziej kompletny przykład here

0

ashx ...

public class ImageHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext ctx) 
    { 
     string path = ".....jpg"; 

       byte[] imgBytes = File.ReadAllBytes(path); 
       if (imgBytes.Length > 0) 
       { 
        ctx.Response.ContentType = "image/jpeg"; 
        ctx.Response.BinaryWrite(imgBytes); 
       } 
    } 

    public bool IsReusable 
    { 
     get {return false;} 
    } 
} 
Powiązane problemy