How to attach file to email by copying files from HttpPostedFileBase to MemoryStream?

414 Views Asked by At

I am trying to attach files to email but when reaching method CopyTo in postFile.InputStream to MemoryStream i get this error.

StackTrace = " at System.IO.__Error.FileNotOpen()\r\n at System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)\r\n at System.IO.Stream.InternalCopyTo(Stream destination, Int32 bufferSize)\r\n at Test.Web.Extensions.EpiserverForms

                {
                    HttpPostedFileBase postedFile = this.HttpRequestContext.Files[i];
                    postedFile.InputStream.Position = 0;
                    postedFile.InputStream.Seek(0, SeekOrigin.Begin);

                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        postedFile.InputStream.CopyTo(memoryStream);
                        memoryStream.Position = 0;
                        memoryStream.Seek(0, SeekOrigin.Begin);

                        uploadedFiles.Add(
                            new UploadedFile()
                            {
                                Name = postedFile.FileName,
                                Type = MimeMapping.GetMimeMapping(postedFile.FileName),
                                InputStream = memoryStream
                            });
                    }
                }```
2

There are 2 best solutions below

1
Igor N. On

Try to make the class property UploadedFile.InputBytes - bytes, not a stream. Then you can redistribute the file as follows:

    using (var memoryStream = postedFile.InputStream as MemoryStream)
    {
        if (memoryStream == null)
            postedFile.InputStream.CopyTo(memoryStream);

        new UploadedFile()
        {
            Name = postedFile.FileName,
            Type = MimeMapping.GetMimeMapping(postedFile.FileName),
            InputBytes = memoryStream?.ToArray()
        };
    }
0
Gonzalo On

Fixed it by removing

postedFile.InputStream.Position = 0;
postedFile.InputStream.Seek(0, SeekOrigin.Begin);