質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

解決済

Path.GetFileNameが使えません。

Eltk
Eltk

総合スコア51

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

3回答

0リアクション

0クリップ

2059閲覧

投稿2020/07/14 12:40

前提・実現したいこと

コードファーストで、ファイルをアップロードし、最終的にDBに保存したいです。
こちらの質問では、まず表題のエラーを解決したいと思っております。

※以前、DBファーストでファイルのアップロード、データベースへの保存は、以下の記事を参考に、実装できました。
ファイルのアップロードを行うには?
ASP.NET MVCでアップロードしたファイルをデータベースに登録するには?

今回は、以下のサイトを参考に、ファイルアップロード方法を学んでいるところですが、その過程で表題のエラーが発生しました。
MVC でファイルのアップロード

発生している問題・エラーメッセージ

コントローラーファイルの
「Dim filename As String = path.GetFileName(postedFile.FileName)」
の箇所で、以下のエラーが発生しております。
添付画像も参照お願いします。

ローカル変数 'path' は宣言されているため、参照できません。

該当のソースコード

※UploadModels.vb(モデルファイル)

VisualBasic

Public Class UploadModels Public Property CustomId As String Public Property PostedFile As HttpPostedFileBase End Class

※Upload.vbhtml(ビューファイル)

VisualBasic

@modelType UploadToDB.UploadModels @Code ViewData("Title") = "Upload" End Code <script type="text/javascript"> //<![CDATA[ $(function () { $('#ajaxUpload').on('click', function (e) { // FormData オブジェクトの利用 var fd = new FormData(document.querySelector("form")); // 追加データを以下のようにして送信できる。フォーム // データの一番最後に追加されて送信される fd.append("CustomField", "This is some extra data"); $.ajax({ url: '/home/upload', method: 'post', data: fd, processData: false, // jQuery にデータを処理させない contentType: false // contentType を設定させない }).done(function (response) { $("#result").empty; $("#result").text(response); }).fail(function (jqXHR, textStatus, errorThrown) { $("#result").empty; $("#result").text('textStatus: ' + textStatus + ', errorThrown: ' + errorThrown); }); }); }); //]]> </script> <h2>Upload</h2> <div> @Using (Html.BeginForm("Upload", "Home", FormMethod.Post, New With {.enctype = "multipart/form-data"})) 'form 内の隠しフィールドは Ajax でも送信される。 'なので以下に設定したトークンは送信される。 'もちろんクッキーのトークンも送信されるので、アクションメソッドに [ValidateAntiForgeryToken] を付与すればCSRF の検証はできる @Html.AntiForgeryToken() 'name 属性はモデルのクラスのプロパティ名と同じにしないとサーバー側でモデルバインディングされないので注意。 '大文字小文字は区別しない。 @<input type="file" name="postedfile" size="50" /> @<button type="submit">送信</button> @ViewBag.Result End Using <div> <input type="button" id="ajaxUpload" value="Ajax Upload" /> </div> </div>

※HomeController.vb(コントローラファイル)

VisualBasic

Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Web Imports System.Web.Mvc Imports System.ComponentModel.DataAnnotations Imports UploadToDB.UploadModels Imports System.IO Namespace UploadToDB.Controller Public Class HomeController Inherits System.Web.Mvc.Controller Function Index() As ActionResult Return View() End Function Function About() As ActionResult ViewData("Message") = "Your application description page." Return View() End Function Function Contact() As ActionResult ViewData("Message") = "Your contact page." Return View() End Function Public Function Upload() As ActionResult Return View() End Function <HttpPost()> <ValidateAntiForgeryToken()> Public Function Upload(ByVal model As UploadModels) As ActionResult Dim result As String = "" Dim postedFile As HttpPostedFileBase = model.PostedFile If postedFile IsNot Nothing AndAlso postedFile.ContentLength > 0 Then Dim filename As String = path.GetFileName(postedFile.FileName) Dim path As String = Server.MapPath("~/UploadedFiles") & "\" & filename postedFile.SaveAs(path) result = filename & " (" & postedFile.ContentType & ") - " + postedFile.ContentLength.ToString() & " bytes アップロード完了" Else result = "ファイルアップロードに失敗しました" End If If Request.IsAjaxRequest() Then Return Content(result) Else ViewBag.Result = result Return View() End If End Function End Class End Namespace

※MyMvcContext.vb()コンテキストファイル)

VisualBasic

Imports System.Data.Entity Imports UploadToDB Public Class MyMvcContext : Inherits DbContext Public Property Photo As DbSet(Of UploadModels) ' Photoテーブル End 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時以降は返信が翌日になることが多いです)
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。