Avatar billede steerman Nybegynder
13. marts 2008 - 13:04 Der er 10 kommentarer

Åbne en ASP fil

Jeg har lavet et konverterings værktøj i XSL/XML, som jeg får vist på en hjemmeside. Alt virker fint, men nu vil jeg gerne have at brugerne, skal kunne uploade deres egen XML fil. Jeg ved bare ikke hvordan jeg skal gøre det. Her er min kode, til det statiske:

<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("test.xml"))

'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("test.xsl"))

'Transform file
Response.Write(xml.transformNode(xsl))
%>

Jeg vil gerne have ændret Load XML til at man kan bruge sin egen XML fil, og ikke en der ligger på serveren. Tak! :)
Avatar billede w13 Novice
13. marts 2008 - 13:19 #1
Der vil du nok blive nødt til at uploade filen til serveren først, er jeg bange for.
Avatar billede steerman Nybegynder
13. marts 2008 - 13:24 #2
Kan man så vælge en form for "gennemse" / "upload" og så behandle filen automatisk?
Avatar billede w13 Novice
13. marts 2008 - 18:17 #3
Ikke uden først at kode selve upload-funktionaliteten, så vidt jeg ved.
Avatar billede arne_v Ekspert
14. marts 2008 - 03:16 #4
Hvor kommer .NET ind i billedet ? (ovenstående ligner ASP)
Avatar billede w13 Novice
01. april 2008 - 12:32 #5
steerman>> ? :)
Avatar billede steerman Nybegynder
01. april 2008 - 15:16 #6
Jeg har lavet upload funktionen... og den virker fint.... jeg ved bare ikke hvordan jeg skal kode de 2 sammen. :-(
Avatar billede w13 Novice
01. april 2008 - 16:14 #7
Når den er uploadet indsætter du vel bare filstien/filnavnet i stedet for "test.xml".
Avatar billede steerman Nybegynder
01. april 2008 - 16:45 #8
Ja, det er så lige det jeg ikke kan finde ud af at gøre... :-)

Da filnavnet er noget brugeren bestemmer, så ved jeg ikke helt hvad jeg skal gøre...?
Avatar billede w13 Novice
01. april 2008 - 18:18 #9
Men kan det ikke hentes ud fra din upload? Uden at kende uploaden, kan vi jo ikke hjælpe dig videre.
Avatar billede steerman Nybegynder
01. april 2008 - 19:20 #10
Okay... Her er mine upload filer.

Uploadtester.asp
<%@ Language=VBScript %>
<%
option explicit
Response.Expires = -1
Server.ScriptTimeout = 600
%>
<!-- #include file="freeaspupload.asp" -->
<%

  Dim uploadsDirVar
  uploadsDirVar = "c:\inetpub\wwwroot\test\test"

function OutputForm()
%>
    <form name="frmSend" method="POST" enctype="multipart/form-data" action="uploadTester.asp" onSubmit="return onSubmitForm();">
    <B>Fil navn:</B><br>
    Fil: <input name="attach1" type="file" size=35><br>
    <br>
    <input style="margin-top:4" type=submit value="Upload">
    </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 = "The file name specified in the upload form does not correspond to a valid file in the system."
    end if
end function
%>



