none
VB.NET: 指定されたパスのフォーマットはサポートされていません。  がサーバ実機で 実行した場合のみ現れる。 RRS feed

  • 質問

  • 開発環境:VisualStudio2017/ Windows10(IISExpress)

    運用環境:ASP.NET4.6/ WindowsServer2016Standard (IIS10)

    If FileUpload1.HasFile Then
    
                Dim now As DateTime = DateTime.Now
                Dim Path As String = "C:\temp\" & now.ToString("yyyyMMddHHmmss") & "\"
                Dim fileName As String = FileUpload1.PostedFile.FileName
                Dim filePath As String = Path & fileName
    
                System.IO.Directory.CreateDirectory(Path)
                FileUpload1.SaveAs(filePath)

    既に運用環境に配置したWebページがあり、こちらの「 FileUpload1.SaveAs(filePath) 」というコード部分が、運用環境であるサーバで実行した場合(IE)、"指定されたパスのフォーマットはサポートされていません。" というエラーを招いてしまいます。

    当該Webページは ファイル選択用のFileUploadとサーバへの送信目的のButtonコントロールのみが貼り付けられたシンプルなものです。

    開発環境であるWindows10上のVisualStudio2017でのデバッグ実行では エラーになりません。

    この要因・解決策をどなたか教えて頂けませんでしょうか?

    (ちなみに、当該画面でファイル選択後、送信ボタンを押すと本来別のFTPサーバへファイルを転送しようとする仕様なのですが、一般クライアント端末でこれを実行してエラーを招いてしまったたために、サーバ実機での検証となりました。FtpWebResponseでタイムアウトがおきる)


    • 編集済み saya24 2020年1月31日 8:37 誤字
    2020年1月31日 8:34

回答

すべての返信

  • エラーになる環境において、変数 filePath に渡された文字列が何という文字列になっているか確認されましたか?

    予想ではありますが、たとえば fileName 変数が空だったり、「ファイル名として使えない文字列」が混入していた場合、"指定されたパスのフォーマットはサポートされていません。" という例外になってしまうかもしれません。

    • 回答としてマーク saya24 2020年2月1日 7:10
    2020年1月31日 8:50
  • 魔界の仮面弁士さん ご見解ありがとうございます。

    デバッグモードではない運用環境・サーバ実機で、変数の内容を確認できない、と決めつけてしまっていました。ログに出力するなりなんらかの策で まずは変数の内容を確認します。

    少々お待ちください。

    2020年1月31日 9:41
  • FileUpload1.SaveAs(filePath)

    の引数となっている変数、filePathの値を 一先ず画面上のLabelにも格納して 送信ボタン押下して確認してみることにしました。比較

    すると、たしかにVisualStudioのデバッグ実行時と 運用環境での実行で 格納される変数の内容が変わってしまっていました。

    利用していた~.PostedFile.FileNameという予約語をよく理解できていないので 環境・実行方法によって変わることを認識できていない感じでしょうか...。

    アップロードされるべきファイルの保存パスの組み立てかた(filePathという変数の中身)を、環境・実行方法を区別して生成するようにすればPostedFile.FileNameを継続して利用することでも良いのかも知れませんが、なんか 単純に ~.FileNameだけにしたら 自分の期待どおりの動作=運用環境実行でもVS実行でも常に同じパス名が格納されるようになりました。お騒がせしました。

    ....開発端末のデバッグ実行では FTPサーバに無事接続できるのに、サーバ実機もしくは サーバに繋がるクライアント端末からの実行では FtpWebResponseでタイムアウトになってしまう事象は 相変わらず。本件とは全く関係していなかったようですね




    • 編集済み saya24 2020年2月1日 5:28 画像追加
    2020年2月1日 5:23
  • ↓ こういう話でしょう。IE 以外でもこういうことはあるかもしれません。

    IE でアップロードする際のファイル名
    http://surferonwww.info/BlogEngine/post/2015/08/06/filename-when-uploading-by-internet-explorer.aspx

    • 回答としてマーク saya24 2020年2月1日 7:10
    2020年2月1日 5:55
  • SuferOnWwwさん ご見解をありがとうございます。

    まさにこれだと思います。サーバのIEはVer11.3442.14393.0であり、ご紹介戴きました設定をまだ見つけることができていないのですが、記事を読ませて頂くと あてはまることだらけで。

    ちなみに、文末で言及したFtpWebResponseでタイムアウトになってしまう事象も無事に解決することができました。一応以下ににご報告いたします。

    開発端末であるWindows10(VisualStudioのデバッグ実行)では FTPをパッシブモードを無効化にした設定でも無事動作できていましたが、運用サーバでは パッシブモードを有効化しない限り、FTPサーバへの接続が正常に行えなかったようです。

    2020年2月1日 7:09
  • 一般論としてクライアントから受け取ったデータを検査なしに受け入れるのは危険です。

    このケースも仮にクライアントが申告したファイル名が "..\..\Windows\notepad.exe" という文字列だったら、Webサーバー上のメモ帳が上書きされたりしませんか? 完全なセキュリティホールです。

    2020年2月1日 11:44
  • 佐祐理さん 貴重なご見解ありがとうございます。

    そうそうに改修を検討いたします。

    2020年2月2日 4:13