ポイント
* ファイルアップロードには、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