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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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を利用して開発を行うことが可能です。

Q&A

解決済

3回答

4466閲覧

Path.GetFileNameが使えません。

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を利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/07/14 12:40

前提・実現したいこと

コードファーストで、ファイルをアップロードし、最終的に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時以降は返信が翌日になることが多いです)
※休日の返信は不定期です。
申し訳ございませんが、どうぞよろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ローカル変数のpathとSystem.IO 名前空間が重複してるからでは?
(「path」と書かれたら、どっちか判断できない)

System.IO.path.GetFileName(postedFile.FileName)にするか、
変数名のほうを変えるかすれば直ると思います。

どちらかというと変数名を変える方がよいと思います。

投稿2020/07/14 23:48

mdj

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eltk

2020/07/15 10:49

>mdj様 >System.IO.path.GetFileName(postedFile.FileName)にするか、 →書き換えてみて、エラーが消えました。System.IOという名前空間のもとに、GetFileNameが存在するという意識を全く持てておりませんでした。 勉強になりました。 ありがとうございます! ※後ほどいただいたアドバイスの通り、変数名を変更しました。
mdj

2020/07/15 12:20 編集

hidoriさん はい、同一視します。 またVisual StudioのVBでは変数宣言した時(ないしは呼び出した関数、クラス)の大文字小文字が基準になり、それ以降の関数内などの記述には自動的にそれに揃えられます。 ※コメント先を間違えたの解釈を間違っておりました。失礼しました。
guest

0

質問のアクションメソッドのコードは、参考にしている 3 つの記事の最後の記事 MVC でファイルのアップロード のコードをコピーして、それと違うのは C# を VB.NET に変換しただけですよね?

参考にしている記事は自分が書いたもので、期待通り動くことは確認済みで、もちろんこのスレッドのような問題はありません。

と言うことは、C# と VB.NET のエディタの違いかもしれません。(VB.NET は、 Try とタイプすると Catch Exception と追加するといった「小さな親切大きなお世話」的なことが多いようです)

そのあたりを調べてみてはいかがですか?

個人的には VB.NET は止めて C# に切り替えることをお勧めしたいです。VB.NET の未来は明るくないようですし。

【追記】

今思い出したのですが、VB.NET は変数名の大文字・小文字の区別はしないのですよね。だからこういう問題 (patn と Path の区別ができない。なのでエディタが黙って Path を path に変えてしまう) が起こるのでは。

やっぱり、VB.NET を使うのは考え直した方がよさそうです。

投稿2020/07/15 00:19

編集2020/07/15 00:56
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eltk

2020/07/15 11:06 編集

>SurferOnWww様 いつもお世話になっております。 はい。調べていてたどり着いた記事がたまたまSurferOnWww様の記事でしたので、参考にさせていただきました。 C#とVBに書き方以外にそのような違いがあるのですね。 >個人的には VB.NET は止めて C# に切り替えることをお勧めしたいです。 →確かに、書籍や参考サイト充実度でC#の方が主流なんだろうとは感じておりましたが、今の(仕事の)現場がVBである点と、自身のスキルの低さから目の前のVBをまず学ぶことでいっぱいいっぱいというのが正直なところです。 ただ、まだ各言語の良さ、使いやすさ、将来性などがきちんと把握しきれていない自分としては、今のところ特定の言語に執着はしておりませんので、将来的に別の言語をした方が良いのだろうなと、今回のアドバイスを受けて思いました。 >今思い出したのですが、VB.NET は変数名の大文字・小文字の区別はしないのですよね。だからこういう問題 (patn と Path の区別ができない。なのでエディタが黙って Path を path に変えてしまう) が起こるのでは。 →mdj様の回答とあわせて、今回のエラーの原因が頭の中で明確になりました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/07/15 11:19 編集

