2014-10-18 4 views
6

In MVC 5 habe ich dies zu tun:Wie kann ich eine Datei in MVC 6 unter vNext hochladen?

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

Jetzt sind diese in MVC 6 unter vNext nicht zur Verfügung. Wie kann ich die Datei (en) von der Anfrage erhalten?

Antwort

6

FileUpload ist in MVC6 noch nicht implementiert, see this issue und verwandte Probleme wie this one für den Status.

Sie können einen XMLHttpRequest von JavaScript posten und es mit so etwas wie dieser Code fangen:

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

Edit: Wenn Sie die Fragen im Zusammenhang sehen, haben sie jetzt geschlossen worden. Sie können jetzt eine normalere Methode zum Hochladen von Dateien in MVC6 verwenden.

+0

Dank! Erwähnenswert, dass, da dies den Anfragetext packt, wie es ist, es nur mit nicht-chunked Datei-Uploadern (zB Valums) funktioniert, aber nicht mit neueren, die im Chunked-Format (zB Flow) –

8

Antwort unten ist etwa beta6 Version.

Es ist jetzt im Rahmen. Mit einigen Vorbehalten, um den hochgeladenen Dateinamen zu erhalten, müssen Sie Kopfzeilen analysieren. Und Sie haben IHostingEnvironment in Ihrem Controller zu injizieren zu bekommen Ordnerort wwwroot, weil es nicht mehr Server.MapPath ist()

dieses Nehmen wir als Beispiel:

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

hochladen ich nicht bekommen kann das funktioniert - IFormFile ist immer null. Erhalten Sie immer dieses Protokoll: "Ausführen der Aktionsmethode mit arguments() - ModelSate ist gültig" " – RichardM

+3

Es wird nicht funktionieren, wenn Sie Enctype =" multipart/form-data "auf Formular-Tag festlegen! – EvAlex

+2

Danke @EvAlex, das hat mich auf den richtigen Weg gebracht. Die Magie mit Postman und vNext besteht darin, dass der Schlüsselname für Ihre Datei genau dem IFormFile-Argumentnamen in Ihrer POST-Methode entspricht. – RichardM

3

Der einfachste Weg, um eine Datei zu laden in ASP.NET Core-1,0 (MVC 6)
Ansicht (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> 

-Controller (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

Ermöglicht dies das Hochladen der Datei in Chunks? –

+0

@RobMcCabe Ich glaube nicht ... – Soren

Verwandte Themen