web-dev-qa-db-fra.com

Comment convertir un fichier en tableau d'octets en mémoire?

Voici mon code:

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

Maintenant, je convertis ce fichier en tableau d'octets en utilisant ce code:

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

Et puis je télécharge ce code dans ma base de données nosql. Cela fonctionne très bien, mais le problème est que je ne veux pas enregistrer le fichier. Au lieu de cela, je veux télécharger directement le fichier dans ma base de données. Et cela peut être possible si je peux simplement convertir le fichier en tableau d'octets directement sans l'enregistrer.

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

Plutôt que de sauvegarder les données en tant que chaîne (qui alloue plus de mémoire que nécessaire et pourrait ne pas fonctionner si les données binaires contiennent des octets nuls), je recommanderais une approche plus semblable à

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

De plus, pour le bénéfice des autres, le code source de IFormFile peut être trouvé sur GitHub

87
erdomke

Vous pouvez utiliser le code suivant pour le convertir en tableau d'octets:

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