> 今回のエラーの原因が頭の中で明確になりました。 絶対わかってないと思いますけど。特に、なぜエディタが黙って Path を path に変えてしまうかというところ。そういう問題に対してどう対応しなければならないかというところ。それよりなにより、その前に、何が問題か気が付かないところなどです。
Eltk

2020/07/15 11:24

>SurferOnWww様 >なぜエディタが黙って Path を path に変えてしまうかというところ。 →言われるような「小さな親切大きなお世話」により、大文字小文字の厳密な判断をしないため、直後に宣言している変数のことだろうと勝手に推測して変換している、ではないかと思っています。 >そういう問題に対してどう対応しなければならないかというところなど。 →まずは、そういうことがVBでは起こってしまうと知っておくこと。 その次に、そのような事象が発生しないように、こちらで食い止められる可能性は潰しておくこと(今回でいう、似たような変数名をつけないなど)。 だと思っています。
退会済みユーザー

退会済みユーザー

2020/07/15 11:38

いえ、そうではなくて、VB.NET は大文字・小文字の区別がないというところが致命的だからです。個人的意見ですが。「vb.net 変数名 大文字 小文字 区別」などをキーワードにググってみてください。以下の記事など興味深いと思います。 VB.NETは大文字小文字の区別をしないからってBASIC風の書き方 http://cyberboy6.blog.fc2.com/blog-entry-193.html
len_souko

2020/07/15 11:54

VB.netの未来が明るくないについての補足 https://forest.watch.impress.co.jp/docs/news/1240998.html 「Visual Basic」は.NET Coreでもサポートを継続 ~ただし、言語としての発展は終わり .NET Framework/.NET Core双方でのVB互換性を重視 .net 5が今年の11月にリリース予定で、そのあとずっと更新されていく中、言語仕様を更新しなければ対応できない新機能はC#等では利用可能ですが、VBでは利用不可能となるということです VB.NETは終焉を迎えましたので、既存の改修や仕様追加など以外では選択すべきではない言語になりました 新規開発ならVBは除外すべきということですね VBしか出来ない人は今後も危ういということなので、比較的移行しやすいC#に乗り換えられるように勉強した方が良さ気です
Eltk

2020/07/15 12:06

>SuferOnWww様 記事、読ませていただきました。 なるほど、「チーム開発」で各々が好き勝手に大文字小文字の区別なく書いてしまっても、動くが故に可読性と保守性が悪くなるというデメリットにもっと注目すべきということですね。 Aクラスとaクラスの話も、具体例として勉強になりました。 ありがとうございます。
Eltk

2020/07/15 12:09

>len_souko様 読ませていただきました。 なるほど、なんか絶望的ですね。。 仕事の関係上、選択権の有無は僕にはないのですが、今後のキャリアアップの参考になりました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/07/15 12:30

> 動くが故に可読性と保守性が悪くなるというデメリットにもっと注目すべきということですね。 いえ、可読性と保守性が悪くなるのももちろん問題ですが、そこは知っている人なら対処できるでしょう、たぶん。 今回のように勝手に変換されて訳の分からない事態に陥ることになるのはどう思いますか・・・って、もういいや、分かってもらえそうもないし面倒くさくなってきましたのでここらで止めておきます。
Eltk

2020/07/15 12:49

>SurferOnWWW様 わかるようになるように、レベルアップできるよう頑張ります。
len_souko

2020/07/16 05:53

