问题出在
//---创建一个file input对象并返回
function newFileInput(_name){
var oFileInput  = document.createElement("INPUT");
oFileInput.type = "file";
oFileInput.setAttribute("id",_name);
oFileInput.setAttribute("name",_name);
return oFileInput;
}
中的
oFileInput.setAttribute("id",_name);
oFileInput.setAttribute("name",_name);
这两句中,去掉就可以了,但不知道是为什么?

解决方案 »

  1.   

    又创建了新的form吧,添加几个file 就按几下submit奇怪
      

  2.   

    to 楼上,没有创建新的form!
    我又发现,是我的程序有点问题,在一个函数里直接创建file input并选择文件是可以提交的,分开几个函数就不行了。
    正在研究中......
      

  3.   

    发现:
    1 原来已经存在的file input,调用click方法让用户选择文件可以提交
    2 动态创建的file input,用户自己点击file input的浏览按钮选择文件可以提交
    3 动态创建的file input,调用click方法让用户选择文件不能提交,出现拒绝访问现象我现在就是第3种情况,谁可以解释一下?
      

  4.   

    搞定,使用outerHTML
    //---创建一个file input对象并返回
    function newFileInput(_name){
    var oFileInput  = document.createElement("INPUT");
    oFileInput.type = "file";
    oFileInput.outerHTML = '<INPUT type="file" id="' + _name + ' name="' + _name + '>';
    return oFileInput;
    }
    但原因未明,谁解释出来这分就全部给他了!
      

  5.   

    可能跟安全机制有关,不能让用户通过程序动态设置file框的name,id,src等属性,防止恶意代码。
    如果通过outerHTML来写id,name,等属性,值是取不到的,这个结论可以通过在
    addFile(oFileInput)函数的最后加上一句
    alert(document.forms[0].upfile_1.name)得到是空引用的错误来证明。
      

  6.   

    因为你的操作有点不安全啊根本原因是由于<input type="file">的value是只读的,也就是说,只能在IE用户用手来设置,你好象是用程序设置的吧?试试用innerHTML什么的直接生成<input>看。
      

  7.   

    直接生成也不好用,你那样做不行啊,只有点添加的时候加进去一个,然后点<input type="file">后面的浏览,这样才行得通。
      

  8.   

    <HTML>
    <HEAD>
    <SCRIPT language="javascript">
    function add()
    {
    tes.innerHTML += "<input type='file'><br>";
    }
    </SCRIPT>
    </HEAD>
    <BODY>
    <FORM action="b.asp" method="post" enctype="multipart/form-data" onsubmit="alert()">
    <input type="button" onclick="add();">
    <INPUT type="submit" value="&Igrave;á&frac12;&raquo;">
    <div id="tes"></div>
    </FORM>
    </BODY>
    </HTML>
      

  9.   

    看走眼了,呵呵,其实你的代码没有问题的不过我发现了一个有趣的现象。(IE6)其实你最开始的代码是可以提交的,但是必须按提交按钮 文件数+1 次,才可以提交。也就是说,如果你生成了3个file框,要按4下提交按钮才行咯:).Strange, Isn't It? hehe ^^
      

  10.   

    我的猜想:
    IE对使用DOM方法与指定HTML方法的解释不一样。
    outerHTML可能让IE对那部分的HTML重新解释(可能有一些权限或者其他信息的调整),然后再调整DOM节点结构
    而DOM的appendChild对象只是改变DOM的节点结构,其他相关内容没有更新,导致在访问时出现权限不够的问题不过这可能是在File Input这种有权限要求的Element上才回出现的,也许这也是IE中的一个Bug.不知道我得想法是否正确,请指教?
      

  11.   

    新代码,在ie5.0上测试通过
    <HTML>
    <HEAD>
    <SCRIPT language="javascript"> //---新建上传
    function newUpload(){
    var fileCount = fileList.childNodes.length + 1;
    var fileInput = newFileInput("upfile_" + fileCount);
    if(selectFile(fileInput)){
    addFile(fileInput);
    }
    }


    //----选择文件
    function selectFile(oFileInput){
    uploadFiles.appendChild(oFileInput);
    oFileInput.click();
    var fileValue = oFileInput.value;
    if(fileValue == ""){
    uploadFiles.removeChild(oFileInput);
    return false;
    }
    else
    return true;

    }

    //---新建一个文件显示列表
    function addFile(oFileInput){
    var fileIndex = fileList.childNodes.length + 1;
    var oTR  = document.createElement("TR");
    var oTD1 = document.createElement("TD");
    var oTD2 = document.createElement("TD");

    oTR.setAttribute("id","file_" + fileIndex);
    oTD1.setAttribute("width","90%");
    oTD2.setAttribute("width","10%");
    oTD2.setAttribute("align","center");
    oTD1.innerText = oFileInput.value;
    oTD2.innerHTML = '<A href="javascript:removeFile('+ fileIndex + ');">删除</A>';

    oTR.appendChild(oTD1);
    oTR.appendChild(oTD2);
    fileList.appendChild(oTR);
    }

    //---移除上传的文件 
    function removeFile(fileIndex){
    var oFileInput = document.all("upfile_" + fileIndex);
    var oTR        = document.all("file_" + fileIndex);
    uploadFiles.removeChild(oFileInput);
    fileList.removeChild(oTR);
    }

    //---创建一个file input对象并返回
    function newFileInput(_name){
    var oFileInput  = document.createElement("INPUT");
    oFileInput.type = "file";
    oFileInput.outerHTML = '<INPUT type="file" id="' + _name + ' name="' + _name + '>';
    return oFileInput;
    }

    </SCRIPT>
    </HEAD>
    <BODY>
    <FORM action="b.asp" method="post" enctype="multipart/form-data">
    <TABLE border="1" width="100%">
    <TR>
    <TD width="90%"> &nbsp; </TD>
    <TD align="center" width="10%"> <A href="javascript:newUpload();">上传</A> </TD>
    </TR>
    <TR>
    <TD colspan="2" height="300" valign="top">
    <TABLE border="1" width="100%" cellpadding="0" cellspacing="0">
    <TBODY id="fileList">
    </TBODY>
    </TABLE>
    </TD>
    </TR>
    </TABLE>
    <INPUT type="submit" value="提交">
    <DIV id="uploadFiles" style="display:none"></DIV>
    </FORM>
    </BODY>
    </HTML>
      

  12.   

    其实我还是让用户来选择文件,只不过是用程序帮他按了一下浏览按钮而已,所以我开始的想法是认为应该没有权限上的冲突的。用document.forms[0].submit()来提交form就会出现拒绝访问的现象,如果有兴趣不妨试一试。我以上的测试都是在ie5.0 sp3上。
      

  13.   

    我的动态建立input type=file好象一直就好好的,没有问题呀..
      

  14.   

    楼上的,能够把你的代码贴出来吗?
    刚才那个还是有点小问题,下面是最新的
    <HTML>
    <HEAD>
    <SCRIPT language="javascript"> //---新建上传
    function newUpload(){
    var fileCount = fileList.childNodes.length + 1;
    var fileInput = newFileInput("upfile_" + fileCount);
    if(selectFile(fileInput)){
    addFile(fileInput);
    }
    }


    //----选择文件
    function selectFile(oFileInput){
    uploadFiles.appendChild(oFileInput);
    oFileInput.click();
    var fileValue = oFileInput.value;
    if(fileValue == ""){
    uploadFiles.removeChild(oFileInput);
    return false;
    }
    else
    return true;

    }

    //---新建一个文件显示列表
    function addFile(oFileInput){
    var fileIndex = fileList.childNodes.length + 1;
    var oTR  = document.createElement("TR");
    var oTD1 = document.createElement("TD");
    var oTD2 = document.createElement("TD");

    oTR.setAttribute("id","file_" + fileIndex);
    oTD1.setAttribute("width","90%");
    oTD2.setAttribute("width","10%");
    oTD2.setAttribute("align","center");
    oTD1.innerText = oFileInput.value;
    oTD2.innerHTML = '<A href="javascript:removeFile('+ fileIndex + ');">删除</A>';

    oTR.appendChild(oTD1);
    oTR.appendChild(oTD2);
    fileList.appendChild(oTR);
    }

    //---移除上传的文件 
    function removeFile(fileIndex){
    var oFileInput = document.all("upfile_" + fileIndex);
    var oTR        = document.all("file_" + fileIndex);
    uploadFiles.removeChild(oFileInput);
    fileList.removeChild(oTR);
    }

    //---创建一个file input对象并返回
    function newFileInput(_name){
    var oFileInput  = document.createElement("INPUT");
    oFileInput.type = "file";
    oFileInput.setAttribute("id",_name);
    oFileInput.outerHTML = '<INPUT type="file" id="' + _name + ' name="' + _name + '>';
    return oFileInput;
    }

    </SCRIPT>
    </HEAD>
    <BODY>
    <FORM action="b.asp" method="post" enctype="multipart/form-data">
    <TABLE border="1" width="100%">
    <TR>
    <TD width="90%"> &nbsp; </TD>
    <TD align="center" width="10%"> <A href="javascript:newUpload();">上传</A> </TD>
    </TR>
    <TR>
    <TD colspan="2" height="300" valign="top">
    <TABLE border="1" width="100%" cellpadding="0" cellspacing="0">
    <TBODY id="fileList">
    </TBODY>
    </TABLE>
    </TD>
    </TR>
    </TABLE>
    <INPUT type="submit" value="提交">
    <DIV id="uploadFiles" style="display:none"></DIV>
    </FORM>
    </BODY>
    </HTML>
      

  15.   

    <!--#INCLUDE FILE="../../FUNCTIONS/PUBLIC_FUNCTIONS.ASP" -->
    <!--#INCLUDE FILE="../INCLUDES/LOCAL_VARIABLES.ASP"-->
    <!--#INCLUDE FILE="../INCLUDES/AUTHENTICATE.ASP"-->
    <HTML>
    <HEAD>
    <script language="javascript">
    function AddMoreRow()
    {
    oButton=event.srcElement;
    oOldRow=oButton.parentNode.parentNode.previousSibling;
    oTable=oOldRow.parentNode.parentNode;
    oNewRow=oTable.insertRow(oTable.rows.length-1);
    for(i=0;i<oOldRow.cells.length;i++)
    {
    oCell=oNewRow.insertCell();
    oCell.innerHTML=oOldRow.cells[i].innerHTML;
    oCell.align=oOldRow.cells[i].align;
    oCell.vAlign=oOldRow.cells[i].vAlign;
    oCell.colSpan=oOldRow.cells[i].colSpan;
    for(j=0;j<oCell.childNodes.length;j++)
    {
    if(oCell.childNodes(j).tagName=="TABLE")
    {
    nRowCount=oCell.childNodes(j).rows.length-2;
    for(k=0;k<nRowCount;k++)
    {
    oCell.childNodes(j).deleteRow(0);
    }
    oCell.childNodes(j).all("Group" + i).value=oNewRow.rowIndex;
    for(k=0;k<oCell.childNodes(j).all.length;k++)
    {
    if(oCell.childNodes[j].all(k).type=="text")
    {
    oCell.childNodes[j].all(k).value=""
    oCell.childNodes[j].all(k).readOnly=false;
    }
    if(oCell.childNodes[j].all(k).type=="button")
    {
    oCell.childNodes[j].all(k).disabled=false;
    }
    if(oCell.childNodes[j].all(k).name=="NumberInGroup" + i
    && oCell.childNodes[j].all(k).type=="text")
    {
    oCell.childNodes[j].all(k).value=1;
    }
    }
    }
    if(oCell.childNodes(j).tagName=="SPAN")
    {
    oCell.childNodes(j).innerText="";
    }
    if(oCell.childNodes(j).tagName=="SELECT")
    {
    oCell.childNodes(j).selectedIndex=0;
    }
    if(oCell.childNodes[j].type=="text")
    {
    oCell.childNodes[j].value=""
    oCell.childNodes[j].readOnly=false;
    }
    if(oCell.childNodes[j].type=="hidden")
    {
    oCell.childNodes[j].value=""
    }
    if(oCell.childNodes[j].type=="button")
    {
    oCell.childNodes[j].disabled=false;
    }
    if(oCell.childNodes[j].nodeType==1&&oCell.childNodes[j].readyState==4)
    {
    if(oCell.childNodes[j].tagName=="OBJECT"
    &&oCell.childNodes[j].classid=="CLSID:35020238-5912-11D1-9A00-00C04FD8DC2E")
    {
    oCell.childNodes[j].object.Font=oOldRow.cells[i].childNodes[j].object.Font;
    }
    }
    }
    }
    if(oTable.parentNode.tagName=="TD")
    {
    iCellIndex=oTable.parentNode.cellIndex;
    if(oButton.parentNode.all('NumberInGroup'+iCellIndex)!=null)
    {
    oButton.parentNode.all('NumberInGroup'+iCellIndex).value=oTable.rows.length-1;
    }
    }
    }
    </script>
    </HEAD>
    <body SCROLL=no>
    <FORM ENCTYPE="multipart/form-data" target="_hideFrame" method=post onsubmit="">
    <table width="100%" border="0" cellspacing="1" cellpadding="0">
    <tr class="blue_bg"> 
    <td width="10%">Attachment</td>
    <td width="10%">Res</td>
    </tr>
    <tr> 
    <td width="10%"> 
    <INPUT class="input" name=Attachment type=file size="23"  onkeypress="return false;">
    </td>
    <td width="10%"> 
    <INPUT class="input" name="Comment" size="40" maxlength=255>
    </td>
    </tr>
    <tr> 
    <td width="10%">&nbsp;</td>
    <td width="10%" align="right">
    <INPUT class="btn" type="button" value="Add More Attachments" onclick="AddMoreRow()">
    </td>
    </tr>
    </table>
    <table width="100%" border="0" cellspacing="1" cellpadding="0">
    <tr class="blue_bg"> 
    <td colspan=2><B>Laserfiche Link</B></td>
    </tr>
    <tr class="blue_bg"> 
    <td>Laserfiche Key</td><td>Comment</td>
    </tr>
    <tr> 
    <td width="10%"> 
    <INPUT class="input" name=Laserfiche_Key size="23">
    </td>
    <td width="10%"> 
    <INPUT class="input" name="L_Comment" size="40" maxlength=255>
    </td>
    </tr>
    <tr> 
    <td width="10%">&nbsp;</td>
    <td width="10%" align="right">
    <INPUT class="btn" type="button" value="Add More Attachments" onclick="AddMoreRow()">
    </td>
    </tr>
    </table>
    <table><tr><td><input type=submit name="confirm"></td></tr></table>
    </form>
    <iframe height=0 src=about:blank name=_hideFrame></iframe>
    </body>
    </HTML>
      

  16.   

    '处理上传文件的ASP代码
    <!--#INCLUDE FILE="../../FUNCTIONS/PUBLIC_FUNCTIONS.ASP" -->
    <!--#INCLUDE FILE="../INCLUDES/LOCAL_VARIABLES.ASP"-->
    <!--#INCLUDE FILE="../INCLUDES/AUTHENTICATE.ASP"-->
    <!--#INCLUDE FILE="../INCLUDES/FILEUPLOAD.ASP"-->
    <%
    if UCase(Request.ServerVariables("REQUEST_METHOD"))<>"POST" then
    Response.End
    end if
    Set UploadRequest=CreateObject("Scripting.Dictionary")
    RequestBin=Request.BinaryRead(Request.TotalBytes)
    GetUpload RequestBin
    for i=0 to UploadRequest("Comment").count-1
    if len(UploadRequest("Attachment")(i)("Value"))>0 then
    FileName=dfStrCheckSingle(UploadRequest("Attachment")(i)("FileName"))
    FileNameArray=split(FileName,".")
    ContentType=dfStrCheckSingle(UploadRequest("Attachment")(i)("ContentType"))
    Comment=dfStrCheckSingle(UploadRequest("Attachment")(i)("Comment"))
    'Process UploadRequest("Attachment")(i)("Value")
    end if
    next
    end if
    for i=0 to UploadRequest("Laserfiche_Key").Count-1
    if UploadRequest("Laserfiche_Key")(i)("Value")<>"" then
    LaserficheKey=dfStrCheckSingle(UploadRequest("Laserfiche_Key")(i)("Value"))
    Comment=dfStrCheckSingle(UploadRequest("L_Comment")(i)("Value"))
    end if
    next
    end if
    Response.Write "<script language=javascript>"
    Response.Write "parent.parent.bAttachmentSaved=true;"
    Response.Write "if(parent.parent.bAttachmentSaved && parent.parent.bPartiesSaved)"
    Response.Write "{"
    Response.Write "    parent.parent.location='../REVIEW/DOCUMENT_FILING_INDEX_REVIEW.ASP?DocInx='+parent.parent.DocInx"
    Response.Write "}"
    Response.Write "</script>"
    %>
      

  17.   

    FILEUPLOAD.ASP<%
    sub GetUpload(FormData)
    Dim DivStr,DivLen,PosOpenBoundary,PosCloseBoundary
    Dim FieldNameStart,FormFieldName,FieldNameSize,FormFieldData,DataStart,DataEnd,DataSize
    Dim FieldFileNameStart,FormFileName,FieldFileNameSize
    Dim FieldFileCTStart,FormFileCT,FieldFileCTSize
    '分隔标志串(+CRLF),
    DivStr=LeftB(FormData,InStrB(FormData,str2bin(VbCrLf))-1)
    '分隔标志串长度
    DivLen=LenB(DivStr)
    PosOpenBoundary=InStrB(FormData,DivStr)
    PosCloseBoundary=InStrB(PosOpenBoundary+1,FormData,DivStr)
    Do until PosCloseBoundary=lenb(FormData) or PosCloseBoundary=0 '(PosOpenBoundary=lenb(FormData))
    dim Field,FirstField,bIsFile
    bIsFile=false
    FormFieldName=""
    Set Field=CreateObject("Scripting.Dictionary")
    'Name起始位置(Name="xxxxx"),加6是因为[Name="]长度为6
    FieldNameStart=InStrB(PosOpenBoundary,FormData,str2bin("name="))+6
    FieldNameSize=InStrB(FieldNameStart,FormData,ChrB(34))-FieldNameStart'(")的ASC值=34
    FormFieldName=bin2str(MidB(FormData,FieldNameStart,FieldNameSize)) 'FileName起始位置(FileName="xxxxx")
    FieldFileNameStart=InStrB(PosOpenBoundary,FormData,str2bin("filename="))+10
    if PosCloseBoundary=0 then
    PosCloseBoundary=lenb(FormData)
    end if
    If FieldFileNameStart<PosCloseBoundary And FieldFileNameStart>PosopenBoundary Then
    FieldFileNameSize=InStrB(FieldFileNameStart,FormData,ChrB(34))-FieldFileNameStart '(")的ASC值=34
    FormFileName=bin2str(MidB(FormData,FieldFileNameStart,FieldFileNameSize))
    Field.Add "FilePath",FormFileName
    Field.Add "FileName",GetFileName(FormFileName)
    bIsFile=true
    End If
    'Content-Type起始位置(Content-Type: xxxxx)
    FieldFileCTStart=InStrB(PosOpenBoundary,FormData,str2bin("Content-Type:"))+14
    If FieldFileCTStart<PosCloseBoundary And FieldFileCTStart>PosOpenBoundary Then
    FieldFileCTSize=InStrB(FieldFileCTStart,FormData,str2bin(VbCrLf & VbCrLf))-FieldFileCTStart
    FormFileCT=bin2str(MidB(FormData,FieldFileCTStart,FieldFileCTSize))
    Field.Add "ContentType",FormFileCT
    End If
    '数据起始位置:2个CRLF开始
    If bIsFile Then
    DataStart=InStrB(FieldFileCTStart,FormData,str2bin(VbCrLf))+4
    DataEnd=InstrB(DataStart,FormData,DivStr)-2
    FormFieldData=MidB(FormData,DataStart,DataEnd-DataStart)
    Else
    DataStart=InstrB(FieldNameStart,FormData,str2bin(VbCrLf))+4
    DataEnd=InstrB(DataStart,RequestBin,DivStr)-2
    FormFieldData=bin2str(MidB(FormData,DataStart,DataEnd-DataStart))
    End If
    Field.Add "Value",FormFieldData
    Field.Add "FieldDataBgnPos",DataStart
    Field.Add "FieldDataLength",DataEnd-DataStart
    if UploadRequest.Exists(FormFieldName) then
    iCount=UploadRequest(FormFieldName).Count
    UploadRequest(FormFieldName).Add iCount,Field
    else
    Set FirstField=CreateObject("Scripting.Dictionary")
    FirstField.Add 0,Field
    UploadRequest.Add FormFieldName,FirstField
    end if
    PosOpenBoundary=PosCloseBoundary
    PosCloseBoundary=InStrB(PosOpenBoundary+1,FormData,DivStr)
    loop
    End sub
    '把二进制字符串转换成普通字符串函数
    Function bin2str(binstr)
    Dim varlen,clow,ccc,skipflag,i
    '中文字符Skip标志
    skipflag=0
    ccc=""
    If Not IsNull(binstr) Then
    varlen=LenB(binstr)
    For i=1 To varlen
    If skipflag=0 Then
    clow=MidB(binstr,i,1)
    '判断是否中文的字符
    If AscB(clow)>127 Then
    'AscW会把二进制的中文双字节字符高位和低位反转,所以要先把中文的高低位反转
    ccc=ccc & Chr(AscW(MidB(binstr,i+1,1) & clow))
    skipflag=1
    Else
    ccc=ccc & Chr(AscB(clow))
    End If
    Else
    skipflag=0
    End If
    Next
    End If
    bin2str=ccc
    End Function'把普通字符串转成二进制字符串函数
    Function str2bin(varstr)
    dim i,varchar,varasc
    str2bin=""
    For i=1 To Len(varstr)
    varchar=mid(varstr,i,1)
    varasc=Asc(varchar)
    'asc对中文字符求出来的值可能为负数,
    '加上65536就可求出它的无符号数值
    '-1在机器内是用补码表示的0xffff,
    '其无符号值为65535,65535=-1+65536
    '其他负数依次类推。
    If varasc<0 Then
    varasc=varasc+65535
    End If
    '对中文的处理:把双字节低位和高位分开
    If varasc>255 Then
    varlow=Left(Hex(Asc(varchar)),2)
    varhigh=right(Hex(Asc(varchar)),2)
    str2bin=str2bin & chrB("&H" & varlow) & chrB("&H" & varhigh)
    Else
    str2bin=str2bin & chrB(AscB(varchar))
    End If
    Next
    End Function
    '取得文件名(去掉Path)
    Function GetFileName(FullPath)
    If FullPath<>"" Then
    FullPath=StrReverse(FullPath)
    if InStr(1,FullPath,"\")>0 then
    FullPath=Left(FullPath,InStr(1,FullPath,"\")-1)
    GetFileName=StrReverse(FullPath)
    else
    GetFileName=StrReverse(FullPath)
    end if
    Else
    GetFileName=""
    End If
    End Function
    %>