[ASP.NET MVC] 画像を返す(ファイルを返す)
プロ生ちゃんダミー画像生成サービス など画像を生成するジェネレーター系などのサービスで、コントローラーで画像を返す方法です。画像以外にも応用できます。
サーバーにある画像ファイルを返す
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 |
個の例では、 /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 |
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 |
このような処理は、HTML5 の Canvas に Web から読み取った画像を描画して、さらに保存する場合など、セキュリティ例外を回避するために必要だったりします。timg: Twitter 画像検索・画像一覧 & まとめてダウンロード で利用しています。