如何将文件转换为内存中的字节数组?

Kal*_*alp 35 c# asp.net-core

这是我的代码:

 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我使用以下代码将此文件转换为字节数组:

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

然后我将此代码上传到我的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
}
Run Code Online (Sandbox Code Playgroud)

erd*_*mke 98

与将数据保存为字符串(分配比所需内存更多的内存,如果二进制数据中包含空字节可能无效)相反,我建议采用更像

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,为了其他人的利益,IFormFile可以在GitHub上找到源代码

  • 你现在也可以使用`file.CopyToAsync(ms)`。 (5认同)
  • 以下内容应该可以帮助您。`using (var stream = file.OpenReadStream()) { var buffer = new byte[20]; 流.Read(缓冲区, 0, 20); }` (2认同)

Roo*_*ian 30

你可以只写一个简单的扩展:

public static class FormFileExtensions
{
    public static async Task<byte[]> GetBytes(this IFormFile formFile)
    {
        using (var memoryStream = new MemoryStream())
        {
            await formFile.CopyToAsync(memoryStream);
            return memoryStream.ToArray();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

var bytes = await formFile.GetBytes();
var hexString = Convert.ToBase64String(bytes);
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用以下代码将其转换为字节数组:

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);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)