114

Here is my 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));
        }
    }
}

Now I am converting this file into byte array using this code:

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

And then I am uploading this code into my nosql database.This is all working fine but the problem is i don't want to save the file. Instead of that i want to directly upload the file into my database. And it can be possible if i can just convert the file into byte array directly without saving it.

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
}
3
  • Um... so what exactly is the problem? Commented Apr 5, 2016 at 16:30
  • file.OpenReadStream() look for the documentation of IFormFile.OpenReadStream Commented Apr 5, 2016 at 16:32
  • When you originally saved the file, what form was it in? However you had it in memory, it should have already been a byte array, or convertible to a byte array. We would need to see how you are obtaining the file in the first place, and how you are saving it. Commented Apr 5, 2016 at 16:33

4 Answers 4

244

As opposed to saving the data as a string (which allocates more memory than needed and might not work if the binary data has null bytes in it), I would recommend an approach more like

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

Also, for the benefit of others, the source code for IFormFile can be found on GitHub

Sign up to request clarification or add additional context in comments.

7 Comments

you could shorten the code by using the copy functions on IFormFile themselve. using (var stream = new MemoryStream()) { formFile.CopyTo(stream); return stream.ToArray(); }
@Bosken85 Good catch! I updated the example to reflect your recommendations.
You can also use file.CopyToAsync(ms) now.
Something to the effect of the following should help you out. using (var stream = file.OpenReadStream()) { var buffer = new byte[20]; stream.Read(buffer, 0, 20); }
@erdomke why do we need file.CopyTo(ms);?
|
63

You can just write a simple extension:

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

Usage

var bytes = await formFile.GetBytes();
var hexString = Convert.ToBase64String(bytes);

5 Comments

Miss await before formFile.GetBytes(); Or Am I Wrong?
Let's change method name to GetBytesAsync(), so this suffix will indicate this is async function
@MahmoodGaribov this won't happen as I don't see a point to add the suffix. See also: docs.particular.net/nservicebus/upgrades/5to6/…
The reason you missed the await is because you don't have the 'Async' suffix. So that already proves its point, next it's considered good practise to have this suffix.
The reason was that I did not use an IDE.
7

You can use the following code to convert it to a byte array:

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

1 Comment

Run a .jpg through this and see what you get. OP asks for byte array.
-1

You can retrieve your file by using the Request.Form already implemented (as image for instance) :

var bytes = new byte[Request.Form.Files.First().Length];
var hexString = Convert.ToBase64String(bytes);

Hope it help

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.