如何将用户选择的文件路径作为字符串传递

时间:2017-02-15 19:30:35

标签: c# asp.net-mvc

所以我有以下方法无法改变:

    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;
    }

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

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

3 个答案:

答案 0 :(得分:0)

您应该能够从openFileDialog object.FileName

获取完整路径
OpenFileDialog object= new OpenFileDialog();
string fullPath = object.FileName;

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

请参阅this示例。

我希望有所帮助!

答案 1 :(得分:0)

您的问题不明确,实际上您使用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)
{...}

创建ModelBinder

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();

答案 2 :(得分:0)

我怀疑通过查看您的代码,您假设在Web中获取类似于桌面版的文件。在桌面版中,您可以相应地获得完整路径和读取流。但是在web中,浏览器将传递流(用于文件类型输入)而不是传递filepath。因此,您只需要有可以捕获文件流的操作。

您可以使用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();  
}