【问题标题】:How to pass a user-selected filepath as a string如何将用户选择的文件路径作为字符串传递
【发布时间】:2017-02-15 19:30:34
【问题描述】:

所以我有以下无法更改的方法:

    public async Task<User> UploadSaa(string filepath, User user)
    {

        Assembly cesCommon = Assembly.GetExecutingAssembly();
        byte[] saaBytes = null;
        using (Stream saarStream = cesCommon.GetManifestResourceStream(name))
        using (MemoryStream saaMemoryStream = new MemoryStream())
        {
            saaStream.CopyTo(saarMemoryStream);
            saaBytes = saaMemoryStream.ToArray();
            user.Saa = saaBytes;
        }
        user = await SaveNewUser(user);
        return user;
    }

在它以前的用法中,文件路径被直接传递给它,以便初始化数据库以进行测试。但是,现在我需要找到一种方法将变量字符串传递给 UploadSaa(), b/c 在生产中,用户将从他们自己的系统中选择他们自己的文件,我无法指定他们的文件路径。我尝试使用 OpenFileDialog,但返回的是文件,而不是路径

我的问题是:如何修改 OpenFileDialog 以接受文件路径,然后将其传递给 UploadSaa?有更好的选择吗?如果我必须修改 UploadSaa,应该进行哪些更改?

【问题讨论】:

  • AFAIK,由于安全原因,无法从浏览器传递完整的文件路径。我很困惑,为什么要获取用户的本地文件路径?
  • 这样用户就可以上传一个pdf文件到数据库了。
  • 我已经发布了在asp.net mvc中上传文件的答案
  • 感谢大家的回复!你们都提供了一些很好的途径,在我看到最有效的方法后,我会在接下来的几个小时内接受答案!

标签: c# asp.net-mvc


【解决方案1】:

您应该能够从 openFileDialog object.FileName 获取完整路径

OpenFileDialog object= new OpenFileDialog();
string fullPath = object.FileName;

或者

您还可以查看其他选项,例如使用 FolderBrowserDialog。

参考this 示例。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    您的问题不清楚,实际上您使用 asp.net mvc 发布了标签并且您使用的是 OpenFileDialog?这与 Windows 窗体或 Web 应用程序有关吗?如果是后者,请检查以下内容

    尝试使用 HttpPostedFileBase,从那里你可以得到路径

    https://msdn.microsoft.com/en-us/library/system.web.httppostedfilebase.filename(v=vs.110).aspx

    [HttpPost]
    public ActionResult Upload(HttpPostedFileBase file)
    {...}
    

    创建模型绑定器

    public class HttpOdometerPostedFileBaseModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                if(controllerContext == null)
                    throw new ArgumentNullException(nameof(controllerContext));
    
                if(bindingContext == null)
                    throw new ArgumentNullException(nameof(bindingContext));
    
                HttpPostedFileBase theFile = controllerContext.HttpContext.Request.Files[bindingContext.ModelName];
    
                return theFile;
            }
        }
    

    并在 global.asax.cs 上注册

    System.Web.Mvc.ModelBinders.Binders[typeof(HttpPostedFileBase)] = new HttpOdometerPostedFileBaseModelBinder();
    

    【讨论】:

      【解决方案3】:

      我怀疑通过查看您的代码,您假设在网络中获取文件类似于桌面版本。在桌面版本中,您可以获得完整路径并相应地读取流。但是在网络中,浏览器将传递流(用于文件类型输入)而不是传递文件路径。所以,你只需要采取行动来捕捉你的文件流。

      您可以使用HttpPostedFileBase,它会为您提供流、文件名和内容长度。

      你的动作方法应该是这样的:

      [HttpPost]  
      public ActionResult MyUploadingAction(HttpPostedFileBase file)  
      {  
          var filename = file.FileName; 
          // For reading stream
          var reader = new BinaryReader(file.InputStream);
          byte[] byteData= reader.ReadBytes(file.InputStream.Length);
      
      
          return View();  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多