想做一个多文件上传功能,具体实现是这样的:
   
   1、点击“浏览”可添加文件到集合,添加一个就在后台动态添加一个TextBox跟FileUpload ,添加的文本用来保存路径。
   
   问题: 现在添加部分没问题了,也能或如Request.Files的集合,现在问题是集合里面的上传路径不存在,因为路径只
          保留在TextBox中,如何才能获取路径保存在FileUpload中实现上传? 希望大家一同参与讨论,谢谢了     
  前台代码:  我用的是Repeater绑定控件
    <asp:Panel ID="Panel1" runat="server" CssClass="pan">
           
               <asp:Repeater ID="ReptAddFile" runat="server" 
                   onitemcommand="ReptAddFile_ItemCommand">
                 <ItemTemplate>
                     <div id="divname<%#Eval("id") %>" style="width:85%; float:left;" onmouseover="changeColor(<%#Eval("id") %>);" onmouseout="cleanColor(<%#Eval("id") %>);" >
                         <asp:Label ID="lblFilePath" runat="server" CssClass="text" Text='<%#Eval("filepath") %>' ></asp:Label>
                     </div>
                     <div id="divfile<%#Eval("id") %>" style="width:10%; float:left; text-align:right;" onmouseover="changeColor(<%#Eval("id") %>);" onmouseout="cleanColor(<%#Eval("id") %>);" >
                         <asp:FileUpload ID="FileUploadName" CssClass="file"  runat="server" />
                         <asp:LinkButton ID="bntDelete" CommandName="delete" CssClass="button" runat="server">删除</asp:LinkButton>
                     </div>
                 </ItemTemplate>
               </asp:Repeater>
            
        </asp:Panel>
   
       后台代码:
    
       /// <summary>
    /// 绑定上传文件
    /// </summary>
    protected void FileUploadAdd()
    {
        DataTable table = new DataTable("files");
        DataColumn c1 = new DataColumn("filepath", typeof(String));
        DataColumn c2 = new DataColumn("id", typeof(Int32));
        table.Columns.Add(c2);
        table.Columns.Add(c1);
        for (int i = 1; i <= count; i++)
        {
            table.Rows.Add(table.NewRow());
            table.Rows[i - 1]["filepath"] = arr[i - 1].ToString();
            table.Rows[i - 1]["id"] = i.ToString();
        }
        ReptAddFile.DataSource = table;
        ReptAddFile.DataBind();
    }     注释:count是个静态变量,用来控制当前添加上传文件的数量
           arr 是ArrayList数组用来保存当前上传文件路径的集合
  

