WPF中的文件上传器

时间:2010-07-29 02:36:58

标签: wpf wpf-controls binding wpftoolkit

我正在尝试在WPF 4.0中创建一个自定义文件上传控件,但我陷入了困境 浏览文件后,我无法将文件保存在我的解决方案文件夹中。我正在使用以下代码进行浏览

private void btnBrowse_Click(object sender, RoutedEventArgs e)
        {
            // Create OpenFileDialog

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.Filter = "Images (*.JPG;*.JPEG;*.PNG)|*.JPG;*.JPEG;*.PNG";
            Nullable<bool> result = dlg.ShowDialog();
            if (result == true)
            {
                string filename = dlg.FileName;
                FileNameTextBox.Text = filename;
            }
        }

 private void btnUpload_Click(object sender, RoutedEventArgs e)
        {

            string filename = FileNameTextBox.Text;
           // Now I want save this file to my image folder.
        }

现在我想将文件保存在我的Solution explore中的图像文件夹中。对于ASP.NET,我们使用Server.Mappath将指定的相对或虚拟路径映射到服务器上的相应物理目录。但我不确定我们可以在WPF中使用什么来实现同样的目的。我是WPF的新手所以请帮助我。

1 个答案:

答案 0 :(得分:2)

如果您正在谈论WPF而不是Silverlight,那么理解WPF和ASP.NET之间的区别非常重要。 ASP.NET是HTTP协议的托管平台。 ASP.NET站点中的路径不一定直接表示在磁盘上,因此Server.MapPath提供了一种将ASP.NET路径映射到phsyical路径的方法。

另一方面,WPF很简单,只是一个UI框架。它不是像ASP.NET这样的托管环境,因此映射路径的概念在WPF的上下文中是无关紧要的。根据您提供的代码,您不是“上传”文件,而只是打开文件。在WPF中,您的应用程序逻辑直接在用户系统上运行,因此您可以通过System.IO命名空间访问文件系统。您可以使用FileStream类创建新文件,并手动将源中的字节复制到新文件,或者只使用File类复制“已打开”文件。您的WPF UI正在为普通的“桌面”应用程序提供一个窗口,因此当您打开或保存文件时,不需要(很可能不会)上传文件。

请注意,由于您的应用程序是桌面应用程序,因此您将受到运行应用程序的用户的权限集的限制。如果运行应用程序的用户没有在磁盘上某处写入的权限,那么在尝试编写时会遇到异常。如果他们没有从某处读取或删除文件的权限,也是如此。确保您执行的任何文件活动都在用户具有权限的文件系统区域中完成,例如文档文件夹。

public void btnUpload_Click(object sender, RoutedEventArgs e)
{
    string filename = FileNameTextBox.Text;
    if (File.Exists(filename))
    {
        // TODO: Show an error message box to user indicating destination file already uploaded
        return;
    }

    string name = Path.GetFileName(filename);
    string destinationFilename = Path.Combine("C:\\temp\\uploaded files\\", name); 

    File.Copy(filename, destinationFilename);

    // TODO: Show information or message box indicating file has copied
}