2016-04-16 11 views
6

Я пытаюсь загрузить файлы с использованием ядра aspnet с помощью ajax-запроса. В предыдущих версиях .net я использовал, чтобы справиться с этим с помощьюRequest.Files в ASP.NET CORE

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

       fName = file.FileName; 
    (...) 

, но теперь его показывает ошибки в request.files, как я могу заставить его работать? я искал и обнаружил, что httppostedfile был изменен на файл iformfile, но как обрабатывать файлы request.files?

+1

посмотрите на эти ссылки http://stackoverflow.com/questions/26443305/how-can-i-upload-a-file-in-mvc-6-under-vnext и HTTP: // stackoverflow.com/questions/29836342/mvc-6-httppostedfilebase особенно этот ответ http://stackoverflow.com/a/27980038/5426333 –

+0

спасибо за комментарий, я действительно нашел, что 'IFormFile файл в Request.Form.Files' теперь i я застрял в получении значений параметров – Ironsun

ответ

1

Этот код работает на 100% для обоих файлов, загруженных с помощью регулярных формы или Ajax:

[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

Это рабочий код из недавнего проекта. Данные были перемещены с . Запросить.Продолжительность до Request.Form.Files. Если вам нужно преобразовать поток в массив байтов - это единственная реализация, которая сработала для меня. Другие возвращают пустой массив.

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; 
     } 
    } 
} 
Смежные вопросы