Forms 如何使用FreeASPUpload脚本插入记录和上载文件

Forms 如何使用FreeASPUpload脚本插入记录和上载文件,forms,file-upload,asp-classic,upload,httprequest,Forms,File Upload,Asp Classic,Upload,Httprequest,我想插入记录和上传文件在同一时间,现在我使用的脚本。当我提交表单时,它会返回此错误 Cannot use the generic Request collection after calling BinaryRead 这是我的页面的完整源代码 <% option explicit Response.Expires = -1 Server.ScriptTimeout = 600 Session.CodePage = 65001 %> <!-- #include file=

我想插入记录和上传文件在同一时间,现在我使用的脚本。当我提交表单时,它会返回此错误

Cannot use the generic Request collection after calling BinaryRead
这是我的页面的完整源代码

<% 
option explicit 
Response.Expires = -1
Server.ScriptTimeout = 600
Session.CodePage  = 65001
%>
<!-- #include file="UploadClass.asp" -->
<%

  Dim uploadsDirVar
  uploadsDirVar = server.MapPath("Files_Uploaded") 

function OutputForm()
%>
<form name="frmSend" method="POST" enctype="multipart/form-data" accept-charset="utf-8" action="form.asp" onSubmit="return onSubmitForm();">
<input type="hidden" name="ApplicationForm" value="Insert" />
Name: <input type="text" name="name_insert" value="" size="30" />
    <B>File names:</B><br>
    File 1: <input name="attach1" type="file" size=35><br>
    <br> 
    <input style="margin-top:4" type="submit" value="Submit">
    </form>
<%
end function

function TestEnvironment()
    Dim fso, fileName, testFile, streamTest
    TestEnvironment = ""
    Set fso = Server.CreateObject("Scripting.FileSystemObject")
    if not fso.FolderExists(uploadsDirVar) then
        TestEnvironment = "<B>Folder " & uploadsDirVar & " does not exist.</B><br>The value of your uploadsDirVar is incorrect. Open uploadTester.asp in an editor and change the value of uploadsDirVar to the pathname of a directory with write permissions."
        exit function
    end if
    fileName = uploadsDirVar & "\test.txt"
    on error resume next
    Set testFile = fso.CreateTextFile(fileName, true)
    If Err.Number<>0 then
        TestEnvironment = "<B>Folder " & uploadsDirVar & " does not have write permissions.</B><br>The value of your uploadsDirVar is incorrect. Open uploadTester.asp in an editor and change the value of uploadsDirVar to the pathname of a directory with write permissions."
        exit function
    end if
    Err.Clear
    testFile.Close
    fso.DeleteFile(fileName)
    If Err.Number<>0 then
        TestEnvironment = "<B>Folder " & uploadsDirVar & " does not have delete permissions</B>, although it does have write permissions.<br>Change the permissions for IUSR_<I>computername</I> on this folder."
        exit function
    end if
    Err.Clear
    Set streamTest = Server.CreateObject("ADODB.Stream")
    If Err.Number<>0 then
        TestEnvironment = "<B>The ADODB object <I>Stream</I> is not available in your server.</B><br>Check the Requirements page for information about upgrading your ADODB libraries."
        exit function
    end if
    Set streamTest = Nothing
end function

function SaveFiles
    Dim Upload, fileName, fileSize, ks, i, fileKey

    Set Upload = New FreeASPUpload
    Upload.Save(uploadsDirVar)

    ' If something fails inside the script, but the exception is handled
    If Err.Number<>0 then Exit function

    SaveFiles = ""
    ks = Upload.UploadedFiles.keys
    if (UBound(ks) <> -1) then
        SaveFiles = "<B>Files uploaded:</B> "
        for each fileKey in Upload.UploadedFiles.keys
            SaveFiles = SaveFiles & Upload.UploadedFiles(fileKey).FileName & " (" & Upload.UploadedFiles(fileKey).Length & "B) "
        next
    else
        SaveFiles = "No file selected for upload or the file name specified in the upload form does not correspond to a valid file in the system."
    end if
    SaveFiles = SaveFiles & "<br>Enter a number = " & Upload.Form("enter_a_number") & "<br>"
    SaveFiles = SaveFiles & "Checkbox values = " & Upload.Form("checkbox_values") & "<br>"
    SaveFiles = SaveFiles & "List values = " & Upload.Form("list_values") & "<br>"
    SaveFiles = SaveFiles & "Text area = " & Upload.Form("t_area") & "<br>"
