1. ホーム
  2. c#

ファイルをメモリ上のバイト配列に変換するには?

2023-08-26 16:40:44

質問

以下は私のコードです。

 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
}

どのように解決するのですか?

データを文字列として保存するのとは対照的に (これは必要以上にメモリを割り当てますし、バイナリデータにヌルバイトが含まれる場合は動作しないかもしれません)、以下のようなアプローチをお勧めします。

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 のソースコードは GitHub