2015-04-23 20 views
24

Sto tentando di caricare un'immagine utilizzando MVC 6; tuttavia, non sono in grado di trovare la classe HttpPostedFileBase. Ho controllato lo GitHub e non ho avuto fortuna. Qualcuno conosce il modo corretto di caricare un file in MVC6?MVC 6 HttpPostedFileBase?

veramente apprezzato, Steven M.

+1

prega di dare un'occhiata qui: https://neelbhatt40.wordpress.com/2016/02/02/upload-file-in-mvc-6asp-net-core-1-0/ – Neel

risposta

36

MVC 6 usato un altro meccanismo per caricare i file. È possibile ottenere più esempi su GitHub o othersources. Basta usare IFormFile come parametro della vostra azione o di una raccolta di file o IFormFileCollection se si desidera caricare alcuni file al tempo stesso:

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

Potete vedere attuale contratto di IFormFile in asp.net sources. Vedi anche ContentDispositionHeaderValue per ulteriori informazioni sul file.

+0

Sto provando a convertire l'immagine nell'array di byte, ma non c'è alcun metodo di readbyte o equivalente nell'oggetto di flusso reader. E il lettore binario non funziona ora come l'oggetto ifileform non ha la proprietà del flusso di input –

+0

@RachitGupta qual è il tuo scenario? Perché hai bisogno di convertire l'immagine in 'byte []'. Che tipo di testo usi? Spero che il prossimo collegamento ti sarà utile. http://stackoverflow.com/questions/3801275/how-to-convert-image-in-byte-array –

+0

Puoi migliorare questa risposta citando quale 'uso' è richiesto e se è necessario un riferimento al progetto - poiché dotnetcore non include molte cose per impostazione predefinita e devono essere aggiunte in modo esplicito. Forse Visual Studio aggiungerà automaticamente i giusti riferimenti, ma il codice di Visual Studio non può. –

17

Non c'è HttpPostedFileBase in MVC6. È possibile utilizzare IFormFile invece.

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

Snippet dal link qui sopra:

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

Sto usando Beta 7, ma sto ottenendo IFormFile è nullo quando richiesta Ajax. Anche FileDetails non è stato trovato nel mio caso. Guiderete voi. – Karthick

3

Stavo cercando da un po 'di tempo cercando di mettere insieme questo in. Netto core e ho finito con il sotto. La conversione Base64 verrà eseguita in seguito in modo che il recupero e la visualizzazione siano un po 'più semplici. Ho usato IFormFileCollection per essere in grado di fare più file.

[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

e sotto v'è il ritorno di file da un elenco e quindi scaricare.

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

Un'altra opzione: public async Task Create(), quindi i file possono essere recuperati da: var files = HttpContext.Request.Form.Files; – JoshYates1980

+0

Ho provato a modificare il mio commento sopra, ma SOF ha detto che ho superato i 5 minuti. Ecco un'altra opzione: public JsonResult Create(), e quindi i file possono essere recuperati da: var files = HttpContext.Request.Form.Files; Entrambe le opzioni funzionano inviando più file al server. – JoshYates1980