可読性云々ではなく、大文字小文字を関係なく扱うことから、C#ではPathクラスのインスタンスの変数をpathと定義した場合でもコンパイラはPathとpathは別物として扱うため、コーディングした人の意図通りに動くけど、VBだと大文字小文字の区別がないために、コードではクラスのつもりで書いたPathと変数のつもりで書いたpathがコンパイラでは同じものを書いてると判断し、そのためによりスコープ(有効範囲)の狭い変数の方を優先されて小文字に変換されるとなっているということです 変換されるのはおまけの機能で、仮に自動で大文字小文字をそろえる機能がなかったとしても、同じようにpath変数が宣言されているメソッド内ではPathクラスのつもりで書いてもコンパイラはpath変数としか認識しないということが問題なのです これはC#でもプロパティやフィールドにpathを定義しているにもかかわらずローカル変数や引数の変数名でpathを定義していると、単にpathと書いたらローカルのpathと解釈されてしまうので、プロパティやフィールドのpathを使用したい場合はthis.pathと書かなければいけないということになります これと同じ現象を、VBだと大文字小文字で区別して書いたつもりでもコンパイラは区別しないので起きてしまうということからなぜか勝手に大文字小文字が変わってしまってメンバにないとか言われてしまうといった事態に陥るのです そして質問者さんは炒めの変化の部分が分かりやすいためかそっちに木を取られて内部的な扱いに理解が追い付いていないのでは?ということです VBは初心者向けの言語というはずなのに、初心者だと気づけない仕様があるというのが致命的なのでは?ということなのかなと思っています
len_souko

2020/07/16 05:55

> 仕事の関係上、選択権の有無は僕にはないのですが、 決定権のある人に先の記事を見てもらうといいですよ それでもなおVBのままでいいというのであればそのうち仕事がなくなるかもしれません
len_souko

2020/07/16 06:01

前後しますが・・・ > 「チーム開発」で各々が好き勝手に大文字小文字の区別なく書いてしまっても、動くが故に まず、同じ変数やプロパティに対して各々が大文字小文字を区別せずに書いたとしても、そこはVSが自動で定義された形で調整してくれるので全く問題になりません 今どきVSを使わずにテキストエディタで書いてるのなら別ですが 次に、動くがゆえにとありますが、問題になる部分は大文字小文字で違いを作った別物を定義していてもコンパイラでは区別がつかない状態になると一番優先順位の高いものとして扱うことから、型が違う場合やプロパティやメソッドを使用する場合ではコンパイルエラーとなり、動く以前の問題が発生します。つまり動いていません
Eltk

2020/07/16 11:22

>len_suoko様 とても詳しくありがとうございます。 >VBだと大文字小文字の区別がないために、コードではクラスのつもりで書いたPathと変数のつもりで書いたpathがコンパイラでは同じものを書いてると判断し、そのためによりスコープ(有効範囲)の狭い変数の方を優先されて小文字に変換されるとなっているということです →それは怖いですね。有効範囲が広ければ良いというわけではないかもしれませんが、知らずに書いているとどんどんエラーの原因が量産されてしまいそうです。 >VBは初心者向けの言語というはずなのに、初心者だと気づけない仕様があるというのが致命的なのでは?ということなのかなと思っています →皆さんがVBを止める理由がなんとなくわかってきた気がします。 VB.NETが初心者向けの言語と言われていると思っていたのですが、今回皆さんからいただいたアドバイスと、自身が、他の言語の学習に比べて情報が少なくてすぐに詰まってしまうデメリットを総合すると、VBを主軸に置く考えは、捨てた方が良さそうですね。 もちろん色々な言語に広く浅く手を出しても、身につかないと思うので、今は目の前のことをこなすことを第一にしますが、中長期的な計画としてはVBに重きを置きすぎないようにして考えようと思います。 色々と教えてくださり、ありがとうございました。
guest

0

エラーの原因は

「Path.GetFileName」となっている箇所が、「path.GetFileName」と「p」が小文字になっていた

であってると思います。

修正箇所からカーソルが外れると、自動的に「path」に戻りました。

という動きが不可解です。

何か、Visual Studio の機能拡張が悪さをしているとか?

投稿2020/07/14 12:58

hidori

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eltk

2020/07/14 13:06

>hidori様 さっそくのご回答ありがとうございます。 Visual Studio側でそういった設定ができるんですね。 ちなみに、可能性としてどういったことを調べてみたら良いでしょうか。 他の箇所は、「一部の大文字が小文字になる」ような現象は起きておらず、どのようにネットで検索したら良いかのとっかかりも無い状態です。。
hidori

