トップ回答者
ASP.NETの画像の登録についての質問です。

質問
-
ASPについての質問です。画像のパスをアップロードしたいですがエラーが出ます。
SaveAsメソッドはルート指定のパスが必要であるように設定されています。パスにはルートが指定されていません。とエラーが表示されます。
Protected Sub UpdateButton_Click1(ByVal sender As Object, ByVal e As System.EventArgs)
Dim tbox As TextBox
Dim tbox2 As TextBox
Dim tbox3 As TextBox
Dim savePath As String
Dim savePath2 As String
Dim savePath3 As String
Dim fname As String
Dim fupload As FileUpload
Dim fname2 As String
Dim fupload2 As FileUpload
Dim fname3 As String
Dim fupload3 As FileUpload
'パス
savePath = Server.MapPath("~/Image")
savePath2 = Server.MapPath("~/Image")
savePath3 = Server.MapPath("~/Image")
'ファイル名
tbox = FormView1.FindControl("txtFilName")
If tbox IsNot Nothing Then
fname = savePath & "/" & tbox.Text
End If
tbox2 = FormView1.FindControl("txtFilName2")
If tbox2 IsNot Nothing Then
fname2 = savePath2 & "/" & tbox2.Text
End If
tbox3 = FormView1.FindControl("txtFilName3")
If tbox2 IsNot Nothing Then
fname3 = savePath3 & "/" & tbox3.Text
End If
'保存
fupload = FormView1.FindControl("FileUpload1")
If fupload IsNot Nothing Then
If (fupload.HasFile = True) Then
fupload.SaveAs(fname)
End If
End If
fupload2 = FormView1.FindControl("FileUpload2")
If fupload2 IsNot Nothing Then
If (fupload2.HasFile = True) Then
fupload2.SaveAs(fname2)
End If
End If
fupload3 = FormView1.FindControl("FileUpload3")
If fupload3 IsNot Nothing Then
If (fupload3.HasFile = True) Then
fupload3.SaveAs(fname3)
End If
End If
End Sub
fname
fname2
fname3
の所でエラーが表示されます。パスの指定の仕方がわかりません。初心者すみません。よろしくお願いします。
回答
すべての返信
-
fname = savePath & "/" & tbox.Text
物理パスなので、セパレータが間違いなのではないでしょうか。"/"ではないですよね。
そもそも System.IO.Path.Combine を使えば、セパレータを気にする必要はありません。
Path.Combine メソッド (String, String) (System.IO)
Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
- 編集済み jhashimoto 2012年4月17日 13:23
-
fname、fname2、fname3がどのような値になっているか、それが意図した値か確認してみてください。
たぶん、savePath、savePath2、savePath3もおかしくてその原因は Server.MapPath("~/Image") に謝った文字が混入してるからじゃないかなぁ…?J.Hashimotoさんへ:
通常のディレクトリー区切り文字は確かにPath.DirectorySeparatorCharフィールドすなわち \ ですが、もう一つPath.AltDirectorySeparatorCharフィールドがありこちらが / ですのでこの場合は問題ないと思います。内部的にはPath.IsPathRootedメソッドを呼んでます。 -
他でも質問されているようなので、その URL を貼って置きます。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1085789770
質問者さん>マルチポストがダメとは言いませんが、その旨書いておいていた
だければと思います。そうすれば、たまたまここを訪れた同じ問題を抱えた訪問者が、
リンクをたどって問題を解決できるかもしれませんので。
書いてある情報だけではどこに問題があるかわかりません。エラーはどの行で出るのですか?
エラーメッセージは省略せずに書いてありますか? 実際は以下
のようになっていませんか? とすると 'xxxx' の部分はどうな
っていますか?"SaveAs メソッドはルート指定のパスが必要であるように設定さ
れています。パス 'xxxx'にはルートが指定されていません。"デバッガの使い方は分かりますか? デバッガでどこまで期待し
た結果になっていて、どこで期待と違うのか追いかけてみてくだ
さい。(デバッガが使えないと開発はできないので、もし分から
なければまずそれを勉強してください)あと、FileUpload は一つにしてみるなど、問題を再現するのに
必要最低限までコードを絞って見ることをお勧めします。その
過程で問題が見つかって、自己解決できるかもしれません。 -
皆さん本当にありがとうございます。
>'保存
>fupload = FormView1.FindControl("FileUpload1")
>If fupload IsNot Nothing Then
>If (fupload.HasFile = True) Then
>fupload.SaveAs(fname)
>End Ifの所の
fupload.SaveAs(fname)
でエラーが出ます。
Visual Web Developerを使い、編集でformfiewのコントロールを使った時にエラーが出てしまいます。
新しくデータを追加するときは、テキストボックスやボタンをただ配置してフォームを作りました。その時はエラーにならないので、FindControlや変数を使って色々試してダメでした。
未だにダメです。
-
すみません。数日前からASPを初めて詳しく返信したいのですが、本当によく分からない状態です。ACCESS VBAが少しできるレベルなんです。本当に申し訳ございません。
fupload2.SaveAs(Server.MapPath("~/Image") + System.IO.Path.GetFileName(fupload.FileName))
にしたら上手くファイルをアップロードできました。ネットに掲載していたものを参考にしました。
これをtbox.Textの名前のファイル名にして保存しようとしたら↓これでエラーがでました。
fupload.SaveAs(Server.MapPath("~/Image") + System.IO.Path.GetFileName(tbox.Text))
今はデバックしても特にエラーは表示されなくて、localで動作を確認してみるとファイルを保存すると
NullReferenceExceptionはユーザーコードによってハンドルされませんでした。
オブジェクト参照がオブジェクトインスタンスに設定されていません。と表示されて正常に作動してくれません。
何もわからずすみません。よろしくお願いします。
-
こんにちは。
>fupload2.SaveAs(Server.MapPath("~/Image") + System.IO.Path.GetFileName(fupload.FileName))
と
>fupload.SaveAs(Server.MapPath("~/Image") + System.IO.Path.GetFileName(tbox.Text))
で、違う部分が、NullReferenceException ということですね?つまり、空っぽって事(インスタンスが無い)ですね。
さて何が違うのでしょうか・・・
tbox.Text が違う部分ですね。tbox.Text はどこで作られる(インスタンスが作られている、または代入されている)のかな?
>tbox = FormView1.FindControl("txtFilName")
ですね!
ということは・・・
そして、
>If tbox IsNot Nothing Then
もし、tbox が Nothingでなければ(インスタンスがあれば)
>fname = savePath & "/" & tbox.Text
fnameに なんか入れる。
>End If
おや? じゃぁNothingだったらどうなるんだろ? なんかそのまま動いていっちゃいそうなコードですね・・・
のように、1つ1つ考えて、デバッグ(ステップ実行)して、確認してみたらよいのではないでしょうか。
SurferOnWwwさんが言っている、
>あと、FileUpload は一つにしてみるなど、問題を再現するのに
>必要最低限までコードを絞って見ることをお勧めします。その
>過程で問題が見つかって、自己解決できるかもしれません。は、プロでも素人でも全く同じ事があてはまるので、是非、これをやってみることをお勧めします。
- 編集済み Keiichi Oumi 2012年4月18日 7:30 追記
-
みなさんありがとうございます。デバックをしています。
最初のプログラムは、入門書についていたサンプルコードを参考にしました。そこからもう一度始めました。
するとエラーは出ないのですが警告がでました。おかしいと思いサンプルをlocalで動作確認したらファイルのアップロードが出来ませんでした。
サンプルCDについてきたファイル自体だめでした(泣)
J.Hashimotoさんの指摘が正しいと思いました。書籍の発行元に問い合わせをしました。
fname = savePath & "/" & tbox.Text
がダメなんだと思います。
ありがとうございました。
-
ん・・・自動車を運転するためには、エンジンがどうやって動力を生み出すかを知っている必要は有りません。しかし、どうすれば自動車を制御できるかを知っている必要は有ります。プログラムを作るのも同じで、知っているべき事、知っていなくてもかまわないことがあります。
で、『数日前からASPを初め』(「始め」じゃない?)た様な人には、まずは座学で勉強して頂きたいです。
その前に、「ASP」なのでしょうか。それとも「ASP.NET」なのでしょうか。名前だけにているまったく異なるものなので、はっきり区別をして下さい。それで、プログラムを作るには、「実現したい何か」を実現するための手順を具体的に積み上げていくことができなければなりません。その為には、『ネットに掲載していたものを参考に』などして欲しくありません。なぜ『fupload2.SaveAs(Server.MapPath("~/Image") + System.IO.Path.GetFileName(fupload.FileName))』だと動いて、『fupload.SaveAs(Server.MapPath("~/Image") + System.IO.Path.GetFileName(tbox.Text))』だと動かないのか。その差異を見つける、あるいは差異を見つけるのにどうすれば良い、ということを知っていなければならないのに、ネットをちょこちょこ見ただけではその辺の、本当に重要なところを学ぶことができないからです。
とりあえず、ASP.NET ならば、『.NETエンタープライズWebアプリケーション開発技術大全』の Vol.1~4、『Microsoft Visual Studio 2005によるWebアプリケーション構築技法』は必読本だと思います。Visual Studio 2003, 2005 を対象とした古い本ですが、基本は同じですので、まずは一通り目を通して下さい。
と表示されて正常に作動してくれません。
あなたの期待通りに動作していませんが、正常に動作しています。先にも書いたように、「あなたがどんな結果がほしくて、どんなことを行って、どんな結果になって、どんな風に考えてそれをダメだと判断したのか」、具体的に書いて下さい。そうするとここは、この様な感じになるはずです。
ユーザに、保存するファイルと、そのファイルを保存するためのファイル名を入力してもらいます。コードでは、fupload にイメージ ファイル、tbox にそのファイル名(を入力したテキストボックス)が入ることを期待しています。***(具体的な URL)を参考に、次のようにコードを書きました。
Protected Sub UpdateButton_Click1(...) Dim tbox As TextBox Dim fupload As FileUpload tbox = FormView1.FindControl("txtFilName") fupload = FormView1.FindControl("FileUpload1") If fupload IsNot Nothing Then If (fupload.HasFile = True) Then fupload.SaveAs( _ Server.MapPath("~/Image") _ + System.IO.Path.GetFileName(tbox.Text)) End If End If End Sub
こうしたところ、「fupload.SaveAs」の行で、「NullReferenceException はユーザーコードによってハンドルされませんでした。オブジェクト参照がオブジェクトインスタンスに設定されていません。」と表示されます。
txtFileName を FindControl しなくても、Me.txtFileName で参照できませんか?一応コードを書きますが、「教えてもらったとおり書いたらできた」では、私が「一見動作するが、ある切っ掛けで爆発する」爆弾を仕込んでいない事はわかりません。そういうものを見つけられるようにして下さい。
Protected Sub UpdateButton_Click1(...) If Me.FileUpload1.HasFile = False Return Dim fileName As String = Path.Combine( _ Saver.MapPath("~/Image"), _ Me.txtFileName.Text) Me.FileUpload1.SaveAs(fileName) End Sub
Jitta@わんくま同盟
-
J.Hashimotoさんの指摘が正しいと思いました。書籍の発行元に問い合わせをしました。
fname = savePath & "/" & tbox.Text
がダメなんだと思います。
佐祐理さんが私の指摘は間違っているとコメントしてくれています。混乱させてしまい申し訳ありません。
実際に試してみたのですが、"/"で問題なく連結できました。
Module Module1 Sub Main() System.IO.File.WriteAllText("C:\hoge\fuga" & "/" & "piyo.dat", "abcde") End Sub End Module
ですので、原因は他にあります。
Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
-