【问题标题】:Get FileStream from form posted file从表单发布的文件中获取 FileStream
【发布时间】:2016-01-18 22:54:25
【问题描述】:

我在查看页面上有一个控件。当用户选择文件并单击提交按钮时,这会调用 ajax 将文件上传到服务器上。不幸的是,我的服务器方法接受文件路径(如C:/Videos/1.mp4)上传。这在下面的代码中与string demoPath 一起工作很好,但我不确定当用户选择控制时如何获得类似的路径。由于安全原因,现代浏览器不允许暴露路径。如何做到这一点?

    [HttpPost]
    public async Task<JsonResult> Upload(string lectureId, string filepath)
    {
        for (int i = 0; i < Request.Files.Count; i++)
        {
            //// This works great
            //string demoPath = "C:/Users/abchi/Desktop/BigBuckBunny.mp4";


            var file = Request.Files[i];
            var fileName = Path.GetFileName(file.FileName);
            //var path = Path.Combine(Server.MapPath("~/User/"), fileName);
            //file.SaveAs(path);

            //await RunUploader(demoPath);
            await RunUploader(get_path_from_posted_file_or_request);
        }

        return Json(new { error = false, message = "Video uploaded." });
    }


    public async Task RunUploader(string filePath)
    {
        // :::::::
        using (var fileStream = new FileStream(filePath, FileMode.Open))
        {
            // ::::
        }
        // ::::::
    }

【问题讨论】:

    标签: asp.net asp.net-mvc file-upload


    【解决方案1】:

    我不确定这是预期的,因为我不太明白。

    下载用户电脑的文件路径不能是-https://stackoverflow.com/a/15201258/4599089

    但如果您想访问服务器上的 FileStream:

    文件有 InputStream,你可以使用这个:

    [HttpPost]
    public async Task<JsonResult> Upload(string lectureId, string filepath)
    {
        for (int i = 0; i < Request.Files.Count; i++)
        {
            var file = Request.Files[i];
            var fileName = Path.GetFileName(file.FileName);
    
            var path = Path.Combine(Server.MapPath("~/User/"), fileName);
            var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
            file.InputStream.CopyTo(fileStream);
            fileStream.Close();
    
            await RunUploader(path); //path or stream
        }
    
        return Json(new { error = false, message = "Video uploaded." });
    }
    
    
    public async Task RunUploader(string filePath)
    {
        // :::::::
        using (var fileStream = new FileStream(filePath, FileMode.Open))
        {
            // ::::
        }
        // ::::::
    }
    

    【讨论】:

    • 谢谢巴托兹。好点,我已经解决了这个问题。
    【解决方案2】:

    我要求我的开发伙伴对public async Task RunUploader(string filePath) 参数进行必要的更改。所述代码是用于控制台应用的 YouTube .NET 示例的一部分。现在我们正在为 web 开发,在这种情况下我们不能通过完整路径。所以他们做了以下改动:

    [HttpPost]
    public async Task<JsonResult> Upload(string lectureId)
    {
        for (int i = 0; i < Request.Files.Count; i++)
        {
            var file = Request.Files[i];
            Stream fileStream = file.InputStream;
            await Run(fileStream);
        }
    
        return Json(new { error = false, message = "Video uploaded." });
    }
    
    public async Task Run(Stream fileStream)
    {
        // ::::::::::
        using (fileStream)
        {
            // ::::::
        }
        // ::::::::::
    }
    

    现在有了这个改变,一切都开始工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2014-04-27
      • 2013-09-11
      相关资源
      最近更新 更多