[VB.NET] REST API⑧ Web APIでファイルをダウンロードする

2021年10月7日

コントローラーのGETメソッドを変更し、ファイルをダウンロードしてみましょう。
※ VisualStudio2019
APIプロジェクトの作成方法 についてはこちらを参照してください。
また、コントローラーの追加方法はこちらを参照してください。

テスト用のファイルを準備する

まずはダウンロードするCSVファイルを用意しましょう。

今回の例では、App_DataフォルダにCSVファイルを作成します。

「テキストファイル」を選択し、ファイル名を入力して「追加」をクリックします。

ファイル名は「Test.csv」としています。

CSVファイルの内容を作成します。

今回の例では、項目は「ID、部署番号、部署名」 としました。

CSVファイルの内容

ID,部署番号,部署名
1,A0001,総務部
2,B0002,営業部
3,C0003,開発部
4.D0004,法務部
5,E0005,経理部
6,F0006,人事部

ダウンロード用のメソッドを用意する

次に、コントローラーにファイル取得用のGETメソッドを実装しましょう。

デフォルトのコントローラーのコードは、以下のようになっています。

コード

Imports System.Net
Imports System.Web.Http

Public Class ApiTestController
    Inherits ApiController

    ' GET api/ApiTest
    Public Function GetValues() As IEnumerable(Of String)
        Return New String() {"value1", "value2"}
    End Function

    ' GET api/ApiTest/5
    Public Function GetValue(ByVal id As Integer) As String
        Return "value"
    End Function

    ' POST api/ApiTest
    Public Sub PostValue(<FromBody()> ByVal value As String)

    End Sub

    ' PUT api/ApiTest/5
    Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)

    End Sub

    ' DELETE api/ApiTest/5
    Public Sub DeleteValue(ByVal id As Integer)

    End Sub
End Class

コードを以下のように書き換えます。

メソッド名は「GetCsvFile」としています。

「HttpGet」「ActionName(“GetCsvFile")」という属性をメソッドに付けている点に注意してください。

コード

Imports System.Net
Imports System.Web.Http

Namespace Controllers
    Public Class ApiTestController
        Inherits ApiController

        ' GET: api/ApiTest
        Public Function GetValues(ByVal value As System.Net.Http.HttpRequestMessage) As IEnumerable(Of String)
            Return New String() {"value1", "value2"}
        End Function

        ' GET: api/ApiTest/5
        Public Function GetValue(ByVal id As Integer) As String
            Return "value"
        End Function

        ' POST: api/ApiTest
        Public Sub PostValue(<FromBody()> ByVal value As String)

        End Sub

        ' PUT: api/ApiTest/5
        Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)

        End Sub

        ' DELETE: api/ApiTest/5
        Public Sub DeleteValue(ByVal id As Integer)

        End Sub


        ' GET: api/ApiTest/GetCsvFile
        <HttpGet>
        <ActionName("GetCsvFile")>
        Public Function GetCsvFile(ByVal value As System.Net.Http.HttpRequestMessage) As System.Net.Http.HttpResponseMessage

            'App_DataのCSVファイルのパス
            Dim path As String
            path = HttpContext.Current.Server.MapPath("~/App_Data/Test.csv")

            'CSVファイルを読み込む
            Dim bytes() As Byte
            bytes = System.IO.File.ReadAllBytes(path)

            'レスポンスメッセージ作成
            Dim ret As System.Net.Http.HttpResponseMessage
            ret = New System.Net.Http.HttpResponseMessage(HttpStatusCode.OK)

            'コンテンツ
            ret.Content = New System.Net.Http.ByteArrayContent(bytes)

            'ファイル名
            ret.Content.Headers.ContentDisposition = New Http.Headers.ContentDispositionHeaderValue("attachment")
            ret.Content.Headers.ContentDisposition.FileName = "Test.csv"

            'コンテンツタイプ
            ret.Content.Headers.ContentType = New System.Net.Http.Headers.MediaTypeHeaderValue("text/csv")

            Return ret
        End Function
    End Class
End Namespace

次に、「App_Start」>「WebApiConfig.vb」のコードを開きます。

コードは以下のようになっています。

コード

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web.Http

Public Module WebApiConfig
    Public Sub Register(ByVal config As HttpConfiguration)
        ' Web API の設定およびサービス


        'jsonをブラウザで表示させる
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New System.Net.Http.Headers.MediaTypeHeaderValue("text/html"))


        ' Web API ルート
        config.MapHttpAttributeRoutes()

        config.Routes.MapHttpRoute(
            name:="DefaultApi",
            routeTemplate:="api/{controller}/{id}",
            defaults:=New With {.id = RouteParameter.Optional}
        )
    End Sub
End Module

ここに、「 GetCsvFile 」メソッドをマップするためのコードを追加します。

コード

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web.Http

Public Module WebApiConfig
    Public Sub Register(ByVal config As HttpConfiguration)
        ' Web API の設定およびサービス


        'jsonをブラウザで表示させる
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(New System.Net.Http.Headers.MediaTypeHeaderValue("text/html"))


        ' Web API ルート
        config.MapHttpAttributeRoutes()

        'ファイル取得用のAPI
        config.Routes.MapHttpRoute(
            name:="CustomApi",
            routeTemplate:="api/{controller}/{action}",
            defaults:=New With {.id = RouteParameter.Optional}
        )

        config.Routes.MapHttpRoute(
            name:="DefaultApi",
            routeTemplate:="api/{controller}/{id}",
            defaults:=New With {.id = RouteParameter.Optional}
        )
    End Sub
End Module

実行して確認する

ブラウザから 「 GetCsvFile 」 メソッドを呼び出して確認してみます。

実行方法はこちらでも紹介しています。

「Test.csv」ファイルがダウンロードされました。

ダウンロードしたファイルの内容

今回はWeb APIからファイルをダウンロードしてみました。
この例ではCSVファイルですが、PDFなど他のファイル形式でもダウンロードできます。