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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

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

Q&A

解決済

3回答

4870閲覧

サーバー処理をする際のパスの指定方法について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

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

0グッド

0クリップ

投稿2020/07/15 10:35

現在、asp.netを使ってWebアプリを使っているのですが、Webサーバー上にファイルを保存したい場合、指定したフォルダをmapPathで絶対パスに変換すると思うのですが、そのまま相対パスを記載じゃダメなのでしょうか?
なぜダメなのかも教えて頂けると嬉しいです。

よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/16 22:34

質問者さん、無言になってしまいましたが、回答しましたので、それに対するフィードバックをタイムリーに返してください。 分かった・分からなかったとかの返事ならすぐ返せると思うのですが・・・ 無言はとにかく NG です。
退会済みユーザー

退会済みユーザー

2020/07/19 03:19

返信遅れてしまい申し訳ございません。 相対パスのみで記載がだめな理由は、サーバー側の処理で相対のみで書くと仮想パスと認識してしまうことが、原因なようでした。
退会済みユーザー

退会済みユーザー

2020/07/19 03:52

回答したのですから、回答欄のコメントとしてフィードバックしてください。
guest

回答3

0

もともとsaveメソッドで仮想パスや相対パスの使用はルール上不可のため絶対パスのみ記載可能である

投稿2020/07/20 05:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

そのまま相対パスを記載じゃダメなのでしょうか?

質問者さんの言うのは、例えばアプリケーションルート直下に UploadedFiles フォルダを作ったとして、そこにアップロードされたファイルを保存する場合、

string path = Server.MapPath("~/UploadedFiles") + "\" + filename; postedFile.SaveAs(path);

のようにするが、Server.MapPath を使わずに、上のコードで言うと SaveAs メソッドの引数 path に直接 "/UploadedFiles/ファイル名" というような文字列を指定できないかということですよね。

答えは「できません」です。

何故かというと、SaveAs メソッドの引数は Windows OS ファイルシステムのパスでないと理解できないからです。

【追記】

以下の記事の「セキュリティに関する考慮事項」のセクションを読んでください。

ASP.NET Core でファイルをアップロードする
https://docs.microsoft.com/ja-jp/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1

それに「アプリと同じディレクトリ ツリーに、アップロードしたファイルを保持しないでください」と書いてありますが、アプリケーションルート直下にフォルダを作って保存するのがセキュリティ的に間違っているのかもしれません。

「専用のファイル アップロード領域」を作って、そのパスを SavaAs の引数にすれば、Server.MapPath を使う必要はなくなるので、質問者さんの問題は解消するかも。

投稿2020/07/15 11:52

編集2020/07/15 12:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/07/19 03:59 編集

質問のコメント欄に質問者さんが書いた下記の件ですが。 > 相対パスのみで記載がだめな理由は、サーバー側の処理で相対のみで書くと仮想パスと認識してしまうことが、原因なようでした。 そもそもの質問は FileUpload.SaveAs メソッドとか HttpRequest.SaveAs メソッドの引数のファイル名のことを言っているのですよね? 違うのであれば、どう違うのか書いてください。 その理解であっているとすると、何か思い違いしていませんか? Microsoft のドキュメント、 https://docs.microsoft.com/ja-jp/dotnet/api/system.web.ui.webcontrols.fileupload.saveas?view=netframework-4.8 ・・・に、"アップロードしたファイルの保存先となるサーバー上の場所の完全パスを示す文字列"(例: c:\temp\uploads\SampleImage.jpg)と説明されている通りです。 URL に使うような相対パス(例: ../Images/SampleImage.jpg)とか仮想パス(例: /MyApplication/Images/SampleImage.jpg)は指定できません。
退会済みユーザー

退会済みユーザー

2020/07/20 04:54 編集

>URL に使うような相対パス(例: ../Images/SampleImage.jpg)とか仮想パス(例: /MyApplication/Images/SampleImage.jpg)は指定できません。 これは相対パスが仮想パスと認識されているのではなくルール的に指定できないので弾かれているということでしょうか?
退会済みユーザー

退会済みユーザー

2020/07/20 05:02

> ルール的に指定できないので弾かれているということでしょうか? "アップロードしたファイルの保存先となるサーバー上の場所の完全パスを示す文字列" というのは Windows OS の物理パスです。それがルールなので、仮想パス、相対パス、それと絶対パスでも URL の http://<hostname>/MyApplication/Images/SampleImage.jpg というのは指定できないということです。
退会済みユーザー

退会済みユーザー

2020/07/20 05:05

根本的な認識が間違ってたんですね、これで解決いたしました。 回答ありがとうございました。
guest

0

Web上からは相対アドレスではドキュメントルートより上位のディレクトリにはアクセスできませんね

投稿2020/07/15 11:06

編集2020/07/15 11:07
y_waiwai

総合スコア88040

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

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

退会済みユーザー

退会済みユーザー

2020/07/15 11:21

そんなことはありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問