Проблема с относительным разрешением пути при настройке источника изображения - PullRequest
1 голос
/ 07 января 2010

Я создал небольшое приложение 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 для динамического изображения разрешает относительный путь «Files {selected file}» к каталогу, который только что просматривался файлом, выбранным в приведенном выше коде, вместо каталога Application, как это выглядит это должно.

Эта проблема возникает только при выборе нового скопированного файла. Если вы перезапустите приложение и выберете новый файл, он будет работать нормально.

Вот код, который динамически устанавливает источник изображения:

    
//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 ]

1 голос
/ 08 января 2010

Оказывается, мне не хватало опции в конструкторе моего openfiledialogue. Диалог изменял текущий каталог, что приводило к неправильному разрешению относительных путей.

Если вы замените открытый файл следующим:


var open = new OpenFileDialog{ Multiselect = true, Filter = "AllFiles|*.*", RestoreDirectory = true};

Проблема решена.

1 голос
/ 07 января 2010

Хотя у меня нет прямого ответа, вы должны быть осторожны, чтобы люди могли загружать файлы. Я был на семинаре, где у них были хорошие против плохих хакеров, чтобы имитировать реальные подвиги. Один был такой, что файлы были разрешены для загрузки. Они загружали вредоносные файлы asp.net и вызывали файлы напрямую по мере их появления, когда изображения в конечном итоге представлялись пользователям, и в конечном итоге смогли захватить систему. Возможно, вы захотите как-то проверить, какие типы файлов разрешены и, возможно, хранятся в несуществующем каталоге вашего веб-сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...