12

I'm trying to use the AsyncFileUpload control from the Asp.net Ajax Control Toolkit (Sept 30, 2009 stable build: 30930) . I've created a demo application and the control works fine. Files upload and all is well.

When I try to use the control in my real application, I'm always receiving an error stating "The file attached is invalid". The AsyncFileUpload control returns this when the file uploaded is null.

To isolate the problem, I created a new master page exactly like the master page in my demo app. I also created an aspx page exactly like the page in my demo app. The upload still fails with a "The file attached is invalid" error.

I also compared the web.config for the real app and the demo app and couldn't identify any differences that should matter.

The code below is the test code in my real app. This code is exactly the same as the functioning code in the demo app with the exception of having different class names and file names. The web.config listed below is from the real app with the appsettings and connectionstrings removed.

At this point, I am completely stumped.

Real App Test Master Page:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="aaaMasterPage.master.cs" Inherits="L1Admin.aaaMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>    
    <asp:ContentPlaceHolder id="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="scriptManager" EnablePartialRendering="true" runat="server" AsyncPostBackTimeout="180" />    
    <div>
        <asp:ContentPlaceHolder id="content" runat="server">

        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

Test Page:

<%@ Page Language="C#" MasterPageFile="~/aaaMasterPage.master" AutoEventWireup="true" CodeFile="aaaFileUploadTest2.aspx.cs" Inherits="aaaFileUploadTest2" Title="Untitled Page" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
        <script type="text/javascript">
            function pageLoad(sender, args) {
            }

            function startUpload(sender,args)
            {
                $('#uploadMessage p').html();
                $('#uploadMessage').hide();
            }

            function uploadComplete(sender,args)
            {
                showUploadMessage(args.get_fileName() + " uploaded succesfully - " +  + args.get_length() + " bytes", '');
            }

            function uploadError(sender, args)
            {
                showUploadMessage("An error occurred during uploading. " + args.get_errorMessage(), '#ff0000');
            }

            function showUploadMessage(text, color)
            {
                $('#uploadMessage p').html(text).css('color', color);
                $('#uploadMessage').show();
            }
        </script>
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="content" Runat="Server">    
        <div id="uploadMessage"><p></p></div>
        <ajax:AsyncFileUpload ID="pageBannerUpload"
            CssClass="file_upload"
            OnClientUploadError="uploadError"
            OnClientUploadStarted="startUpload"
            OnClientUploadComplete="uploadComplete"
            onuploadedcomplete="upload_UploadedComplete"
            runat="server" />
    </asp:Content>

Real App Test Page Code Behind:

using System;
using System.IO;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class aaaFileUploadTest2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void upload_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        if (pageBannerUpload.HasFile)
        {
            string path = MapPath("~/") + Path.GetFileName(e.filename);
            pageBannerUpload.SaveAs(path);
        }
    }
}

Real App Test Web.config:

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
    <configSections>
        <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
            <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                    <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
                    <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                    <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                    <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                </sectionGroup>
            </sectionGroup>
        </sectionGroup>
    </configSections>
    <appSettings>

    </appSettings>
  <connectionStrings>
  </connectionStrings>
    <system.web>
        <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        -->
        <compilation debug="true">
            <assemblies>
                <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
            </assemblies>
            <codeSubDirectories>
                <add directoryName="CSCode"/>
                <add directoryName="VBCode"/>
            </codeSubDirectories>
        </compilation>
        <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
        <authentication mode="Windows"/>
        <!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
        <pages>
            <controls>
                <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                <add tagPrefix="Annsa" namespace="Annsa.Controls" assembly="Annsa.Controls"/>
            </controls>
            <namespaces>
                <add namespace="Microsoft.VisualBasic"/>
                <add namespace="System.Data"/>
                <add namespace="System.Drawing"/>
            </namespaces>
        </pages>
        <httpHandlers>
            <remove verb="*" path="*.asmx"/>
            <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </httpHandlers>
        <httpModules>
            <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </httpModules>
        <identity impersonate="true"/>
        <trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/>
        <!--  SESSION STATE SETTINGS
            mode="Off|InProc|StateServer|SqlServer"
          By default ASP.NET uses cookies to identify which requests belong to a particular session. 
          If cookies are not available, a session can be tracked by adding a session identifier to the URL. 
          To disable cookies, set sessionState cookieless="true".
        -->
        <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20"/>
        <!--  GLOBALIZATION
          This section sets the globalization settings of the application. 
        -->
        <xhtmlConformance mode="Legacy"/>
    </system.web>
  <location path="Pages">
    <system.web>
      <xhtmlConformance mode="Transitional"></xhtmlConformance>
    </system.web>
  </location>
    <system.codedom>
        <compilers>
            <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
                <providerOption name="CompilerVersion" value="v3.5"/>
                <providerOption name="WarnAsError" value="false"/>
            </compiler>
            <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
                <providerOption name="CompilerVersion" value="v3.5"/>
                <providerOption name="OptionInfer" value="true"/>
                <providerOption name="WarnAsError" value="false"/>
            </compiler>
        </compilers>
    </system.codedom>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false"/>
        <modules>
            <remove name="ScriptModule"/>
            <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </modules>
        <handlers>
            <remove name="WebServiceHandlerFactory-Integrated"/>
            <remove name="ScriptHandlerFactory"/>
            <remove name="ScriptHandlerFactoryAppServices"/>
            <remove name="ScriptResource"/>
            <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </handlers>
    </system.webServer>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Edit: I'm no longer working for this company, so I can't test any new answers to see if they fix the problem.

