[ASP.NET MVC] 画像を返す(ファイルを返す)

DevelopmentASP.NET, Visual Basic

プロ生ちゃんダミー画像生成サービス など画像を生成するジェネレーター系などのサービスで、コントローラーで画像を返す方法です。画像以外にも応用できます。

サーバーにある画像ファイルを返す

FileStreamResult を使って MemoryStream の内容を返します。

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

view raw
SampleController.vb
hosted with ❤ by GitHub

個の例では、 /Image にアクセスすると App_Data/images/sample.png の内容をそのまま返します。ジェネレーター系は、生成した Bitmap や加工をした Bitmap を返せば OK ですね。

他サイトからのアクセスを拒否する

自サイトでのみ利用する API 的なものであれば、気休め程度ですが Referrer が自サイトでない場合は、拒否するといったこともできます。

If Request.UrlReferrer Is Nothing OrElse Request.UrlReferrer.Host <> Request.Url.Host Then
Response.StatusCode = HttpStatusCode.BadRequest
Return New EmptyResult
End If

view raw
SampleController.vb
hosted with ❤ by GitHub

Web から読み込んだデータをそのまま返す

指定した URL から読み込んだデータをそのまま返す例です。この場合、Response.OutputStream に直接、リクエストのレスポンス結果を指定しています。

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

view raw
SampleController.vb
hosted with ❤ by GitHub

このような処理は、HTML5 の Canvas に Web から読み取った画像を描画して、さらに保存する場合など、セキュリティ例外を回避するために必要だったりします。timg: Twitter 画像検索・画像一覧 & まとめてダウンロード で利用しています。