2015-10-20 2 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. Хорошая точка, как и я, я уже решил это. –

Смежные вопросы