2020/07/14 13:28 編集

>Visual Studio側でそういった設定ができるんですね。 素の Visual Studio や元から入ってる機能拡張には、そこまで余分なことをするものは無いはずです。 後から、何かそういう動作をする機能拡張をご自分で入れているのではないでしょうか。
Eltk

2020/07/14 13:38

>hidori様 今、Visual Studioの「機能拡張の管理」というところを調べてみたのですが、 自身では、何かを拡張した覚えがないです。。 (※今よりももっと無知だったときに、わけもわからず何か触っている可能性は0ではないですが) 可能性として、拡張機能によるもの以外に可能性はなさそうでしょうか。
hidori

2020/07/14 13:43

うーん、拡張機能くらいしか思い付かないですね。
Eltk

2020/07/14 14:27

>hidori様 なるほど。 わかりました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/07/14 22:26

横レス失礼します。 前のスレッドのコードでも、参考にしている @IT の記事を見ると、Path を使ってますが、その時は問題なかったのですか? であれば、前と何が違うかを見つけてはいかが? そこにヒントがあるかもしれません。
Eltk

2020/07/15 10:46

>SurferOnWww様 >前のスレッドのコードでも、参考にしている @IT の記事を見ると、Path を使ってますが、その時は問題なかったのですか? →そのときは問題は発生しておりませんでした。 先程、解決したのですが、違いとしては「変数名と(大文字小文字違いで)重複したものが存在する」が今回の答えのような気がします。
hidori

2020/07/15 10:55

VB って、変数名やクラス名の大文字小文字を同一視するんでしたっけ?
Eltk

2020/07/15 11:04

>hidori様 今、調べてみましたが、「VBは大文字小文字の区別をしない」と書かれている記事が複数ありましたので、そうなのだと思います。 自分も、vbファイルの中でSQL文が書かれているのを見たことがありますが、 「from」でも「FROM」でもSQLが実行され、データの挿入や取得が行われていることを思い出しました。 ※同じ質問をもう一つ書いていただいておりますが、こちらでまとめて回答させていただきます。
hidori

2020/07/15 20:34

>「VBは大文字小文字の区別をしない」と書かれている記事が複数ありましたので、そうなのだと思います。 なるほど。。 であれば、VisualStudio の内蔵エディタが Path → path 修正しそうですね。 >自分も、vbファイルの中でSQL文が書かれているのを見たことがありますが、 >「from」でも「FROM」でもSQLが実行され、データの挿入や取得が行われていることを思い出しました。 それはおそらく LINQ 式なので、微妙に違う話な気がしますが、まぁ余談ですね。
退会済みユーザー

退会済みユーザー

2020/07/15 21:33

SQL 文の話は SQL Server の照合順序がデフォルトで Japanese_CI_AS なので、大文字・小文字、全角・半角を区別しないと言うことで、VB.NET とは別の話を言っているのではないでしょうか。
Eltk

2020/07/16 11:07

SQLはまた別の話になるんですね 余計な情報を失礼しました。
hidori

2020/07/16 11:19 編集

ざっくり言うと、ソースコード中に文字列として書いてあれば SQL 文です。 文字列でない(≒ クオート記号で括られてない)なら、LINQ 式です。
Eltk

2020/07/16 11:24

>hidori様 AppendFormat("" SELECT * FROM テーブル名 ") みたいな書き方をしていたと思います。 LINQは今の現場では使われていないです。。
hidori

2020/07/16 11:34 編集

文字列ですね。 ソースコード中に文字列として書かれた SQL 文が大文字であるか小文字であるかは、VB や Visual Studio ではなく、DB がどれをどう扱うか、の問題です。 さすがに、ソースコード中に文字列として書かれた SQL 文を IDE が自動的に訂正したら大事ですね (^^;
Eltk

2020/07/16 11:36

じゃあSQLになるんですね。 わかりました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問