2016-04-05 2 views
9

Вот мой код:Как преобразовать файл в массив байтов непосредственно без пути (без сохранения файла)

public async Task<IActionResult> Index(ICollection<IFormFile> files) 
    { 
     foreach (var file in files) 
      uploaddb(file); 
     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)); 
} 

Теперь я Преобразование этого файла в массив байтов, используя этот код:

var filepath = Path.Combine(_environment.WebRootPath, "uploads/Book1.xlsx"); 
      byte[] fileBytes = System.IO.File.ReadAllBytes(filepath); 
      string s = Convert.ToBase64String(fileBytes); 

И затем я загружаю этот код в мою базу данных nosql. Это все работает нормально, но проблема в том, что я не хочу сохранять файл. Вместо этого я хочу напрямую загрузить файл в мою базу данных. И это может быть возможно, если я могу просто преобразовать файл в массив байтов напрямую, не сохраняя его.

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

///Code to Convert the file into byte array 
} 
+0

Гм ... так, что именно проблема? – Kevin

+0

* file.OpenReadStream() * искать документацию IFormFile.OpenReadStream – Gusman

+0

Когда вы изначально сохранили файл, в какой форме он был? Однако у вас было это в памяти, он должен был уже быть байтовым массивом или преобразован в массив байтов. Нам нужно будет увидеть, как вы получаете файл в первую очередь, и как вы его сохраняете. – Kevin

ответ

28

В отличие от сохранения данных в виде строки (которая выделяет больше памяти, чем необходимо, и если не будет работать двоичные данные имеют нулевые байты в нем), я бы рекомендовал подход больше похож

foreach (var file in files) 
{ 
    if (file.Length > 0) 
    { 
    using (var ms = new MemoryStream()) 
    { 
     file.CopyTo(ms); 
     var fileBytes = ms.ToArray(); 
     string s = Convert.ToBase64String(fileBytes); 
     // act on the Base64 data 
    } 
    } 
} 

Кроме того, в пользу других, IFormFile документирована на docs.asp.net с исходным с ода на GitHub

Edit

За предложения, я подправил пример использования CopyTo method интерфейса IFormFile

+0

вы могли бы сократить код, используя функции копирования в IFormFile themselve. using (var stream = new MemoryStream()) { formFile.CopyTo (поток); return stream.ToArray(); } – Bosken85

+0

@ Bosken85 Хорошая добыча! Я обновил этот пример, чтобы отразить ваши рекомендации. – erdomke

+0

Вы также можете использовать 'file.CopyToAsync (ms)' now. –

2

Вы можете использовать следующий код, чтобы преобразовать его в массив байтов:

foreach (var file in files) 
{ 
    if (file.Length > 0) 
    { 
     var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"'); 
     using (var reader = new StreamReader(file.OpenReadStream())) 
     { 
     string contentAsString = reader.ReadToEnd(); 
     byte[] bytes = new byte[contentAsString.Length * sizeof(char)]; 
     System.Buffer.BlockCopy(contentAsString.ToCharArray(), 0, bytes, 0, bytes.Length); 
     } 
    } 
}