2009-03-11 20 views

Odpowiedz

14

Powinieneś być w stanie zwrócić obraz z akcji? Aby uzyskać więcej informacji, zobacz tutaj.

I tak, możesz używać Ashxa obok MVC (mówiąc mu, aby zignorować trasę) - ale nie jestem pewien, czy to najlepsze podejście, chyba że jest to ponowne wykorzystanie istniejącego kodu.


Niestety, ten link został usunięty. Zdarza się.

+0

(usunięte losy komentarzy były wyłączone) –

+5

[artykuł jest dostępny za pośrednictwem archiwum. kliknij tutaj] (http://web.archive.org/web/20090106030652/http://blog.rodj.org/archive/2008/09/24/asp.net-mvc-image-handler.aspx) –

31

Możesz także użyć tej klasy ImageResult, aby zwrócić obraz.

Nie potrzeba obsługi wystarczy utworzyć trasę, takich jak:

/ImageGenerator/{działania}/{ImageID}/

i zwracają ImageResult na żądanie.

public class ImageResult : ActionResult 
    { 
     public string SourceFilename { get; set; } 
     public MemoryStream SourceStream { get; set; } 
     public string ContentType { get; set; } 
     public ImageResult(string sourceFilename) 
     { 
      SourceFilename = sourceFilename; 
      ContentType = FileTypeHelper.GetContentType(SourceFilename); 
     } 
     public ImageResult(MemoryStream sourceStream, string contentType) 
     { 
      SourceStream = sourceStream; 
      ContentType = contentType; 
     } 
     public override void ExecuteResult(ControllerContext context) 
     { 
      var res = context.HttpContext.Response; 
      res.Clear(); 
      res.Cache.SetCacheability(HttpCacheability.NoCache); 
      res.ContentType = ContentType; 

      if (SourceStream != null) 
      { 
       SourceStream.WriteTo(res.OutputStream); 

      } 
      else 
      { 
       res.TransmitFile(SourceFilename); 
      } 

     } 


    } 

Aby użyć tego wykonaj następujące czynności w kontrolerze i dodać trasę do niego:

public ImageResult GetImage(int imageId) 
{ 
    // Database fetch of image details 
    var imageInfo = repository.Get<ImageInfo>(imageId); 
    return new ImageResult(imageInfo.FullFilename); 
} 

dodałem klasę pomocnika filetype TOO:

public static class FileTypeHelper 
{ 
    public static string GetContentType(string SourceFileName) 
    { 
     var extension = Path.GetExtension(SourceFileName).ToLower(); 
     switch (extension) 
     { 
      case ".ai": return "application/postscript"; 
      case ".aif": return "audio/x-aiff"; 
      case ".aifc": return "audio/x-aiff"; 
      case ".aiff": return "audio/x-aiff"; 
      case ".asc": return "text/plain"; 
      case ".au": return "audio/basic"; 
      case ".avi": return "video/x-msvideo"; 
      case ".bcpio": return "application/x-bcpio"; 
      case ".bin": return "application/octet-stream"; 
      case ".c": return "text/plain"; 
      case ".cc": return "text/plain"; 
      case ".ccad": return "application/clariscad"; 
      case ".cdf": return "application/x-netcdf"; 
      case ".class": return "application/octet-stream"; 
      case ".cpio": return "application/x-cpio"; 
      case ".cpp": return "text/plain"; 
      case ".cpt": return "application/mac-compactpro"; 
      case ".cs": return "text/plain"; 
      case ".csh": return "application/x-csh"; 
      case ".css": return "text/css"; 
      case ".dcr": return "application/x-director"; 
      case ".dir": return "application/x-director"; 
      case ".dms": return "application/octet-stream"; 
      case ".doc": return "application/msword"; 
      case ".drw": return "application/drafting"; 
      case ".dvi": return "application/x-dvi"; 
      case ".dwg": return "application/acad"; 
      case ".dxf": return "application/dxf"; 
      case ".dxr": return "application/x-director"; 
      case ".eps": return "application/postscript"; 
      case ".etx": return "text/x-setext"; 
      case ".exe": return "application/octet-stream"; 
      case ".ez": return "application/andrew-inset"; 
      case ".f": return "text/plain"; 
      case ".f90": return "text/plain"; 
      case ".fli": return "video/x-fli"; 
      case ".flv": return "video/x-flv"; 
      case ".gif": return "image/gif"; 
      case ".gtar": return "application/x-gtar"; 
      case ".gz": return "application/x-gzip"; 
      case ".h": return "text/plain"; 
      case ".hdf": return "application/x-hdf"; 
      case ".hh": return "text/plain"; 
      case ".hqx": return "application/mac-binhex40"; 
      case ".htm": return "text/html"; 
      case ".html": return "text/html"; 
      case ".ice": return "x-conference/x-cooltalk"; 
      case ".ief": return "image/ief"; 
      case ".iges": return "model/iges"; 
      case ".igs": return "model/iges"; 
      case ".ips": return "application/x-ipscript"; 
      case ".ipx": return "application/x-ipix"; 
      case ".jpe": return "image/jpeg"; 
      case ".jpeg": return "image/jpeg"; 
      case ".jpg": return "image/jpeg"; 
      case ".js": return "application/x-javascript"; 
      case ".kar": return "audio/midi"; 
      case ".latex": return "application/x-latex"; 
      case ".lha": return "application/octet-stream"; 
      case ".lsp": return "application/x-lisp"; 
      case ".lzh": return "application/octet-stream"; 
      case ".m": return "text/plain"; 
      case ".man": return "application/x-troff-man"; 
      case ".me": return "application/x-troff-me"; 
      case ".mesh": return "model/mesh"; 
      case ".mid": return "audio/midi"; 
      case ".midi": return "audio/midi"; 
      case ".mime": return "www/mime"; 
      case ".mov": return "video/quicktime"; 
      case ".movie": return "video/x-sgi-movie"; 
      case ".mp2": return "audio/mpeg"; 
      case ".mp3": return "audio/mpeg"; 
      case ".mpe": return "video/mpeg"; 
      case ".mpeg": return "video/mpeg"; 
      case ".mpg": return "video/mpeg"; 
      case ".mpga": return "audio/mpeg"; 
      case ".ms": return "application/x-troff-ms"; 
      case ".msh": return "model/mesh"; 
      case ".nc": return "application/x-netcdf"; 
      case ".oda": return "application/oda"; 
      case ".pbm": return "image/x-portable-bitmap"; 
      case ".pdb": return "chemical/x-pdb"; 
      case ".pdf": return "application/pdf"; 
      case ".pgm": return "image/x-portable-graymap"; 
      case ".pgn": return "application/x-chess-pgn"; 
      case ".png": return "image/png"; 
      case ".pnm": return "image/x-portable-anymap"; 
      case ".pot": return "application/mspowerpoint"; 
      case ".ppm": return "image/x-portable-pixmap"; 
      case ".pps": return "application/mspowerpoint"; 
      case ".ppt": return "application/mspowerpoint"; 
      case ".ppz": return "application/mspowerpoint"; 
      case ".pre": return "application/x-freelance"; 
      case ".prt": return "application/pro_eng"; 
      case ".ps": return "application/postscript"; 
      case ".qt": return "video/quicktime"; 
      case ".ra": return "audio/x-realaudio"; 
      case ".ram": return "audio/x-pn-realaudio"; 
      case ".ras": return "image/cmu-raster"; 
      case ".rgb": return "image/x-rgb"; 
      case ".rm": return "audio/x-pn-realaudio"; 
      case ".roff": return "application/x-troff"; 
      case ".rpm": return "audio/x-pn-realaudio-plugin"; 
      case ".rtf": return "text/rtf"; 
      case ".rtx": return "text/richtext"; 
      case ".scm": return "application/x-lotusscreencam"; 
      case ".set": return "application/set"; 
      case ".sgm": return "text/sgml"; 
      case ".sgml": return "text/sgml"; 
      case ".sh": return "application/x-sh"; 
      case ".shar": return "application/x-shar"; 
      case ".silo": return "model/mesh"; 
      case ".sit": return "application/x-stuffit"; 
      case ".skd": return "application/x-koan"; 
      case ".skm": return "application/x-koan"; 
      case ".skp": return "application/x-koan"; 
      case ".skt": return "application/x-koan"; 
      case ".smi": return "application/smil"; 
      case ".smil": return "application/smil"; 
      case ".snd": return "audio/basic"; 
      case ".sol": return "application/solids"; 
      case ".spl": return "application/x-futuresplash"; 
      case ".src": return "application/x-wais-source"; 
      case ".step": return "application/STEP"; 
      case ".stl": return "application/SLA"; 
      case ".stp": return "application/STEP"; 
      case ".sv4cpio": return "application/x-sv4cpio"; 
      case ".sv4crc": return "application/x-sv4crc"; 
      case ".swf": return "application/x-shockwave-flash"; 
      case ".t": return "application/x-troff"; 
      case ".tar": return "application/x-tar"; 
      case ".tcl": return "application/x-tcl"; 
      case ".tex": return "application/x-tex"; 
      case ".tif": return "image/tiff"; 
      case ".tiff": return "image/tiff"; 
      case ".tr": return "application/x-troff"; 
      case ".tsi": return "audio/TSP-audio"; 
      case ".tsp": return "application/dsptype"; 
      case ".tsv": return "text/tab-separated-values"; 
      case ".txt": return "text/plain"; 
      case ".unv": return "application/i-deas"; 
      case ".ustar": return "application/x-ustar"; 
      case ".vcd": return "application/x-cdlink"; 
      case ".vda": return "application/vda"; 
      case ".vrml": return "model/vrml"; 
      case ".wav": return "audio/x-wav"; 
      case ".wrl": return "model/vrml"; 
      case ".xbm": return "image/x-xbitmap"; 
      case ".xlc": return "application/vnd.ms-excel"; 
      case ".xll": return "application/vnd.ms-excel"; 
      case ".xlm": return "application/vnd.ms-excel"; 
      case ".xls": return "application/vnd.ms-excel"; 
      case ".xlw": return "application/vnd.ms-excel"; 
      case ".xml": return "text/xml"; 
      case ".xpm": return "image/x-xpixmap"; 
      case ".xwd": return "image/x-xwindowdump"; 
      case ".xyz": return "chemical/x-pdb"; 
      case ".zip": return "application/zip"; 
      default: return string.Format("application/{0}", extension); 
     } 
    } 
} 
+0

Ogólne handler jest 7,23 razy szybszy niż przy podejściu MVC. – Adeel

+0

@Adeel, czy masz próbki dla ogólnej obsługi? Nie wiem co masz na myśli. – Picflight

+0

@Richard, w jaki sposób używasz tego ImageResult? – Picflight

Powiązane problemy