1

そのため、ユーザーが画像をアップロードできるHTMLフォームがあります。これは私のアクションに投稿され、画像はユーザーのIDに固有のディレクトリに配置されます(まだ存在しない場合はそのディレクトリを作成します)。

これは、約2か月前に実装してから問題なく機能しており、それ以降は触れる必要がありません。当初UnauthorizedAccessExceptions、私はアップロードディレクトリのセキュリティ設定に移動し、「Everyone」にフルコントロールを付与することでそれを解決していました。

突然、画像を保存できなくなりました。UnauthorizedAccessExceptionsフォルダのセキュリティ設定を何度も変更して修正しようとしたにもかかわらず、私は再び取得し始めました。最後に、ASP.netでアカウントのなりすましを行う方法についてお読みください。

だから、今私は取得しておらず、UnauthorizedAccessExceptions代わりにディレクトリがすでに存在していると思って私のサイトの問題に遭遇しています。

これが私のフォームアクションのスニペットです。

if (Directory.Exists(Path.GetDirectoryName(Server.MapPath("../uploads/" + currentUser.UserId))) == false)
{
   Directory.CreateDirectory(Path.GetDirectoryName("../uploads/" + currentUser.UserId));
}
if (Directory.Exists(Path.GetDirectoryName(Server.MapPath("../uploads/" + currentUser.UserId + "/" + newEntry.EntryId))) == false)
{
   Directory.CreateDirectory(Path.GetDirectoryName("../uploads/" + currentUser.UserId + "/" + newEntry.EntryId));
}

ImageFile.SaveAs(Server.MapPath("../" + savedFileName));

ifステートメント内のコードは実行されません。だから、私はそれらを削除して、単に試しました:

Directory.CreateDirectory(Path.GetDirectoryName("../uploads/" + currentUser.UserId));

何も起こりません!次に、画像を保存するときに、ディレクトリが存在しないために例外がスローされます。Directory.Exists()なぜ戻ってくるtrueのか、なぜDirectory.CreateDirectory()まったく何もしていないのか、誰か教えてもらえますか?

または、なぜこのコードは何ヶ月も手つかずで正常に機能していて、突然フィットをスローすることにしたのですか?

注:フォルダに移動してディレクトリを手動で作成すると、ファイルは問題なく保存されます

4

3 に答える 3

1

Path.GetDirectoryNameは、ディレクトリの完全修飾パスではなく、ディレクトリ名を返すだけです。Directory.Existsは、ディレクトリの完全修飾パスを取得し、ディレクトリが存在するかどうかを確認します。

Directory.Existsが、uploadsフォルダー内を調べる代わりに、フォルダーが存在するかどうかをWebアプリケーションのルートでチェックする場合、条件は失敗します。

あなたの状態は次のようになります:

if (Directory.Exists(Server.MapPath("/uploads/" + currentUser.UserId)) == false)
{
    Directory.CreateDirectory(Server.MapPath("/uploads/" + currentUser.UserId));
}

注:パスから先頭の「..」を削除すると、機能しました。

于 2012-05-05T07:07:53.933 に答える
0

どうやらこれは私が変更する必要があったすべてでした:

Directory.CreateDirectory(Server.MapPath("../uploads/" + currentUser.UserId));

Server.MapPathに入れると、すべてが機能します。なぜそれが以前はうまく機能していて、突然停止したのか分かりません。

于 2012-05-05T07:26:28.797 に答える
0

これを試して:

var path = Server.MapPath(string.Format("~/uploads/{0}/{1}/", userId, entryId));

//MSDN: Creates all directories and subdirectories as specified by path
Directory.CreateDirectory(path);

var filePath = Path.Combine(path, savedFileName);

ImageFile.SaveAs(filePath );
于 2012-05-05T07:38:51.417 に答える