[ASP.NET MVC] 画像を返す(ファイルを返す)
プロ生ちゃんダミー画像生成サービス など画像を生成するジェネレーター系などのサービスで、コントローラーで画像を返す方法です。画像以外にも応用できます。
サーバーにある画像ファイルを返す
FileStreamResult を使って MemoryStream の内容を返します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function Image() As ActionResult | |
Dim path = Server.MapPath("~/App_Data/images/") | |
Dim bmp = New Bitmap(IO.Path.Combine(path, "sample.png")) | |
Dim ms = New MemoryStream() | |
bmp.Save(ms, Imaging.ImageFormat.Png) | |
bmp.Dispose() | |
ms.Position = 0 | |
Return New FileStreamResult(ms, "image/png") | |
End Function |
個の例では、 /Image にアクセスすると App_Data/images/sample.png の内容をそのまま返します。ジェネレーター系は、生成した Bitmap や加工をした Bitmap を返せば OK ですね。
他サイトからのアクセスを拒否する
自サイトでのみ利用する API 的なものであれば、気休め程度ですが Referrer が自サイトでない場合は、拒否するといったこともできます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
If Request.UrlReferrer Is Nothing OrElse Request.UrlReferrer.Host <> Request.Url.Host Then | |
Response.StatusCode = HttpStatusCode.BadRequest | |
Return New EmptyResult | |
End If |
Web から読み込んだデータをそのまま返す
指定した URL から読み込んだデータをそのまま返す例です。この場合、Response.OutputStream に直接、リクエストのレスポンス結果を指定しています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function FileStream(url As String) As ActionResult | |
Try | |
Dim req = HttpWebRequest.CreateHttp(url) | |
Dim res = DirectCast(req.GetResponse, HttpWebResponse) | |
Response.ContentType = res.ContentType | |
res.GetResponseStream.CopyTo(Response.OutputStream) | |
Catch ex As WebException | |
If ex.Status = System.Net.WebExceptionStatus.ProtocolError Then | |
Dim r = DirectCast(ex.Response, System.Net.HttpWebResponse) | |
Response.StatusCode = r.StatusCode | |
End If | |
End Try | |
Return New EmptyResult | |
End Function |
このような処理は、HTML5 の Canvas に Web から読み取った画像を描画して、さらに保存する場合など、セキュリティ例外を回避するために必要だったりします。timg: Twitter 画像検索・画像一覧 & まとめてダウンロード で利用しています。