2014-10-18 11 views
6

W MVC 5 Kiedyś to zrobić:Jak mogę przesłać plik w MVC 6 pod vNext?

var context = (HttpContextBase)Request.Properties["MS_HttpContext"]; 
var file = (HttpPostedFileBase)context.Request.Files[0]; 

Teraz nie są one dostępne w MVC 6 pod vNext. Jak mogę uzyskać plik (e) z żądania?

Odpowiedz

6

FileUpload nie jest jeszcze zaimplementowany w MVC6, see this issue, a pokrewne problemy, takie jak this one dla statusu.

Możesz zamieścić XMLHttpRequest z JavaScript i złapać ją coś takiego kodu:

public async Task<IActionResult> UploadFile() 
{ 
    Stream bodyStream = Context.Request.Body; 

    using(FileStream fileStream = File.Create(string.Format(@"C:\{0}", fileName))) 
    { 

     await bodyStream.CopyToAsync(fileStream); 

    } 

    return new HttpStatusCodeResult(200); 
} 

Edycja: Jeśli widzisz kwestie powiązane, że zostały już zamknięte. Możesz teraz użyć bardziej normalnego sposobu przesyłania plików w MVC6.

+0

Dzięki! Warto wspomnieć, że ponieważ chwyta treść żądania tak jak jest, działa tylko z niekasowanymi uploaderami plików (np. Valums), ale nie działa z nowszymi, które przesyłają w formacie chunked (np. Flow) –

8

Odpowiedź jest o wersji beta6.

Jest teraz w ramach. Z niektórymi zastrzeżeniami do tej pory, aby uzyskać przesłaną nazwę pliku, należy przeanalizować nagłówki. I trzeba wstrzykiwać IHostingEnvironment w kontrolerze, aby dostać się Wwwroot lokalizację folderu, bo nie ma więcej Server.MapPath()

Weź to jako przykład:

public class SomeController : Controller 
{ 

    private readonly IHostingEnvironment _environment; 

    public SomeController(IHostingEnvironment environment) 
    {  
     _environment = environment; 
    } 

    [HttpPost] 
    public ActionResult UploadFile(IFormFile file)//, int Id, string Title) 
    { 

     if (file.Length > 0) 
     { 
      var targetDirectory = Path.Combine(_environment.WebRootPath, string.Format("Content\\Uploaded\\")); 
      var fileName = GetFileName(file); 
      var savePath = Path.Combine(targetDirectory, fileName); 

      file.SaveAs(savePath); 
      return Json(new { Status = "Ok" }); 
     } 
     return Json(new { Status = "Error" }); 
    } 

    private static string GetFileName(IFormFile file) => file.ContentDisposition.Split(';') 
                   .Select(x => x.Trim()) 
                   .Where(x => x.StartsWith("filename=")) 
                   .Select(x => x.Substring(9).Trim('"')) 
                   .First(); 

} 
+3

Nie mogę dostać to działa - IFormFile ma zawsze wartość NULL. Zawsze otrzymuj ten dziennik: "Wykonywanie metody akcji z argumentami() - ModelSate jest ważny" " – RichardM

+3

Nie zadziała, chyba że ustawisz enctype =" multipart/form-data "na tagu formularza! – EvAlex

+2

Dzięki @EvAlex, który ustawił mnie na właściwej ścieżce. Magia z Postmanem i vNext jest taka, że ​​nazwa klucza dla twojego pliku dokładnie pasuje do nazwy argumentu IFormFile w twojej metodzie POST. – RichardM

3

Najprostszym sposobem, aby przesłać plik ASP.NET Rdzeń 1,0 (MVC 6)
widok (cshtml)

<form method="post" asp-action="Upload" asp-controller="Home" enctype="multipart/form-data"> 
    <input type="file" name="file" /> 
    <input type="submit" value="upload"/> 
</form> 

kontroler (cs):

[HttpPost] 
public IActionResult Upload(IFormFile file) 
{ 
    if (file == null || file.Length == 0) 
     throw new Exception("file should not be null"); 

    // RC1 
    // var originalFileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');  
    // file.SaveAs("your_file_full_address"); 

    // RC2 
    using (var fileStream = new FileStream("path_address", FileMode.Create)) 
    { 
     await file.CopyTo(fileStream); 
    } 
} 
+0

Czy to pozwala na przesłanie pliku w porcjach? –

+0

@RobMcCabe Nie sądzę ... – Soren