2016-04-16 12 views
6

Ich versuche, Dateien mithilfe von Aspect-Core mit Ajax-Anforderung hochzuladen. In früheren Versionen von .net verwendet i diesesRequest.Files in ASP.NET CORE

foreach (string fileName in Request.Files) 
      { 
       HttpPostedFileBase file = Request.Files[fileName]; 
       //Save file content goes here 

       fName = file.FileName; 
    (...) 

mit zu handhaben, aber jetzt seine zeigt Fehler bei request.files, wie kann ich es an die Arbeit? Ich suchte und fand, dass httppofiledfile zu iformfile geändert worden ist, aber wie man request.files handhabt?

+1

werfen Sie einen Blick auf diese Links http://stackoverflow.com/questions/26443305/how-can-i-upload-a-file-in-mvc-6-under-vnext und http: // stackoverflow.com/questions/29836342/mvc-6-httppostedfilebase vor allem diese Antwort http://stackoverflow.com/a/27980038/5426333 –

+0

Danke für den Kommentar, ich habe tatsächlich gefunden, dass 'IFormFile-Datei in Request.Form.Files' jetzt ich Ich bin daran interessiert, die Parameterwerte zu bekommen – Ironsun

Antwort

1

Dieser Code funktioniert für 100% für beiden Dateien mit regulärer Form oder Ajax hochgeladen:

[HttpPost] 
public async Task<IActionResult> Upload(IList<IFormFile> files) 
{ 
    foreach (IFormFile source in files) 
    { 
    string filename = ContentDispositionHeaderValue.Parse(source.ContentDisposition).FileName.Trim('"'); 

    filename = this.EnsureCorrectFilename(filename); 

    using (FileStream output = System.IO.File.Create(this.GetPathAndFilename(filename))) 
     await source.CopyToAsync(output); 
    } 

    return this.RedirectToAction("Index"); 
} 

private string EnsureCorrectFilename(string filename) 
{ 
    if (filename.Contains("\\")) 
    filename = filename.Substring(filename.LastIndexOf("\\") + 1); 

    return filename; 
} 

private string GetPathAndFilename(string filename) 
{ 
    return this.HostingEnvironment.WebRootPath + "\\files\\" + filename; 
} 
8

Dies funktioniert Code aus einem aktuellen Projekt. Daten wurden von Request.Files zu Request.Form.Files verschoben. Für den Fall, dass Sie Stream in Byte-Array konvertieren müssen - das ist die einzige Implementierung, die für mich funktionierte. Andere würden leere Arrays zurückgeben.

using System.IO; 
var filePath = Path.GetTempFileName(); 
foreach (var formFile in Request.Form.Files) 
{ 
    if (formFile.Length > 0) 
    { 
     using (var inputStream = new FileStream(filePath, FileMode.Create)) 
     { 
     // read file to stream 
     await formFile.CopyToAsync(inputStream); 
     // stream to byte array 
     byte[] array = new byte[inputStream.Length]; 
     inputStream.Seek(0, SeekOrigin.Begin); 
     inputStream.Read(array, 0, array.Length); 
     // get file name 
     string fName = formFile.FileName; 
     } 
    } 
}