end function
%>
<HTML>
<HEAD>
<TITLE>Test Free ASP Upload 2.0</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
BODY {background-color: white;font-family:arial; font-size:12}
</style>
<script>
function onSubmitForm() {
    var formDOMObj = document.frmSend;
    if (formDOMObj.attach1.value == "")
        alert("Please press the Browse button and pick a file.")
    else
        return true;
    return false;
}
</script>

</HEAD>

<BODY>

<br><br>
<div style="border-bottom: #A91905 2px solid;font-size:16">Upload files to your server</div>
<%
Dim diagnostics
if Request.ServerVariables("REQUEST_METHOD") <> "POST" then
    diagnostics = TestEnvironment()
    if diagnostics<>"" then
        response.write "<div style=""margin-left:20; margin-top:30; margin-right:30; margin-bottom:30;"">"
        response.write diagnostics
        response.write "<p>After you correct this problem, reload the page."
        response.write "</div>"
    else
        response.write "<div style=""margin-left:150"">"
        OutputForm()
        response.write "</div>"
    end if
else
    response.write "<div style=""margin-left:150"">"
    OutputForm()
    response.write SaveFiles()
    response.write "<br><br></div>"
end if

%>

</BODY>
</HTML>
<!-- #include file="ADOVBS.inc" -->
<%

'=======================================================================================
' CONNECT DATABASE
'=======================================================================================
Dim objConn, objRs
Set objConn = CreateObject("ADODB.Connection")
Set objRs = CreateObject("ADODB.Recordset")
objConn.open"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.MapPath("db/Job_database.mdb") &";Mode=ReadWrite|Share Deny None;Persist Security Info=False"

If Request("ApplicationForm") = "Insert" Then
Set InsCom=Server.CreateObject("ADODB.Command")
InsCom.ActiveConnection=objConn

InsName = Trim(request("name_insert"))
InsName = replace(InsName,"'","''")

InsCom.CommandText = "Insert into applications(aname)Values(?)"
InsCom.Parameters.Append InsCom.CreateParameter("@name_insert", adVarChar, adParamInput, 255, InsName)

InsCom.Execute

End If
%>
对此

If Upload.Form("ApplicationForm") = "Insert" Then
但它也会返回一个错误,即:变量未定义:'Upload'

如果我更改请求方法,它只上载文件而不插入记录

If Request.QueryString("ApplicationForm") = "Insert" Then
我所理解的是,我的insert查询位于错误的位置


请帮我解决这个问题。。谢谢

我没有太多使用AspFreeUpload,所以我在这里猜测一下

使用请求对象似乎不是一个选项,因此您不得不使用Upload.Form。正如您的代码所示,上载对象仅在SaveFiles函数的上下文中定义和设置

尝试将数据库插入代码移动到SaveFiles函数中。这意味着从生产线上切断一切

Dim objConn, objRs

并将其粘贴到“结束函数”之前


您可能还需要将include adovbs.inc指令移动到调用函数之前的某个位置。最符合逻辑的地方应该是在另一个include directive=for uploadclass.asp的正下方的一行。非常感谢John,我已经按照您的建议移动了所有代码。但是,
ADOVBS.INC
有一个问题,因为我将文件移到了
UploadClass.asp
下面,但是声明它们显式地完成了任务,所以无法识别此文件中定义的变量。再次感谢你们,现在我的问题解决了:)很高兴你们到了那个里。我想您也可以在函数本身中包含adovbs.inc,但是声明您需要的唯一变量是一个更简洁的解决方案。我几乎从未使用过adovbs.inc。在
global.asa
文件中使用
而不是
adovbs.asp
,以使所有asp页面都可以访问ADO常量。2.无法使用
Request.Form
的原因是,一旦调用
Request.BinaryRead()
请求集合就会失效,这就是为什么AspFreeUpload提供了自己的
Scripting.Dictionary
来访问这些值。@Lankymart-嗯,OP使用的是adovbs.inc,所以我坚持使用它。就我个人而言,我倾向于使用类似于
rs.opensql,conn,0,1的东西,因此我不需要Constants,因为发现元数据Typelib标记后,我不会以任何其他方式进行。我个人认为,从一些人的角度来看代码,
rs.opensql、conn、adOpenForwardOnly、adLockReadOnly
更容易阅读和理解其含义,但每个都有自己的特点。
Dim objConn, objRs
InsCom.Execute