2016-04-05 9 views
9

Oto mój kod:Jak przekonwertować plik do tablicy bajtów bezpośrednio bez swojej drodze (bez zapisywania pliku)

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

Teraz jestem Konwersja ten plik do tablicy bajtów przy użyciu tego kodu:

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

Następnie przesyłam ten kod do mojej bazy danych nosql. To wszystko działa dobrze, ale problem polega na tym, że nie chcę zapisywać pliku. Zamiast tego chcę bezpośrednio przesłać plik do mojej bazy danych. I może to być możliwe, jeśli mogę po prostu przekonwertować plik na tablicę bajtów bezpośrednio, bez jej zapisywania.

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

Um ... więc co dokładnie jest problem IFormFile? – Kevin

+0

* file.OpenReadStream() * poszukaj dokumentacji IFormFile.OpenReadStream – Gusman

+0

Kiedy pierwotnie zapisałeś plik, w jakiej formie on był? Miałeś go jednak w pamięci, powinien już być tablicą bajtów lub tablicą bajtową. Musimy najpierw zobaczyć, w jaki sposób uzyskujesz plik i jak go zapisujesz. – Kevin

Odpowiedz

28

W przeciwieństwie do zapisywania danych jako ciąg (który przydziela więcej pamięci niż jest to potrzebne, a może nie działać, jeśli dane binarne ma zerowe bajty w nim), polecam podejście bardziej jak

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 
    } 
    } 
} 

również dla dobra innych, IFormFile jest udokumentowana na docs.asp.net z źródłowy C Oda na GitHub

Edycja

Per sugestie, ja manipulowane przykład korzystania z CopyTo method interfejsu

+0

można skrócić kod za pomocą funkcji kopiowania na IFormFile themselve. przy użyciu (strumień var = new MemoryStream()) { formFile.CopyTo (strumień); return stream.ToArray(); } – Bosken85

+0

@ Bosken85 Dobry połów! Zaktualizowałem przykład, aby odzwierciedlić Twoje rekomendacje. – erdomke

+0

Możesz również użyć 'file.CopyToAsync (ms)' teraz. –

2

Można użyć następującego kodu, aby przekształcić go do tablicy bajtów:

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); 
     } 
    } 
} 
Powiązane problemy