解决方案 »

  1.   

    js  只是添加 file控件。。添加一个后用户在去点击选择上传文件我用过一个Flash做的上传控件。。模式跟我这个才不多所以思维就往这上面靠。。理论上来说给file赋值出于安全性是绝对不行的。。所以才跟大家一起来讨论看有没有可行的办法
      

  2.   


    HttpFileCollection files = context.Request.Files;
    for (int iFile = 0; iFile < files.Count; iFile++)
    {
            FileUpload1.SaveAs("你的路径");
    }
      

  3.   

      C# 中 Request.Files  返回的就是HttpFileCollection对象,也就是文件的集合了。
      后台实现循环的代码:
      
      HttpFileCollection files=Request.Files();
      for(int i=0;i<files.Count;i++)
      {
          files[i].SaveAs(Server.MapPat("../upload/img/"+System.IO.Path.GetFileName(files[i].FileName);));
      }
      

  4.   


    FileUpload1 是上传控件吧客户端路径现在还只是存在动态生成的TextBox中,所以问题是怎么加载到上传文件集合中去不通过FileUpload上传方式,还有其它二进制的上传模式现在是只存在客户端文件路径,这路径在上传文件集合中当前是不存在的。
      

  5.   

    http://www.dyzsg.com/
      

  6.   

    for (int i = 0; i < ReptAddFile.Items.Count; i++)
                {
                    string pathName = ((Label)ReptAddFile.Items[i].FindControl("lblFilePath")).Text;
                    //  读文件:
                    FileStream str = new FileStream(pathName, FileMode.Open, FileAccess.Read, FileShare.None);
                    //写文件 
                    FileStream des = new FileStream(Server.MapPath("upload/" +Path.GetFileName(pathName)), FileMode.Create, FileAccess.Write, FileShare.None);
                    BinaryReader red = new BinaryReader(str);
                    BinaryWriter wer = new BinaryWriter(des);
                    try
                    {
                        while (true)
                        {
                            wer.Write(red.ReadByte());   //做读写操作
                        }
                    }
                    catch
                    {
                        
                        wer.Flush();
                        red.Close();
                        wer.Close();                }
                }   这种方法上传只能限定本地。
        
      

  7.   

    嗯,给file upload赋值出于安全性是绝对不行的
    你用过一个Flash做的上传控件,怎么不用了呢?
    用flash/silverlight/activex是可以做到的
      

  8.   

    SWFUPLOAD 很好用的。又方便
      

  9.   

      SWF 的Upload上传是不错,,不过有像有些浏览器访问就会报错的。。比如360浏览器进行上传的时候就会出现找不到服务器。
      

  10.   

     应该大家都用过FTP ,它那里的上传模式应该是用二进制流进行上传的。。
      

  11.   

    最简单的办法就是:
    动态生成FILEUPLOAD标记,然后就那么搞了.
      

  12.   

    一般做多文件都是动态生成个FileUplaod控件,生成后在去选择FileUplaod的文件后台在用Request。Files获取FileUpload的集合。这中流程是绝对可以做多文件上传的现在是点击“浏览”就选择文件,在选择文件后动态生成的FileUpload已经不能在点击选择文件了。。保留了FileUpload的stype="display:none" 属性。。每次添加文件都会动态生成三个控件 一个Label用来保存选择的路径。一个ListButton用来删除当前选择的文件,一个FileUpload用来做上传文件的集合所以后台也能获取FileUpload集合。现在的功能实现了本地IIS上传模式。。想在这个基础上改成Web上传模式
      

  13.   

     Byte[] FileByteArray = new Byte[FileLength];   //文件临时储存Byte数组
     Stream StreamObject = UpFile.InputStream;      //建立数据流对像文件数据,//FileByteArray为数据储存体,0为数据指针位置、FileLnegth为数据长度
    StreamObject.Read(FileByteArray, 0, FileLength);用个静态List<Byte>对象保存所有上传的临时Byte
    List<Byte>.Add(FileByTeArray);在选择文件的时候用这种方法先临时保存文件的字节,点击上传的时候在通过获取
    List<Byte>[0]字节进行写入操作。。
    不知道大家认为这种方法有肯能完成浏览器跟服务器的多文件上传模式吗?
      

  14.   

    因为安全原因,不能给type=file的input赋值,所以后台动态产生的FileUpload控件是不能用来实现自动上传的。
    多文件上传的话,要在客户端实现,原理是点击“浏览”选择一个文件后,用js动态产生一个type=file的input,盖在原来的“浏览”按钮上,把原来的藏掉,这样点几次就会有多个type=file的input,点“上传”按钮时一起传到服务器。
    很多基于js的多文件上传都是这个做法,看下面的jQuery Ajax file upload,dhtmlxVault,jQuery Multiple File Upload Plugin 和 Ext UploadForm
    http://www.open-open.com/ajax/Upload.htm
      

  15.   

    谢谢各位的支持这个功能我已经做出来了。。主要是用静态属性保存数据。。List<HttpPostedFiles> list=new List<HttpPostedFiles> 用这个保存FileUpload.PostedFile上传的时候获取 list的集合
      for (int i = 0; i < ReptAddFile.Items.Count; i++)
            {
                string pathName = ((Label)ReptAddFile.Items[i].FindControl("lblFilePath")).Text;
                pathName = Server.MapPath("upload/" +
                Path.GetFileName(pathName).Replace(Path.GetFileName(pathName).Substring(0, Path.GetFileName(pathName).LastIndexOf('.')), GetDateTimeString()));
                HttpPostedFile postFile = list[i];
                postFile.SaveAs(pathName);        }