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



Вот мой код:



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

2 ответов:

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

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 Метод интерфейса IFormFile

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

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

Comments

    Ничего не найдено.