DEV Community

Rasma Raj
Rasma Raj

Posted on • Edited on

HttpPostedFileBase

My requirement was to send the file through the mail and save the file in binary format.

Issue faced
File content length became 0 after converted to the byte array.

Solution

1) Created a class with properties

public class Model_File
    {
        public string FileName { get;private set; }
        public string ContentType { get; private set; }
        public byte[] Contents { get; private set; }
        public Model_File(string FileName, string ContentType, byte[] Contents)
        {
            this.FileName = FileName;
            this.ContentType = ContentType;
            this.Contents = Contents;
        }
    }
Enter fullscreen mode Exit fullscreen mode

2) Read all the file using binary reader and store in a List of class

public static List<Model_File> Get_File(HttpPostedFileBase[] postedfiles)
{

var Result =new List<Model.Model_File>();
if (postedfiles.Length != 0)
            {
                foreach (var item in postedfiles)
                {
                    if (item.ContentLength != 0)
                    {
                        var R = Try_Byte(item, "Attachment");                       
                        if (R != null)
                        {
                            Result .Add(R);                            
                        }
                    }

                }
            }
return Result;
}

private static Model_File Try_Byte(HttpPostedFileBase F,string CType)
        {
            Model.Model_File Result = null;
            if (F != null && F.ContentLength!=0)
            {
                using (BinaryReader dr = new BinaryReader(F.InputStream))
                {
                    byte[] content = dr.ReadBytes(F.ContentLength);
                    return new Model_File(F.FileName, CType, content);
                }
            }
            return Result;
        }

Enter fullscreen mode Exit fullscreen mode

3) To Send these files in mail - Create the attachment and add to the mail message

public static void Send(List<Model_File> _Files)
{
MailMessage msg = new MailMessage()

if(_Files.count!=0)
{
_Files.foreach(delegate(Model_File F){

var _Attachment=Get(F)
if(_Attachment!=mull){
msg.Attachments.Add(_Attachment);
}

});
}
}
Enter fullscreen mode Exit fullscreen mode
private static Attachment Get(Model_File F)
        {
            if (F != null && F.Contents!=null && F.Contents.Length!=0 && !string.IsNullOrWhiteSpace(F.ContentType))
            {
               return new Attachment(new MemoryStream(F.Contents), F.FName);
            }
            return null;
        }

Enter fullscreen mode Exit fullscreen mode

4) Get the result- List of Model_Files objects and inserted to the database in varbinary format.For that I created the column in table with an attribute varbinary(max).

*Issue *
Cant covert to varbinary to varchar - this error got when added like a normal parameter.

Solution
Then i declared the parameter as below.

Command.Parameters.Add("@Attachment", System.Data.SqlDbType.VarBinary, -1).Value = (A.Contents == null ? (object)DBNull.Value : (object)A.Contents );

Top comments (4)

Collapse
 
pauljlucas profile image
Paul J. Lucas

Why is your post tagged #c? This isn't C code.

Collapse
 
rasmaraj profile image
Rasma Raj

NO, This is C# Code which i used in one of my MVC project.

Collapse
 
pauljlucas profile image
Paul J. Lucas

Then it should be tagged #csharp. #c is for the C programming language..

Thread Thread
 
rasmaraj profile image
Rasma Raj

Done.