2015-10-20 69 views
2

我有一个控制查看页面。当用户选择文件并点击提交按钮时,这会使ajax调用将文件上传到服务器上。不幸的是我的服务器方法接受上传的文件路径(如C:/Videos/1.mp4)。这在以下代码中很适合string demoPath,但我不确定如何在用户选择控件时获得类似的路径。由于安全原因,现代浏览器不允许公开路径。如何实现这一目标?从窗体获取FileStream发布文件

[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)) 
     { 
      // :::: 
     } 
     // :::::: 
    } 

回答

1

我问我的同事在public async Task RunUploader(string filePath)参数做了必要的修改。该代码是用于控制台应用程序的YouTube .NET示例的一部分。现在我们正在为网络开发,在这种情况下,我们无法通过完整的路径。所以他们做了如下改变:

[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) 
    { 
     // :::::: 
    } 
    // :::::::::: 
} 

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

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)) 
    { 
     // :::: 
    } 
    // :::::: 
} 
+0

谢谢Bartosz。好点,我已经解决了这个问题。 –