2016-04-05 9 views
9

Ecco il mio codice:Come convertire un file in array di byte direttamente senza il suo percorso (senza file di salvataggio)

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

Ora sto conversione di questo file in array di byte utilizzando questo codice:

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

E poi sto caricando questo codice nel mio database nosql. Funziona tutto bene, ma il problema è che non voglio salvare il file. Invece di quello voglio caricare direttamente il file nel mio database. E può essere possibile se riesco a convertire il file in array di byte direttamente senza salvarlo.

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 ... Che cosa è esattamente il problema? – Kevin

+0

* file.OpenReadStream() * cerca la documentazione di IFormFile.OpenReadStream – Gusman

+0

Quando hai salvato il file originariamente, in quale forma era? Comunque lo avevi in ​​memoria, avrebbe dovuto essere già un array di byte o convertibile in un array di byte. Dovremmo vedere come stai ottenendo il file in primo luogo e come lo stai salvando. – Kevin

risposta

28

Al contrario di salvare i dati come una stringa (che alloca più memoria del necessario e potrebbe non funzionare se la dati binari trovi byte nulli in esso), consiglio un approccio più simile

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

Inoltre, per il beneficio di terzi, IFormFile è documentato sul docs.asp.net con la sorgente c ode il GitHub

Modifica

Per i suggerimenti, ho modificato l'esempio di utilizzare la CopyTo method del IFormFile dell'interfaccia

+0

potresti abbreviare il codice usando le funzioni di copia su IFormFile themselve. utilizzando (var stream = new MemoryStream()) { formFile.CopyTo (stream); return stream.ToArray(); } – Bosken85

+0

@ Bosken85 Buona cattura! Ho aggiornato l'esempio per riflettere i tuoi consigli. – erdomke

+0

Puoi anche usare 'file.CopyToAsync (ms)' adesso. –

2

È possibile utilizzare il seguente codice per convertirlo in un array di byte:

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