简体   繁体   中英

I need help to find a way to calculate the file size of uploaded file - HttpContext.Current.Request.Files

I need to calculate the file size of uploaded file in order to catch System.Web.HttpException: Maximum request length exceeded. This is my code

    <table border="0" cellpadding="2" cellspacing="2" width="90%" style="margin-top:20px; margin-bottom:40px; padding:30px;">
        <tr>
            <td align="right" style="width:140px">
                <asp:Label ID="lblTicketName" runat="server" Text="Ticket Name:" Font-Bold="true" />
            </td>
            <td colspan="2">
                <asp:TextBox ID="tbTicketName" runat="server" Width="315" />
            </td>
        </tr>
        <tr>
            <td align="center" colspan="3">
                <asp:Label ID="lblTicketDescription" runat="server" Text="Ticket description" Font-Bold="true" />
            </td>
        </tr>
        <tr>
            <td align="center" colspan="3">
                <asp:TextBox ID="tbTicketDescription" runat="server" Height="100" Width="450" />
            </td>
        </tr>
        <tr>
            <td align="right">
                <asp:Label ID="lblAttachFiles" runat="server" Text="Attach files:" Font-Bold="true" />
            </td>
            <td>
                <p id="upload-area">
                    <asp:FileUpload ID="fuAttachFiles" runat="server" />
                </p>
            </td>
            <td>
                <input id="btnAddMoreFiles" type="button" value="Add another file" onclick="addFileUploadBox()" />
            </td>
        </tr>
        <tr>
            <td align="right">
                <asp:Label ID="lblType" runat="server" Text="Ticket type:" Font-Bold="true" />
            </td>
            <td>
                <asp:DropDownList ID="ddlType" runat="server" >
                    <asp:ListItem Text="Bug report" Value="BugReport" />
                    <asp:ListItem Text="Feature request" Value="FeatureRequest" />
                    <asp:ListItem Text="Assistance request" Value="AssistanceRequest" />
                    <asp:ListItem Text="Other" Value="Other" />
                </asp:DropDownList>
            </td>
            <td>
                <asp:Button ID="btnCreateNewTicket" runat="server" Text="Create new ticket" 
                    onclick="btnCreateNewTicket_Click" />
            </td>
        </tr>
    </table> 
    <script type="text/javascript">
        function addFileUploadBox() {
            if (!document.getElementById || !document.createElement)
                return false;

            var uploadArea = document.getElementById("upload-area");

            if (!uploadArea)
                return;

            var newLine = document.createElement("br");
            uploadArea.appendChild(newLine);

            var newUploadBox = document.createElement("input");

            // Set up the new input for file uploads
            newUploadBox.type = "file";

            // The new box needs a name and an ID
            if (!addFileUploadBox.lastAssignedId)
                addFileUploadBox.lastAssignedId = 100;

            newUploadBox.setAttribute("id", "dynamic" + addFileUploadBox.lastAssignedId);
            newUploadBox.setAttribute("name", "dynamic:" + addFileUploadBox.lastAssignedId);
            uploadArea.appendChild(newUploadBox);
            addFileUploadBox.lastAssignedId++;
        }
    </script>

The Click Event handler:

    protected void btnCreateNewTicket_Click(object sender, EventArgs e)
    {
        var uploads = HttpContext.Current.Request.Files;

        var filesExist = false;
        if (uploads[1].ContentLength != 0)
            filesExist = true;

        var ticketId = Ticket.Tickets.CreateTicket(int.Parse(ProjectId), TsSession.Current.Username, tbTicketName.Text, ddlType.SelectedValue, tbTicketDescription.Text, filesExist);

        if (filesExist)
        {
            var uploadPath = "G:\\VS\\Ticketing System2\\UploadedFiles\\" + ProjectId + "\\" + ticketId + "\\TicketFiles\\";

            if (!Directory.Exists(uploadPath))
                Directory.CreateDirectory(uploadPath);

            for (var i = 0; i < uploads.Count; i++)
            {
                var fileName = Path.GetFileName(uploads[i].FileName);

                uploads[i].SaveAs(uploadPath + fileName);
            }
        }
    }

I changed the file size in web.config.

<system.web>
<httpRuntime maxRequestLength="10240" />

The following will get you the file sizes, but the problem you'll have is that the "Maximum request length exceeded" error will be thrown before you get a chance to do anything with it:

HttpFileCollection Files;
int fileLength;

Files = Request.Files; // Load File collection into HttpFileCollection variable.
arr1 = Files.AllKeys;  // This will get names of all files into a string array.
for (int i = 0; i < arr1.Length; i++) 
{
    fileLength += Files[i].ContentLength;
}

So what you'll actually have to do is catch the exception in either an Application error handler, or on a custom 500 internal server error page, and display a meaningful message to the user.

JavaScript won't really help you either, as security concerns mean that you can no longer interact with the selected files on the client side.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM