前提・実現したいこと
コードファーストで、ファイルをアップロードし、最終的にDBに保存したいです。
こちらの質問では、まず表題のエラーを解決したいと思っております。
※以前、DBファーストでファイルのアップロード、データベースへの保存は、以下の記事を参考に、実装できました。
ファイルのアップロードを行うには?
ASP.NET MVCでアップロードしたファイルをデータベースに登録するには?
今回は、以下のサイトを参考に、ファイルアップロード方法を学んでいるところですが、その過程で表題のエラーが発生しました。
MVC でファイルのアップロード
発生している問題・エラーメッセージ
コントローラーファイルの
「Dim filename As String = path.GetFileName(postedFile.FileName)」
の箇所で、以下のエラーが発生しております。
添付画像も参照お願いします。
ローカル変数 'path' は宣言されているため、参照できません。
該当のソースコード
※UploadModels.vb(モデルファイル)
VisualBasic
1Public Class UploadModels 2 3 Public Property CustomId As String 4 5 Public Property PostedFile As HttpPostedFileBase 6 7End Class
※Upload.vbhtml(ビューファイル)
VisualBasic
1@modelType UploadToDB.UploadModels 2 3@Code 4 ViewData("Title") = "Upload" 5End Code 6 7<script type="text/javascript"> 8 //<![CDATA[ 9 $(function () { 10 $('#ajaxUpload').on('click', function (e) { 11 // FormData オブジェクトの利用 12 var fd = new FormData(document.querySelector("form")); 13 14 // 追加データを以下のようにして送信できる。フォーム 15 // データの一番最後に追加されて送信される 16 fd.append("CustomField", "This is some extra data"); 17 18 $.ajax({ 19 url: '/home/upload', 20 method: 'post', 21 data: fd, 22 processData: false, // jQuery にデータを処理させない 23 contentType: false // contentType を設定させない 24 }).done(function (response) { 25 $("#result").empty; 26 $("#result").text(response); 27 }).fail(function (jqXHR, textStatus, errorThrown) { 28 $("#result").empty; 29 $("#result").text('textStatus: ' + textStatus + 30 ', errorThrown: ' + errorThrown); 31 }); 32 }); 33 }); 34 //]]> 35</script> 36 37<h2>Upload</h2> 38 39<div> 40 @Using (Html.BeginForm("Upload", "Home", FormMethod.Post, New With {.enctype = "multipart/form-data"})) 41 'form 内の隠しフィールドは Ajax でも送信される。 42 'なので以下に設定したトークンは送信される。 43 'もちろんクッキーのトークンも送信されるので、アクションメソッドに [ValidateAntiForgeryToken] を付与すればCSRF の検証はできる 44 @Html.AntiForgeryToken() 45 46 'name 属性はモデルのクラスのプロパティ名と同じにしないとサーバー側でモデルバインディングされないので注意。 47 '大文字小文字は区別しない。 48 49 @<input type="file" name="postedfile" size="50" /> 50 @<button type="submit">送信</button> 51 52 @ViewBag.Result 53 54 End Using 55 56 <div> 57 <input type="button" id="ajaxUpload" value="Ajax Upload" /> 58 </div> 59 60</div>
※HomeController.vb(コントローラファイル)
VisualBasic
1Imports System 2Imports System.Collections.Generic 3Imports System.Linq 4Imports System.Web 5Imports System.Web.Mvc 6Imports System.ComponentModel.DataAnnotations 7Imports UploadToDB.UploadModels 8Imports System.IO 9 10Namespace UploadToDB.Controller 11 12 Public Class HomeController 13 Inherits System.Web.Mvc.Controller 14 15 Function Index() As ActionResult 16 Return View() 17 End Function 18 19 Function About() As ActionResult 20 ViewData("Message") = "Your application description page." 21 22 Return View() 23 End Function 24 25 Function Contact() As ActionResult 26 ViewData("Message") = "Your contact page." 27 28 Return View() 29 End Function 30 31 Public Function Upload() As ActionResult 32 Return View() 33 End Function 34 35 36 <HttpPost()> 37 <ValidateAntiForgeryToken()> 38 Public Function Upload(ByVal model As UploadModels) As ActionResult 39 Dim result As String = "" 40 Dim postedFile As HttpPostedFileBase = model.PostedFile 41 42 If postedFile IsNot Nothing AndAlso postedFile.ContentLength > 0 Then 43 Dim filename As String = path.GetFileName(postedFile.FileName) 44 Dim path As String = Server.MapPath("~/UploadedFiles") & "\" & filename 45 postedFile.SaveAs(path) 46 result = filename & " (" & postedFile.ContentType & ") - " + postedFile.ContentLength.ToString() & " bytes アップロード完了" 47 Else 48 result = "ファイルアップロードに失敗しました" 49 End If 50 51 If Request.IsAjaxRequest() Then 52 Return Content(result) 53 Else 54 ViewBag.Result = result 55 Return View() 56 End If 57 End Function 58 End Class 59 60End Namespace
※MyMvcContext.vb()コンテキストファイル)
VisualBasic
1Imports System.Data.Entity 2Imports UploadToDB 3 4Public Class MyMvcContext : Inherits DbContext 5 Public Property Photo As DbSet(Of UploadModels) ' Photoテーブル 6End Class
試したこと
エラー箇所を確認したところ、本来、参考サイトでは、「Path.GetFileName」となっている箇所が、「path.GetFileName」と
「p」が小文字になっていたので、入力ミスかと思い、修正しましたが、
修正箇所からカーソルが外れると、自動的に「path」に戻りました。
エラー文を調べたところ、「変数が宣言される前に使用されている際のエラー」とのことだったので、
「直後に、pathを宣言しているのに、直前にpathを使っているから表示されているエラー」だと思い、
そもそもなぜ、「Path」が「path」に変わるのかを考えました。
「Path.GetFileName」メソッド自体を調べると、
名前空間「System.IO」と書かれていましたが、こちらもコントローラの上部でImportできており、
手詰まりになってしまいました。
補足情報(FW/ツールのバージョンなど)
統合開発環境
Visual Studio2019
(言語:VB.NET、プロジェクトテンプレート:ASP.NET Webアプリケーション MVC)
MVCフレームワークのバージョン
5.2.7
使用PC
Windows10
※平日は仕事のため、返信が19:30以降になります。(22時以降は返信が翌日になることが多いです)
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/15 10:49
2020/07/15 12:20 編集