<HTML>
<HEAD>
<TITLE>Vareindmeldesle</TITLE>
<style>
BODY {background-color: white;font-family:arial; font-size:12}
</style>
<script>
function onSubmitForm() {
    var formDOMObj = document.frmSend;
    if (formDOMObj.attach1.value == "" && formDOMObj.attach2.value == "" && formDOMObj.attach3.value == "" && formDOMObj.attach4.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">Vælg din xml fil</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

%>
<br><br>
</BODY>
</HTML>

Her er min freeASPUpload.asp

<%
Class FreeASPUpload
    Public UploadedFiles
    Public FormElements

    Private VarArrayBinRequest
    Private StreamRequest
    Private uploadedYet

    Private Sub Class_Initialize()
        Set UploadedFiles = Server.CreateObject("Scripting.Dictionary")
        Set FormElements = Server.CreateObject("Scripting.Dictionary")
        Set StreamRequest = Server.CreateObject("ADODB.Stream")
        StreamRequest.Type = 1 'adTypeBinary
        StreamRequest.Open
        uploadedYet = false
    End Sub
   
    Private Sub Class_Terminate()
        If IsObject(UploadedFiles) Then
            UploadedFiles.RemoveAll()
            Set UploadedFiles = Nothing
        End If
        If IsObject(FormElements) Then
            FormElements.RemoveAll()
            Set FormElements = Nothing
        End If
        StreamRequest.Close
        Set StreamRequest = Nothing
    End Sub

    Public Property Get Form(sIndex)
        Form = ""
        If FormElements.Exists(LCase(sIndex)) Then Form = FormElements.Item(LCase(sIndex))
    End Property

    Public Property Get Files()
        Files = UploadedFiles.Items
    End Property

    'Calls Upload to extract the data from the binary request and then saves the uploaded files
    Public Sub Save(path)
        Dim streamFile, fileItem

        if Right(path, 1) <> "\" then path = path & "\"

        if not uploadedYet then Upload

        For Each fileItem In UploadedFiles.Items
            Set streamFile = Server.CreateObject("ADODB.Stream")
            streamFile.Type = 1
            streamFile.Open
            StreamRequest.Position=fileItem.Start
            StreamRequest.CopyTo streamFile, fileItem.Length
            streamFile.SaveToFile path & fileItem.FileName, 2
            streamFile.close
            Set streamFile = Nothing
            fileItem.Path = path & fileItem.FileName
        Next
    End Sub

    Public Function SaveBinRequest(path) ' For debugging purposes
        StreamRequest.SaveToFile path & "\debugStream.bin", 2
    End Function

    Public Sub DumpData() 'only works if files are plain text
        Dim i, aKeys, f
        response.write "Form Items:<br>"
        aKeys = FormElements.Keys
        For i = 0 To FormElements.Count -1 ' Iterate the array
            response.write aKeys(i) & " = " & FormElements.Item(aKeys(i)) & "<BR>"
        Next
        response.write "Uploaded Files:<br>"
        For Each f In UploadedFiles.Items
            response.write "Name: " & f.FileName & "<br>"
            response.write "Type: " & f.ContentType & "<br>"
            response.write "Start: " & f.Start & "<br>"
            response.write "Size: " & f.Length & "<br>"
        Next
      End Sub

    Private Sub Upload()
        Dim nCurPos, nDataBoundPos, nLastSepPos
        Dim nPosFile, nPosBound
        Dim sFieldName, osPathSep, auxStr

        'RFC1867 Tokens
        Dim vDataSep
        Dim tNewLine, tDoubleQuotes, tTerm, tFilename, tName, tContentDisp, tContentType
        tNewLine = Byte2String(Chr(13))
        tDoubleQuotes = Byte2String(Chr(34))
        tTerm = Byte2String("--")
        tFilename = Byte2String("filename=""")
        tName = Byte2String("name=""")
        tContentDisp = Byte2String("Content-Disposition")
        tContentType = Byte2String("Content-Type:")

        uploadedYet = true

        on error resume next
        VarArrayBinRequest = Request.BinaryRead(Request.TotalBytes)
        if Err.Number <> 0 then
            response.write "<br><br><B>System reported this error:</B><p>"
            response.write Err.Description & "<p>"
            response.write "The most likely cause for this error is the incorrect setup of AspMaxRequestEntityAllowed in IIS MetaBase. Please see instructions in the <A HREF='http://www.freeaspupload.net/freeaspupload/requirements.asp'>requirements page of freeaspupload.net</A>.<p>"
            Exit Sub
        end if
        on error goto 0 'reset error handling

        nCurPos = FindToken(tNewLine,1) 'Note: nCurPos is 1-based (and so is InstrB, MidB, etc)

        If nCurPos <= 1  Then Exit Sub
       
        'vDataSep is a separator like -----------------------------21763138716045
        vDataSep = MidB(VarArrayBinRequest, 1, nCurPos-1)

        'Start of current separator
        nDataBoundPos = 1

        'Beginning of last line
        nLastSepPos = FindToken(vDataSep & tTerm, 1)

        Do Until nDataBoundPos = nLastSepPos
           
            nCurPos = SkipToken(tContentDisp, nDataBoundPos)
            nCurPos = SkipToken(tName, nCurPos)
            sFieldName = ExtractField(tDoubleQuotes, nCurPos)

            nPosFile = FindToken(tFilename, nCurPos)
            nPosBound = FindToken(vDataSep, nCurPos)
           
            If nPosFile <> 0 And  nPosFile < nPosBound Then
                Dim oUploadFile
                Set oUploadFile = New UploadedFile
               
                nCurPos = SkipToken(tFilename, nCurPos)
                auxStr = ExtractField(tDoubleQuotes, nCurPos)
                ' We are interested only in the name of the file, not the whole path
                ' Path separator is \ in windows, / in UNIX
                ' While IE seems to put the whole pathname in the stream, Mozilla seem to
                ' only put the actual file name, so UNIX paths may be rare. But not impossible.
                osPathSep = "\"
                if InStr(auxStr, osPathSep) = 0 then osPathSep = "/"
                oUploadFile.FileName = Right(auxStr, Len(auxStr)-InStrRev(auxStr, osPathSep))

                if (Len(oUploadFile.FileName) > 0) then 'File field not left empty
                    nCurPos = SkipToken(tContentType, nCurPos)
                   
                    auxStr = ExtractField(tNewLine, nCurPos)
                    ' NN on UNIX puts things like this in the streaa:
                    '    ?? python py type=?? python application/x-python
                    oUploadFile.ContentType = Right(auxStr, Len(auxStr)-InStrRev(auxStr, " "))
                    nCurPos = FindToken(tNewLine, nCurPos) + 4 'skip empty line
                   
                    oUploadFile.Start = nCurPos-1
                    oUploadFile.Length = FindToken(vDataSep, nCurPos) - 2 - nCurPos
                   
                    If oUploadFile.Length > 0 Then UploadedFiles.Add LCase(sFieldName), oUploadFile
                End If
            Else
                Dim nEndOfData
                nCurPos = FindToken(tNewLine, nCurPos) + 4 'skip empty line
                nEndOfData = FindToken(vDataSep, nCurPos) - 2
                If Not FormElements.Exists(LCase(sFieldName)) Then
                    FormElements.Add LCase(sFieldName), String2Byte(MidB(VarArrayBinRequest, nCurPos, nEndOfData-nCurPos))
                else
                    FormElements.Item(LCase(sFieldName))= FormElements.Item(LCase(sFieldName)) & ", " & String2Byte(MidB(VarArrayBinRequest, nCurPos, nEndOfData-nCurPos))
                end if

            End If

            'Advance to next separator
            nDataBoundPos = FindToken(vDataSep, nCurPos)
        Loop
        StreamRequest.Write(VarArrayBinRequest)
    End Sub

    Private Function SkipToken(sToken, nStart)
        SkipToken = InstrB(nStart, VarArrayBinRequest, sToken)
        If SkipToken = 0 then
            Response.write "Error in parsing uploaded binary request."
            Response.End
        end if
        SkipToken = SkipToken + LenB(sToken)
    End Function

    Private Function FindToken(sToken, nStart)
        FindToken = InstrB(nStart, VarArrayBinRequest, sToken)
    End Function

    Private Function ExtractField(sToken, nStart)
        Dim nEnd
        nEnd = InstrB(nStart, VarArrayBinRequest, sToken)
        If nEnd = 0 then
            Response.write "Error in parsing uploaded binary request."
            Response.End
        end if
        ExtractField = String2Byte(MidB(VarArrayBinRequest, nStart, nEnd-nStart))
    End Function

    'String to byte string conversion
    Private Function Byte2String(sString)
        Dim i
        For i = 1 to Len(sString)
          Byte2String = Byte2String & ChrB(AscB(Mid(sString,i,1)))
        Next
    End Function

    'Byte string to string conversion
    Private Function String2Byte(bsString)
        Dim i
        String2Byte =""
        For i = 1 to LenB(bsString)
          String2Byte = String2Byte & Chr(AscB(MidB(bsString,i,1)))
        Next
    End Function
End Class

Class UploadedFile
    Public ContentType
    Public Start
    Public Length
    Public Path
    Private nameOfFile

    ' Need to remove characters that are valid in UNIX, but not in Windows
    Public Property Let FileName(fN)
        nameOfFile = fN
        nameOfFile = SubstNoReg(nameOfFile, "\", "_")
        nameOfFile = SubstNoReg(nameOfFile, "/", "_")
        nameOfFile = SubstNoReg(nameOfFile, ":", "_")
        nameOfFile = SubstNoReg(nameOfFile, "*", "_")
        nameOfFile = SubstNoReg(nameOfFile, "?", "_")
        nameOfFile = SubstNoReg(nameOfFile, """", "_")
        nameOfFile = SubstNoReg(nameOfFile, "<", "_")
        nameOfFile = SubstNoReg(nameOfFile, ">", "_")
        nameOfFile = SubstNoReg(nameOfFile, "|", "_")
    End Property

    Public Property Get FileName()
        FileName = nameOfFile
    End Property

    'Public Property Get FileN()ame
End Class


' Does not depend on RegEx, which is not available on older VBScript
' Is not recursive, which means it will not run out of stack space
Function SubstNoReg(initialStr, oldStr, newStr)
    Dim currentPos, oldStrPos, skip
    If IsNull(initialStr) Or Len(initialStr) = 0 Then
        SubstNoReg = ""
    ElseIf IsNull(oldStr) Or Len(oldStr) = 0 Then
        SubstNoReg = initialStr
    Else
        If IsNull(newStr) Then newStr = ""
        currentPos = 1
        oldStrPos = 0
        SubstNoReg = ""
        skip = Len(oldStr)
        Do While currentPos <= Len(initialStr)
            oldStrPos = InStr(currentPos, initialStr, oldStr)
            If oldStrPos = 0 Then
                SubstNoReg = SubstNoReg & Mid(initialStr, currentPos, Len(initialStr) - currentPos + 1)
                currentPos = Len(initialStr) + 1
            Else
                SubstNoReg = SubstNoReg & Mid(initialStr, currentPos, oldStrPos - currentPos) & newStr
                currentPos = oldStrPos + skip
            End If
        Loop
    End If
End Function
%>

Håber du kan hjælpe mig...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester