none
使用fileupload控件,页面刷新时怎么能保持它的选则的文件的状态?? RRS feed

  • 问题

  • 我使用fileupload控件做上传,可以多个上传,也就是有个按钮点一下生成一个fileupload,
    比如现在又两个fileupload了,这时你对这个两个fileupload分别选取了文件,
    这时假如你又添加了一个fileupload,上面的两个fileupload的文件都没有了,
    我怎么做才可以保持那两个不变呀!!

    谢谢!!
    • 已移动 孟宪会Moderator 2009年6月8日 0:50 ([Loc]From:.NET Framework 一般性问题讨论区)
    2009年6月7日 14:12

答案

  • 你好,
    你参考下面的例子试试,注意设置相应的文件件读写权限。

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    
        protected void Button2_Click(object sender, EventArgs e)
        {
            HttpFileCollection hfc=Request.Files;
            if (hfc.Count != 0)
            {
                //You must be sure that you have enough rights to access the path
                string path = Request.PhysicalApplicationPath + @"Files\\"; 
                for (int i = 0; i < hfc.Count;i++ )
                {
                    if (!string.IsNullOrEmpty(hfc[i].FileName))
                    {
                        string fileName = hfc[i].FileName;
                        hfc[i].SaveAs(path + fileName.Substring(fileName.LastIndexOf('\\') + 1));
                        Response.Write(hfc[i].FileName);
                    }
                }
            }
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Untitled Page</title>
        <script type="text/javascript" language="javascript">
        
        var i=0;
            function addAttachment()
            {
            i++;
               var atts=document.getElementById("attachments");
               //create child div
               
               var divChild=document.createElement("div");
               divChild.id="div"+i.toString();
                atts.appendChild(divChild);
                
               var newAtt=document.createElement("input");          
               newAtt.id="file"+i.toString();
               newAtt.name="file"+i.toString();
               newAtt.type="file";           
               divChild.appendChild(newAtt);
               
               //Create a tag
               var aElement=document.createElement("a");
               aElement.id="afile"+i.toString();
               var aText=document.createTextNode("Delete the attachment");   
               aElement.appendChild(aText);           
               aElement.setAttribute("href","#");
              
               if(navigator.appName=="Microsoft Internet Explorer")
               {
                aElement.attachEvent("onclick",removeFun(divChild.id));
               } 
               else
               {               
                   var  eventHander=function(){removeAttachment.call(divChild.id);}                
                    
                    aElement.addEventListener("click",removeFun(divChild.id),false);
               }   
                     
               
               divChild.appendChild(aElement);
               
            }
            var removeFun=function(childDivId)
            {
              return function(){removeAttachment(childDivId);}
            }
            function removeAttachment(childDivId)
            {
                var atts=document.getElementById("attachments");
                var child1=document.getElementById(childDivId.toString());
             
                atts.removeChild(child1);
               
            }
            
          
            
        
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <input id="Button1" type="button" value="Add Attachment" onclick="addAttachment()" />
           
        <div id="attachments"></div> 
            <asp:Button ID="Button2" runat="server" Text="Button" />
            <input id="File1" type="file" runat="server" style="display:none;"/>   
        </form>
    </body>
    </html>
    

     


    Microsoft Online Community Support
    • 已标记为答案 痴迷.Net 2009年6月10日 2:02
    2009年6月9日 1:49

全部回复

  • 你好,你可以使用AJAX就可以简单实现,保持页面不刷新。

    谢谢!
    邹俊才
    2009年6月7日 15:10
    版主
  • 你好,你可以使用AJAX就可以简单实现,保持页面不刷新。

    谢谢!
    邹俊才

    您好
    您是说把fileupload放在updatepanle中么??
    我试了,不行呀?
    能说详细点么??
    谢谢!!
    2009年6月7日 15:27
  • 你好,请参考

    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
      <contenttemplate>
    <asp:FileUpload id="FIFile" runat="server"  Width="500px" Height="20px">
      </asp:FileUpload>
      <asp:ImageButton runat="server" ID="ImgbtnPreview"  OnClick="ImgbtnPreview_Click" />
    </contenttemplate>
    <triggers>
          <asp:PostBackTrigger ControlID="ImgbtnPreview"> </asp:PostBackTrigger>
    </triggers>
    </asp:UpdatePanel>

    谢谢!
    邹俊才
    2009年6月7日 15:38
    版主
  • 用AJAX或JS脚本都可以,这种应用我个人比较喜欢JS,不需要回发到服务器,直接本地解决,如果是总数是固定数量可以考虑用隐藏的办法,每个UPload放在一个表格行里,行的ID用一个顺序数字,然后根据选择的上传数量循环各行,低于或等于选择数量的显示,其余隐藏,简单方便,当然用AJAX也可以实现
    2009年6月7日 16:01
  • 你好,
    你参考下面的例子试试,注意设置相应的文件件读写权限。

    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    
        protected void Button2_Click(object sender, EventArgs e)
        {
            HttpFileCollection hfc=Request.Files;
            if (hfc.Count != 0)
            {
                //You must be sure that you have enough rights to access the path
                string path = Request.PhysicalApplicationPath + @"Files\\"; 
                for (int i = 0; i < hfc.Count;i++ )
                {
                    if (!string.IsNullOrEmpty(hfc[i].FileName))
                    {
                        string fileName = hfc[i].FileName;
                        hfc[i].SaveAs(path + fileName.Substring(fileName.LastIndexOf('\\') + 1));
                        Response.Write(hfc[i].FileName);
                    }
                }
            }
        }
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Untitled Page</title>
        <script type="text/javascript" language="javascript">
        
        var i=0;
            function addAttachment()
            {
            i++;
               var atts=document.getElementById("attachments");
               //create child div
               
               var divChild=document.createElement("div");
               divChild.id="div"+i.toString();
                atts.appendChild(divChild);
                
               var newAtt=document.createElement("input");          
               newAtt.id="file"+i.toString();
               newAtt.name="file"+i.toString();
               newAtt.type="file";           
               divChild.appendChild(newAtt);
               
               //Create a tag
               var aElement=document.createElement("a");
               aElement.id="afile"+i.toString();
               var aText=document.createTextNode("Delete the attachment");   
               aElement.appendChild(aText);           
               aElement.setAttribute("href","#");
              
               if(navigator.appName=="Microsoft Internet Explorer")
               {
                aElement.attachEvent("onclick",removeFun(divChild.id));
               } 
               else
               {               
                   var  eventHander=function(){removeAttachment.call(divChild.id);}                
                    
                    aElement.addEventListener("click",removeFun(divChild.id),false);
               }   
                     
               
               divChild.appendChild(aElement);
               
            }
            var removeFun=function(childDivId)
            {
              return function(){removeAttachment(childDivId);}
            }
            function removeAttachment(childDivId)
            {
                var atts=document.getElementById("attachments");
                var child1=document.getElementById(childDivId.toString());
             
                atts.removeChild(child1);
               
            }
            
          
            
        
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <input id="Button1" type="button" value="Add Attachment" onclick="addAttachment()" />
           
        <div id="attachments"></div> 
            <asp:Button ID="Button2" runat="server" Text="Button" />
            <input id="File1" type="file" runat="server" style="display:none;"/>   
        </form>
    </body>
    </html>
    

     


    Microsoft Online Community Support
    • 已标记为答案 痴迷.Net 2009年6月10日 2:02
    2009年6月9日 1:49
  • 恩,好的,谢谢KeFang Chen!!
    我试一下!!

    2009年6月9日 11:38
  • 首先谢谢KeFang Chen的解答,方法是可行的,谢谢诶!
    然后我看了看代码有几处不明白,希望大家给与解答!!
    1、就是这一行代码

       
               var newAtt=document.createElement("input");          
               newAtt.id="file"+i.toString();
               newAtt.name="file"+i.toString();
               newAtt.type="file";           
               divChild.appendChild(newAtt);
    
    中的 newAtt.name="file"+i.toString();
    我做的时候没有写这行,可是这样就找不到添加的fileupload控件,这是为什么呢??不是已经以有type属性了么??

    2、我想做一个按钮来删除已经添加的,不要的,就是
     var aElement=document.createElement("a");
               aElement.id="afile"+i.toString();
               var aText=document.createTextNode("Delete the attachment");  
               aElement.appendChild(aText);          
               aElement.setAttribute("href","#");
    的效果,我没有添加事件时可以添加上按钮(button,不是一个连接),当我添加aElement.attachEvent("onclick",removeFun(divChild.id));后
    就不行了,按钮就没有了,不知道为什么??

    3、最后一个也很郁闷,就是为什么非得在一开始放一个隐藏的fileupload控件,我把它去了后就找不到后来添加的fileupload的了,
    难道非得给它加一个隐藏的么??


    希望大家帮我解答一下,哪怕解答一个也好~~~


    谢谢各位了!!!
    2009年6月9日 13:34
  • 你好,
    对于第一个问题:添加的这个客户端的file控件必须要有name和id属性。id属性用来在客户端查找该element,name属于被用作键的名字回传到服务器端。如果没有这个name, HttpFileCollection hfc=Request.Files 集合中就没有客户端添加的这个file了。任何添加的客户端元素或修改的客户端元素如果没有这个name,服务器端用Request都拿不到的。

    第二个问题:用a和用button都是一样的做法。你只是创建element的时候变成button了,相应的属性改变下即可。

    第三个问题:这个做法是我参考了一些可以上传多个附件的邮箱,如gmail等。最关键的也就是这一步了。
    对于.NET,我猜测可能是因为安全机制的问题,如果在后台没有一个file控件,那么Request.Files就为null。


    Microsoft Online Community Support
    2009年6月10日 1:39
  • 谢谢KeFang Chen的无私奉献!帮了我大忙,谢谢!!
    看来需要学的还很多呢!!

    2009年6月10日 2:01
  • 我使用fileupload控件做上传,可以多个上传,也就是有个按钮点一下生成一个fileupload,
    比如现在又两个fileupload了,这时你对这个两个fileupload分别选取了文件,
    这时假如你又添加了一个fileupload,上面的两个fileupload的文件都没有了,
    我怎么做才可以保持那两个不变呀!!

    谢谢!!

    你动态添加FILE就行了。添加FILEUPLOAD多余!
    2009年7月16日 15:37