16

Whats the best way to check the size of a file during upload using asp.net and C#? I can upload large files by altering my web.config without any problems. My issues arises when a file is uploaded which is more than my allowed max file size.

I have looked into using activex objects but that is not cross browser compatible and not the best answer to the solution. I need it to be cross browser compatible if possible and to support IE6 (i know what you are thinking!! However 80% of my apps users are IE6 and this is not going to change anytime soon unfortunately).

Has any dev out there come across the same problem? And if so how did you solve it?

Behzad Hassani
  • 2,129
  • 4
  • 30
  • 51
Cragly
  • 3,554
  • 9
  • 45
  • 59

6 Answers6

22

If you are using System.Web.UI.WebControls.FileUpload control:

MyFileUploadControl.PostedFile.ContentLength;

Returns the size of the posted file, in bytes.

Andreas Grech
  • 105,982
  • 98
  • 297
  • 360
  • 1
    During a Postback...the file is saved only when you call MyFileUploadControl.PostedFile.SaveAs("file.txt"); – Andreas Grech Jul 05 '09 at 21:04
  • 4
    Except the postback is only triggered once the upload has finished. So it's actually *after* not during. – blowdart Jul 05 '09 at 21:32
  • You cannot check the size of the file before the file is posted to the server because client-side technologies (javascript) cannot access local files because of security measures. – Andreas Grech Jul 05 '09 at 21:35
  • 1
    You can do so now, without accessing the local files. See [This Answer](http://stackoverflow.com/questions/1601455/how-to-check-file-input-size-with-jquery/3937404#3937404) – disappointed in SO leadership Aug 21 '14 at 09:12
9

This is what I do when uploading a file, it might help you? I do a check on filesize among other things.

//did the user upload any file?
            if (FileUpload1.HasFile)
            {
                //Get the name of the file
                string fileName = FileUpload1.FileName;

            //Does the file already exist?
            if (File.Exists(Server.MapPath(ConfigurationManager.AppSettings["fileUploadPath"].ToString() + fileName)))
            {
                PanelError.Visible = true;
                lblError.Text = "A file with the name <b>" + fileName + "</b> already exists on the server.";
                return;
            }

            //Is the file too big to upload?
            int fileSize = FileUpload1.PostedFile.ContentLength;
            if (fileSize > (maxFileSize * 1024))
            {
                PanelError.Visible = true;
                lblError.Text = "Filesize of image is too large. Maximum file size permitted is " + maxFileSize + "KB";
                return;
            }

            //check that the file is of the permitted file type
            string fileExtension = Path.GetExtension(fileName);

            fileExtension = fileExtension.ToLower();

            string[] acceptedFileTypes = new string[7];
            acceptedFileTypes[0] = ".pdf";
            acceptedFileTypes[1] = ".doc";
            acceptedFileTypes[2] = ".docx";
            acceptedFileTypes[3] = ".jpg";
            acceptedFileTypes[4] = ".jpeg";
            acceptedFileTypes[5] = ".gif";
            acceptedFileTypes[6] = ".png";

            bool acceptFile = false;

            //should we accept the file?
            for (int i = 0; i <= 6; i++)
            {
                if (fileExtension == acceptedFileTypes[i])
                {
                    //accept the file, yay!
                    acceptFile = true;
                }
            }

            if (!acceptFile)
            {
                PanelError.Visible = true;
                lblError.Text = "The file you are trying to upload is not a permitted file type!";
                return;
            }

            //upload the file onto the server
            FileUpload1.SaveAs(Server.MapPath(ConfigurationManager.AppSettings["fileUploadPath"].ToString() + fileName));
        }`
macou
  • 777
  • 8
  • 21
  • of course this server side Mark Graham. The original question asked "Whats the best way to check the size of a file during upload using asp.net and C#?" – macou May 03 '10 at 04:39
  • `var acceptedFileTypes = new string[] { ".pdf",".doc" ... }` `for(var i = 0; i < acceptedFileTypes .Length; i++)` – GooliveR Aug 18 '17 at 11:53
7

You can do the checking in asp.net by doing these steps:

protected void UploadButton_Click(object sender, EventArgs e)
{
    // Specify the path on the server to
    // save the uploaded file to.
    string savePath = @"c:\temp\uploads\";

    // Before attempting to save the file, verify
    // that the FileUpload control contains a file.
    if (FileUpload1.HasFile)
    {                
        // Get the size in bytes of the file to upload.
        int fileSize = FileUpload1.PostedFile.ContentLength;

        // Allow only files less than 2,100,000 bytes (approximately 2 MB) to be uploaded.
        if (fileSize < 2100000)
        {

            // Append the name of the uploaded file to the path.
            savePath += Server.HtmlEncode(FileUpload1.FileName);

            // Call the SaveAs method to save the 
            // uploaded file to the specified path.
            // This example does not perform all
            // the necessary error checking.               
            // If a file with the same name
            // already exists in the specified path,  
            // the uploaded file overwrites it.
            FileUpload1.SaveAs(savePath);

            // Notify the user that the file was uploaded successfully.
            UploadStatusLabel.Text = "Your file was uploaded successfully.";
        }
        else
        {
            // Notify the user why their file was not uploaded.
            UploadStatusLabel.Text = "Your file was not uploaded because " + 
                                     "it exceeds the 2 MB size limit.";
        }
    }   
    else
    {
        // Notify the user that a file was not uploaded.
        UploadStatusLabel.Text = "You did not specify a file to upload.";
    }
}
Alex
  • 5,971
  • 11
  • 42
  • 80
5

Add these Lines in Web.Config file.
Normal file upload size is 4MB. Here Under system.web maxRequestLength mentioned in KB and in system.webServer maxAllowedContentLength as in Bytes.

    <system.web>
      .
      .
      .
      <httpRuntime executionTimeout="3600" maxRequestLength="102400" useFullyQualifiedRedirectUrl="false" delayNotificationTimeout="60"/>
    </system.web>


    <system.webServer>
      .
      .
      .
      <security>
          <requestFiltering>
            <requestLimits maxAllowedContentLength="1024000000" />
            <fileExtensions allowUnlisted="true"></fileExtensions>
          </requestFiltering>
        </security>
    </system.webServer>

and if you want to know the maxFile upload size mentioned in web.config use the given line in .cs page

    System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
    HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection;

     //get Max upload size in MB                 
     double maxFileSize = Math.Round(section.MaxRequestLength / 1024.0, 1);

     //get File size in MB
     double fileSize = (FU_ReplyMail.PostedFile.ContentLength / 1024) / 1024.0;

     if (fileSize > 25.0)
     {
          ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "Alert", "alert('File Size Exceeded than 25 MB.');", true);
          return;
     }
Prasad Jadhav
  • 5,090
  • 16
  • 62
  • 80
Rajasekaran
  • 51
  • 1
  • 1
2

You can do it on Safari and FF simply by

<input name='file' type='file'>    

alert(file_field.files[0].fileSize)
developer
  • 104
  • 1
  • 2
  • 11
0

We are currently using NeatUpload to upload the files.

While this does the size check post upload and so may not meet your requirements, and while it has the option to use SWFUPLOAD to upload the files and check size etc, it is possible to set the options such that it doesn't use this component.

Due to the way they post back to a postback handler it is also possible to show a progress bar of the upload. You can also reject the upload early in the handler if the size of the file, using the content size property, exceeds the size you require.

David McEwing
  • 3,320
  • 18
  • 16