Проблема с относительным разрешением пути при установке источника изображения
-
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 для динамического изображения разрешает относительный путь «файлы {выбранное файл}» в каталог, который был просто просмотрен примером файла в приведенном выше коде вместо каталога приложений, как кажется должно.
Эта проблема возникает только тогда, когда выбран недавно скопированный файл. Если вы перезапустите приложение и выберите новый файл, он работает нормально.
Вот код, который динамически устанавливает источник изображения:
//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};
Проблема решается.
Другие советы
Хотя у меня нет прямого ответа, вы должны соблюдать осторожность для такого, позволяя людям загружать файлы. Я был на семинаре, где у них были хорошие против плохих хакеров, чтобы имитировать реальные подвиги. Одним из них было такова, что файлы были разрешены для загрузки. Они загрузили вредоносные файлы ASP.NET и называли файлы непосредственно как новые, где изображения в конечном итоге были представлены пользователям, и в конечном итоге смогли взять на себя систему. Вы можете каким-то образом проверить, какие типы файлов разрешены, и, возможно, хранится в не реагирующем каталоге вашего веб-сервера.