2015-04-23 16 views
24

Ich versuche ein Bild mit MVC 6 hochladen; Ich bin jedoch nicht in der Lage, die Klasse zu finden. Ich habe die GitHub überprüft und hatte kein Glück. Kennt jemand den richtigen Weg, um eine Datei in hochladen?MVC 6 HttpPostedFileBase?

wirklich geschätzt, Steven M.

+1

Weitere Informationen finden sie hier: https://neelbhatt40.wordpress.com/2016/02/02/upload-file-in-mvc-6asp-net-core-1-0/ – Neel

Antwort

36

MVC 6 verwendet einen anderen Mechanismus zum Hochladen von Dateien. Sie können weitere Beispiele auf GitHub oder othersources erhalten. Verwenden Sie einfach IFormFile als Parameter Ihrer Aktion oder eine Sammlung von Dateien oder IFormFileCollection, wenn Sie einige Dateien in der gleichen Zeit hochladen möchten:

public async Task<IActionResult> UploadSingle(IFormFile file) 
{ 
    FileDetails fileDetails; 
    using (var reader = new StreamReader(file.OpenReadStream())) 
    { 
     var fileContent = reader.ReadToEnd(); 
     var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition); 
     var fileName = parsedContentDisposition.FileName; 
    } 
    ... 
} 

[HttpPost] 
public async Task<IActionResult> UploadMultiple(ICollection<IFormFile> files) 
{ 
    var uploads = Path.Combine(_environment.WebRootPath,"uploads"); 
    foreach(var file in files) 
    { 
     if(file.Length > 0) 
     { 
      var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 
      await file.SaveAsAsync(Path.Combine(uploads,fileName)); 
     } 
     ... 
    } 
} 

Sie aktuelle Vertrag von IFormFile in asp.net sources sehen können. Siehe auch ContentDispositionHeaderValue für zusätzliche Dateiinformationen.

+0

Ich versuche, Bild in Byte-Array zu konvertieren, aber es gibt keine Methode von Readbytes oder Äquivalent in Stream-Reader-Objekt. Und binärer Leser funktioniert jetzt nicht, da das ifileform-Objekt keine Eingabe-Stream-Eigenschaft hat. –

+0

@RachitGupta was ist dein Szenario? Warum musst du das Bild in 'byte []' konvertieren. Was für einen Typ verwendest du? Hoffe der nächste Link wird dir hilfreich sein. http://StackOverflow.com/Questions/3801275/How-to-convert-image-in-byte-array –

+0

Sie könnten diese Antwort verbessern, indem Sie erwähnen, welche "Verwendung" erforderlich ist, und ob eine Projektverweis erforderlich ist - seit dotnetcore enthält standardmäßig nicht viele Dinge und sie müssen explizit hinzugefügt werden. Vielleicht fügt Visual Studio automatisch die richtigen Referenzen hinzu, aber Visual Studio Code kann nicht. –

17

Es gibt keine HttpPostedFileBase in MVC6. Sie können stattdessen IFormFile verwenden.

Beispiel: https://github.com/aspnet/Mvc/blob/dev/test/WebSites/ModelBindingWebSite/Controllers/FileUploadController.cs

Schnipsel aus der obigen Verbindung:

public FileDetails UploadSingle(IFormFile file) 
{ 
    FileDetails fileDetails; 
    using (var reader = new StreamReader(file.OpenReadStream())) 
    { 
     var fileContent = reader.ReadToEnd(); 
     var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition); 
     fileDetails = new FileDetails 
     { 
      Filename = parsedContentDisposition.FileName, 
      Content = fileContent 
     }; 
    } 

    return fileDetails; 
} 
+1

ich verwende Beta 7, aber ich bekomme IFormFile ist Null, wenn Ajax Anfrage. Auch FileDetails wird in meinem Fall nicht gefunden. – Karthick

3

Ich habe lange gesucht und versucht, dies zusammen in .net-Core zu tun und endete mit dem unten. Die Base64-Konvertierung wird als nächstes durchgeführt, so dass das Abrufen und Anzeigen etwas einfacher ist. Ich habe IFormFileCollection verwendet, um mehrere Dateien ausführen zu können.

[HttpPost] 
    public async Task<IActionResult> Create(IFormFileCollection files) 
    { 

     Models.File fileIn = new Models.File(); 
     if(model != null && files != null) 
     { 
      foreach (var file in files) 
      { 
       if (file.Length > 0) 
       { 
        var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 

         byte[] fileBytes = null; 
         using (var fileStream = file.OpenReadStream()) 
         using (var ms = new MemoryStream()) 
         { 
          fileStream.CopyTo(ms); 
          fileBytes = ms.ToArray(); 
          //string s = Convert.ToBase64String(fileBytes); 
          // act on the Base64 data 
         } 


         fileIn.Filename = fileName; 
         fileIn.FileLength = Convert.ToInt32(file.Length); 
         fileIn.FileType = file.ContentType; 
         fileIn.FileTypeId = model.FileTypeId; 
         fileIn.FileData = fileBytes; 
         _context.Add(fileIn); 
         await _context.SaveChangesAsync(); 
       } 
      } 
     } 
     return View(); 
    } 

EDIT

Und unten ist Rückkehr von Dateien auf eine Liste und dann herunterladen.

public JsonResult GetAllFiles() 
    { 

     var files = _context.File 
      .Include(a => a.FileCategory) 
      .Select(a => new 
      { 
       id = a.Id.ToString(), 
       fileName = a.Filename, 
       fileData = a.FileData, 
       fileType = a.FileType, 
       friendlyName = a.FriendlyName, 
       fileCategory = a.FileCategory.Name.ToLower() 
      }).ToList(); 

     return Json(files); 
    } 

    public FileStreamResult DownloadFileById(int id) 
    { 
     // Fetching file encoded code from database. 
     var file = _context.File.SingleOrDefault(f => f.Id == id); 
     var fileData = file.FileData; 
     var fileName = file.Filename; 

     // Converting to code to byte array 
     byte[] bytes = Convert.FromBase64String(fileData); 

     // Converting byte array to memory stream. 
     MemoryStream stream = new MemoryStream(bytes); 

     // Create final file stream result. 
     FileStreamResult fileStream = new FileStreamResult(stream, "*/*"); 

     // File name with file extension. 
     fileStream.FileDownloadName = fileName; 
     return fileStream; 
    } 
+0

Eine andere Option: public async Task Create(), und dann können die Dateien abgerufen werden durch: var files = HttpContext.Request.Form.Files; – JoshYates1980

+0

Ich habe versucht, meinen Kommentar oben zu bearbeiten, aber SOF sagte, dass ich 5 Minuten überschritten habe. Hier ist eine weitere Option: public JsonResult Create(), und dann können die Dateien abgerufen werden durch: var files = HttpContext.Request.Form.Files; Beide Optionen funktionieren beim Senden mehrerer Dateien an den Server. – JoshYates1980