【ASP.NET MVC】【VB】 ASP.NET MVCによるファイルアップロード

ポイント

 * ファイルアップロードには、HttpPostedFileBase を使用する

サンプル

モデル

Namespace Models

    Public Class DemoFileUpLoadModel
        Public Property UploadedFile As HttpPostedFileBase
        Public Property Remarks As String
    End Class

    Public Class DemoFileUpLoadResultModel
        Public Property IdAndNames As Dictionary(Of String, String)
        Public Property Remarks As String
    End Class
End Namespace

コントローラ

DemoFileUpLoadController.vb
Imports System.IO
Imports System.Web.Mvc
Imports WebAppli.Models

Namespace Controllers
    Public Class DemoFileUpLoadController
        Inherits Controller

        Public Function Index() As ActionResult
            Return View()
        End Function

        <HttpPost>
        <ValidateAntiForgeryToken()>
        Public Function UploadFile(ByVal model As DemoFileUpLoadModel) As ActionResult
            Dim resultModel = Me.GetResultModel(model)

            Return View(resultModel)

        End Function

        Private Function GetResultModel(ByVal model As DemoFileUpLoadModel) As DemoFileUpLoadResultModel
            Dim resultModel = New DemoFileUpLoadResultModel

            resultModel.Remarks = model.Remarks

            Dim uploadedFile = model.UploadedFile
            ' アップロード先のパスを生成
            Dim upfile As String = Server.MapPath("~/App_Data/") _
                    & Path.GetFileName(uploadedFile.FileName)

            ' 同名のファイルが存在する場合はエラー
            If System.IO.File.Exists(upfile) Then
                ViewData("ResultMessage") = "同名のファイルが存在します。"
            Else
                ' 画像ファイルで同名のファイルが存在しない場合は保存処理
                uploadedFile.SaveAs(upfile)
                ViewData("ResultMessage") = String.Format(
                        "{0}をアップロードしました。", uploadedFile.FileName)

                Dim idAndNames = New Dictionary(Of String, String)
                ' 行ごとの配列として、テキストファイルの中身をすべて読み込む
                Dim lines As String() =
                    System.IO.File.ReadAllLines(upfile, System.Text.Encoding.GetEncoding("UTF-8"))
                For Each line In lines
                    ' カンマ区切りで分割して配列に格納する
                    Dim fileValues As String() = line.Split(","c)
                    idAndNames.Add(fileValues(0), fileValues(1))
                Next

                resultModel.IdAndNames = idAndNames

            End If

            Return resultModel
        End Function

    End Class
End Namespace

ビュー

Index.vbhtml
@ModelType WebAppli.Models.DemoFileUpLoadModel

@Code
    ViewData("Title") = "Index"
End Code

<h2>Demo for Upload File</h2>

@Using (Html.BeginForm(
                "UploadFile", "DemoFileUpLoad", FormMethod.Post,
                New With {.enctype = "multipart/form-data"}))
    @Html.AntiForgeryToken()
    @Html.TextAreaFor(Function(model) model.Remarks, 30, 5)
    @<input type = "file" name="@Html.NameFor(Function(model) model.UploadedFile)" />
    @<input type = "submit" value="アップロード" />

End Using
UploadFile.vbhtml
@ModelType WebAppli.Models.DemoFileUpLoadResultModel

@Code
    ViewData("Title") = "ResultView"
End Code

<h2>ResultView</h2>

@ViewData("ResultMessage")

@Model.Remarks<br>

@If IsNothing(Model.IdAndNames) Then
    @<div>Fileの中身が解読できず</div>
Else
    @For Each idAndName In Model.IdAndNames
    @<ul>
        <li>@idAndName.Key</li>
        <li>@idAndName.Value</li>
    </ul>
    Next
End If