none
ASP.NETの画像の登録についての質問です。 RRS feed

  • 質問

  • 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
    の所でエラーが表示されます。パスの指定の仕方がわかりません。初心者すみません。よろしくお願いします。

     

    2012年4月17日 10:00

回答

すべての返信

  • fname = savePath & "/" & tbox.Text

    物理パスなので、セパレータが間違いなのではないでしょうか。"/"ではないですよね。

    そもそも System.IO.Path.Combine を使えば、セパレータを気にする必要はありません。

    Path.Combine メソッド (String, String) (System.IO)


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/



    2012年4月17日 13:17
  • fname、fname2、fname3がどのような値になっているか、それが意図した値か確認してみてください。
    たぶん、savePath、savePath2、savePath3もおかしくてその原因は Server.MapPath("~/Image") に謝った文字が混入してるからじゃないかなぁ…?

    J.Hashimotoさんへ:
    通常のディレクトリー区切り文字は確かにPath.DirectorySeparatorCharフィールドすなわち \ ですが、もう一つPath.AltDirectorySeparatorCharフィールドがありこちらが / ですのでこの場合は問題ないと思います。内部的にはPath.IsPathRootedメソッドを呼んでます。

    2012年4月17日 14:08
  • 他でも質問されているようなので、その URL を貼って置きます。

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1085789770


    質問者さん>

    マルチポストがダメとは言いませんが、その旨書いておいていた
    だければと思います。

    そうすれば、たまたまここを訪れた同じ問題を抱えた訪問者が、
    リンクをたどって問題を解決できるかもしれませんので。


    書いてある情報だけではどこに問題があるかわかりません。

    エラーはどの行で出るのですか?

    エラーメッセージは省略せずに書いてありますか? 実際は以下
    のようになっていませんか? とすると 'xxxx' の部分はどうな
    っていますか?

    "SaveAs メソッドはルート指定のパスが必要であるように設定さ
    れています。パス 'xxxx'にはルートが指定されていません。"

    デバッガの使い方は分かりますか? デバッガでどこまで期待し
    た結果になっていて、どこで期待と違うのか追いかけてみてくだ
    さい。(デバッガが使えないと開発はできないので、もし分から
    なければまずそれを勉強してください)

    あと、FileUpload は一つにしてみるなど、問題を再現するのに
    必要最低限までコードを絞って見ることをお勧めします。その
    過程で問題が見つかって、自己解決できるかもしれません。

     

    2012年4月17日 14:12
  • 皆さん本当にありがとうございます。

    >'保存
    >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や変数を使って色々試してダメでした。

    未だにダメです。

    2012年4月17日 14:32
  • 質問に全部答えていただけませんか。
    2012年4月17日 14:41
  •  『色々試して』を、具体的に書いてください。私たちはあなたではないので、あなたがどんな結果がほしくて、どんなことを行って、どんな結果になって、どんな風に考えてそれをダメだと判断したのかわかりません。この4つの「どんな」は、問題解決のためにとても重要です。

     で、画像をアップロードするのと、FindControl がどう結びつくのでしょう?


    Jitta@わんくま同盟

    2012年4月17日 14:44
  • まあ、TextBoxのコントロールが取れてなくてパスがNothingになったままとかそんな話な気はしますが…

    クライアントから渡したパスをそのまま使って保存なんてしちゃいけませんよ。

    2012年4月17日 16:12
  • すみません。数日前から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はユーザーコードによってハンドルされませんでした。

    オブジェクト参照がオブジェクトインスタンスに設定されていません。と表示されて正常に作動してくれません。

    何もわからずすみません。よろしくお願いします。

    2012年4月18日 5:16
  • こんにちは。

    >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 は一つにしてみるなど、問題を再現するのに
    >必要最低限までコードを絞って見ることをお勧めします。その
    >過程で問題が見つかって、自己解決できるかもしれません。

    は、プロでも素人でも全く同じ事があてはまるので、是非、これをやってみることをお勧めします。


    2012年4月18日 7:23
  • みなさんありがとうございます。デバックをしています。

    最初のプログラムは、入門書についていたサンプルコードを参考にしました。そこからもう一度始めました。

    するとエラーは出ないのですが警告がでました。おかしいと思いサンプルをlocalで動作確認したらファイルのアップロードが出来ませんでした。

    サンプルCDについてきたファイル自体だめでした(泣)

    J.Hashimotoさんの指摘が正しいと思いました。書籍の発行元に問い合わせをしました。

    fname = savePath & "/" & tbox.Text

    がダメなんだと思います。

    ありがとうございました。

    2012年4月18日 9:55
  •  ん・・・自動車を運転するためには、エンジンがどうやって動力を生み出すかを知っている必要は有りません。しかし、どうすれば自動車を制御できるかを知っている必要は有ります。プログラムを作るのも同じで、知っているべき事、知っていなくてもかまわないことがあります。
     で、『数日前から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@わんくま同盟

    2012年4月18日 11:54
  • 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/

    2012年4月18日 11:56
  • > fname = savePath & "/" & tbox.Text
    > がダメなんだと思います。

    それは見当違いでしょう。

    Keiichi Oumi さんのレスが正解だと思います。せっかく回答をもら
    ったのですから、よく読んでください。

    エラーメッセージはたぶん、

    "SaveAs メソッドはルート指定のパスが必要であるように設定されて
    います。パス '' にはルートが指定されていません。 "

    だと思いますが、違いますか? 

    前にも言いましたが、基本的な知識がないと話が通じなくて、いつま
    でたっても解決できません。頑張って勉強してください。

    2012年4月18日 13:17
  • サンプルCDのコードは間違ってないと連絡が来たんですけど((笑))

    試行錯誤で無事アップロードできました。。

    2012年4月19日 13:40
  • 何が問題だったのか、どこをどう直したらうまくいったのかきちんと
    書いておくようお願いします。
    • 回答としてマーク 山本春海 2012年4月24日 8:16
    2012年4月19日 14:09