Craig M
  • 5,598
  • 4
  • 32
  • 43
  • Ran the sample with a default web.config, jquery 1.4.1, and AjaxControlToolkit 3.5.50731; switched master page to a ToolkitScriptManager and it worked fine. I hit the error after switching to your web.config (also created App_Code\CS|VBCode folders). – user423430 Sep 06 '11 at 19:48
  • in function startUpload(sender,args) { $('#uploadMessage p').html(); $('#uploadMessage').hide(); } $('#uploadMessage p').html(); doesn't do anything. It would return the html to a variable or something, but when used in this fashion its not doing anything I believe. Do you want to delete the existing html? $('#uploadMessage p').html('') or $('#uploadMessage p').empty(); I doubt this is the problem, but nonetheless the jQuery isn't used correctly. – Hcabnettek Sep 14 '11 at 20:05
  • this is it, the real solution: http://forums.asp.net/p/1547959/3788044.aspx –  Jul 01 '10 at 06:55

4 Answers4

20

I was having the same problem in .NET 4. I got it working with by setting the ClientIDMode="AutoID" on the control.

craigmoliver
  • 6,499
  • 12
  • 49
  • 90
  • The problem in this specific .NET 3.5 example is changing control name delimiters from '_' to ':'. The AsyncFileUpload control does a pretty bone-headed job of checking to make sure it is supposed to process the file upload. http://ajaxcontroltoolkit.codeplex.com/workitem/26975 – user423430 Sep 06 '11 at 20:57
1

the solution of user423430 is the right one if you have migrated your webproject: When you automatically migrate a VS 2003 Web Project to VS 2005 the Web.config is automatically modified. <xhtmlConformance mode="Legacy" /> is added in it. It is recommanded to not use it with ajax :

http://weblogs.asp.net/scottgu/archive/2006/12/10/gotcha-don-t-use-xhtmlconformance-mode-legacy-with-asp-net-ajax.aspx

(ASP.NET 1.0 and 1.1 didn't emit XHTML compliant markup from many of its server controls. ASP.NET 2.0 changed this and by default emits XHTML compliant markup from all controls.)

ToXinE
  • 308
  • 2
  • 13
0

Is it possible you're exceeding the upload limit? What is the size of the file you're uploading?

You can set the size in your web.config:

<system.web>
   <httpRuntime executionTimeout="110" maxRequestLength="20000" />
</system.web>
Pbirkoff
  • 4,642
  • 2
  • 20
  • 18
  • 22kb. Same file that works ok in the demo application. Edit: It isn't specified in the demo app either, so I'd assume they're both using the default. – Craig M Feb 22 '10 at 21:55
  • 1
    sometimes the demo-environment is different than the production-environment. Have you checked the permissons on the directory where the file is being saved? – Pbirkoff Feb 23 '10 at 11:11
  • Both of these applications were running on my development machine. – Craig M Nov 14 '10 at 20:05
0

When you use "AsyncFileUpload" within a Gridiview, use ClientIDMode="AutoID"

Ayya 2K
  • 13
  • 2