我构建了一个小型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;
}
我很难过。任何想法都会受到赞赏。
答案 0 :(得分:1)
虽然我没有直接答案,但您应谨慎使用,以便人们上传文件。我参加了一个研讨会,在那里他们有好的和坏的黑客来模拟现实生活中的漏洞。一个是允许上传文件。他们上传了恶意的asp.net文件并直接调用这些文件,因为它们最终会将图像呈现给用户,并最终能够接管系统。您可能想要以某种方式验证允许哪些类型的文件,并且可能已存储在Web服务器的非执行目录中。
答案 1 :(得分:1)
事实证明我在openfiledialogue的构造函数中缺少一个选项。对话框正在更改当前目录,导致相对路径无法正确解析。
如果用以下内容替换打开的文件:
var open = new OpenFileDialog{ Multiselect = true, Filter = "AllFiles|*.*", RestoreDirectory = true};
问题已解决。