画像ソースを設定するときの相対パス解像度の問題
-
19-09-2019 - |
質問
ユーザーがドキュメントをアップロードしてから表示するドキュメントを選択できる小さなWPFアプリケーションを構築しました。
以下は、ファイルコピーのコードです。
public static void MoveFile( string directory, string subdirectory)
{
var open = new OpenFileDialog {Multiselect = false, Filter = "AllFiles|*.*"};
var newLocation = CreateNewDirectory( directory, subdirectory, open.FileName);
if ((bool) open.ShowDialog())
CopyFile(open.FileName, newLocation);
else
"You must select a file to upload".Show();
}
private static void CopyFile( string oldPath, string newPath)
{
if(!File.Exists(newPath))
File.Copy(oldPath, newPath);
else
string.Format("The file {0} already exists in the current directory.", Path.GetFileName(newPath)).Show();
}
ファイルは無事にコピーされます。ただし、ユーザーが表示するためにコピーしたばかりのファイルを選択しようとすると、ファイルは例外ではありません。デバッグ後、動的画像のurisourceは、相対パス 'ファイル{selected file}'を解決していることがわかりました。そうすべき。
この問題は、新しくコピーされたファイルが選択されている場合にのみ発生します。アプリケーションを再起動して新しいファイルを選択すると、正常に動作します。
これが画像ソースを動的に設定するコードです。
//Cover = XAML Image
Cover.Source(string.Format(@"Files\{0}\{1}", item.ItemID, item.CoverImage), "carton.ico");
...
public static void Source( this Image image, string filePath, string alternateFilePath)
{
try
{image.Source = GetSource(filePath);}
catch(Exception)
{image.Source = GetSource(alternateFilePath);}
}
private static BitmapImage GetSource(string filePath)
{
var source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri( filePath, UriKind.Relative);
//Without this option, the image never finishes loading if you change the source dynamically.
source.CacheOption = BitmapCacheOption.OnLoad;
source.EndInit();
return source;
}
私は困惑しています。どんな考えも感謝しています。
解決 2
OpenFileDialogueのコンストラクターにオプションが欠けていたことがわかりました。対話は、相対パスが誤って解決されるようになっている現在のディレクトリを変更していました。
開いたファイルを次のものに置き換える場合:
var open = new OpenFileDialog{ Multiselect = true, Filter = "AllFiles|*.*", RestoreDirectory = true};
問題は解決されます。
他のヒント
私は直接的な答えを持っていませんが、そのような人々がファイルをアップロードできるように注意する必要があります。私はセミナーに参加していましたが、実際のエクスプロイトをシミュレートするのに良いハッカーと悪いハッカーがいました。 1つは、ファイルをアップロードすることを許可されたことです。彼らは悪意のあるASP.NETファイルをアップロードし、ファイルが最終的にユーザーに画像が提示された場所で直接ファイルを直接呼び出し、最終的にシステムを引き継ぐことができました。どのような種類のファイルが許可されているかを確認し、Webサーバーの非実施ディレクトリに保存されている可能性があります。