设置图像源时相对路径分辨率的问题

时间:2010-01-07 14:35:51

标签: c# wpf relative-path imagesource

我构建了一个小型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();
}
    

无异常复制文件。但是,当用户尝试选择他们刚刚复制的文件进行显示时,找不到A文件异常。调试之后,我发现动态映像的UriSource正在将相对路径'Files {selected file}'解析为上面代码中文件select而不是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 个答案:

答案 0 :(得分:1)

虽然我没有直接答案,但您应谨慎使用,以便人们上传文件。我参加了一个研讨会,在那里他们有好的和坏的黑客来模拟现实生活中的漏洞。一个是允许上传文件。他们上传了恶意的asp.net文件并直接调用这些文件,因为它们最终会将图像呈现给用户,并最终能够接管系统。您可能想要以某种方式验证允许哪些类型的文件,并且可能已存储在Web服务器的非执行目录中。

答案 1 :(得分:1)

事实证明我在openfiledialogue的构造函数中缺少一个选项。对话框正在更改当前目录,导致相对路径无法正确解析。

如果用以下内容替换打开的文件:


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

问题已解决。