/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Problem/spørgsmål ang. fileupload script u~
Fra : Webmaster - Landsbye~


Dato : 20-06-03 10:54

Jeg har gennem længere tid haft glæde af "fileupload" scriptet, lavet af
Lars Snyder, og modificeret af Thomas Petersen, hvilket gør det muligt at
uploade en enkelt fil uden komponent.

Nu er jeg dog løbet ind i et problem, da jeg vil bruge det til flere filer.

Lad mig prøve at ridse problematikken op...

Jeg har en form-side, hvor man kan indtaste hvor mange filer man ønsker
oploaded (1-50)
Derefter vælger man alle filnavnene via en form og disse bliver så gemt i en
txt-fil.

Nu kommer problemet...
I det nuværende script, skal man vælge én fil og så poste formen...
men jeg vil gerne lave en løkke som gennemløber min txt-fil og uploader hver
enkelt fil, sådan her

for 1 to 50
læs txtfil-linie
upload fil
næste

Når jeg gør det på den måde, så får jeg en fejl fra scriptet, som lyder
sådan her:

"Der opstod en Microsoft VBScript-kørselsfejl fejl '800a01c2'
Antallet af argumenter er forkert eller egenskabstildelingen er ugyldig:
'FileUpload'
/natur/upload/upload2.asp, linje 51"

Problemet kommer sikkert fordi jeg ikke bruger Form Post metoden, men bare
prøver at overføre filnavnet direkte.

Har du en løsning på det problem... eller en anden smart måde at gøre det på
??
Det skal lige siges, at jeg ikke har mulighed for at lægge nogen komponent
op på serveren, så det skal helst kunne klares ved asp-kode.

Jeg har kopieret både min side og scriptet ind, herunder.

Jeg håber at du kan/vil hjælpe mig, da jeg nu er gået helt død, og jeg
skulle helst have det til at virke.
Til info, så har jeg prøvet at kontakte begge de herrer som har
lavet/modificeret scriptet, men en kan ikke nåes og den anden arbejder ikke
mere med asp ;-((

Hilsen
Jon Klose Larsen
Webmaster
www.landsbyen-nibe.dk

********* Min side ***********
<%@ Language="VBScript" %>
<!-- #INCLUDE FILE="fileupload.inc" -->

<%
'* åben txt-fil
filename = server.mappath("../../../databaser/natur/") & "\" &
"tempup.txt"
set txtfso = CreateObject("Scripting.FileSystemObject")
set txtfil = txtfso.getfile(filename)
set txtstream = txtfil.openastextstream(1)

'* læs upload-sti fra txt-fil (altid første linie i txt-fil)
sti = txtstream.readline

'* læs filnavn(e) fra txtfil og upload dem, indtil txtfil er tom
DO WHILE NOT txtstream.atendofstream
strtxt = txtstream.readline

'*************
'Det er her det går galt for mig !!!
'Hvordan får jeg overført værdien i strtxt til fileupload-funktionen ?
'*************

intFileUpload = FileUpload(sti, 100000, Array("image/gif"),
Array("gif"), strContentType, strFilename, intFileTotalBytes, "")
If intFileUpload = 0 Then
Response.Write "Filen " & strFilename & " blev
uploaded.<BR><BR>"
Else
Response.Write "Der opstod en fejl under upload!<BR>"
Response.Write "Fejl nr: " & intFileUpload & "<BR>"
Response.Write "Filnavn: " & strFilename & "<BR><BR>"
End If

LOOP
%>

********* Upload scriptet ********

<%
'-------------------- Start: fileupload.inc --------------------

'##########################################################
' Modificeret af Thomas Petersen, tp@doller.dk, 2001-08-30
'##########################################################

'*** FileUpload ***
'*** af Lars Snyder (pila@mailme.dk) ***
'*** http://www.tipsogtricks-online.dk ***
'*
'* Sprog: VBScript
'*
'* Input:
'* strPath Streng med uploadpath, f.eks. "output/",
"/asp/binary/upload/" eller ""
'* intMaxSize Tilladte grænse for filerne filer der uploades. Hvis < 1
er der ingen grænse.
'* arrAcceptType Array med accepterede Content-Type, f.eks. "image/gif",
"image/jpeg". Hvis ("") er alle filtyper accepterede.
'* arrAcceptExt Array med sidste dele af filnavne, f.eks. "gif", "jpg"
eller "kundennefil.xls". Hvis ("") er alle ext accepterede.
'*
'* Output: 0 hvis filen er uploaded korrekt.
'* 1 Request fra bruger gik galt
'* 2 Content med name="fileupload" blev ikke fundet
'* 3 Ingen filnavn
'* 4 Content-Type accepteres ikke
'* 5 Ext accepteres ikke
'* 6 Filen er for stor
'* 7 Filen blev ikke uploaded korrekt
'* strContentType Den fundne type, f.eks. "image/gif"
'* strFilename Det fundne filnavn, f.eks. "button.gif"
'* intFileTotalBytes Filens samlede størrelse, f.eks. 9853
'* intNewFilename Angiver et evt. andet filnavn til filen, BEMÆRK:
Angives uden extension!!!
'*
'* Eksempler på ContentTypes
'* Microsoft IE4 | Netscape NN4
| Beskrivelse
'* "image/gif" | "image/gif"
| CompuServe Graphics Interchange (.gif)
'* "image/pjpeg" | "image/jpeg"
| JPEG/JFIF Compliant (.jpg | .jif | .jpeg)
'* "application/octet-stream" | "application/msexcel"
| Microsoft Excel-regneark (.xls)
'* "application/octet-stream" | "application/msword"
| Microsoft Word-dokument (.doc)
'* "text/html" | "text/html"
| HTML Document (.htm | .html)
'* "text/plain" |
"application/x-unknown-content-type-asp_auto_file" | Active Server Page
(.asp)
'* "text/plain" | "text/plain"
| Tekstdokument (.txt)
'* "text/plain" |
"application/x-unknown-content-type-Excel.CSV" | Separeret fil (.csv)
'* "application/octet-stream" | "application/octet-stream"
| Binær fil (.bin)
'* "application/octet-stream" | "application/octet-stream"
| Uden kendt filtype (.lol)
'* Bemærk i øvrigt, at
'* a. Der er desværre forskel på den tekst Microsoft og Netscape anvender på
samme filtype.
'* b. Microsoft evaulerer ikke kun filens efternavn, men også det faktiske
indhold!

'###########################################################
' Denne function bruges til at gemme filen i større pakker.
'
' Thomas Petersen, tp@doller.dk, 2001-08-30
'###########################################################
function encodePakke(encInd)
encUd = ""
for c = 1 to lenb(encInd)

encUd = encUd & Chr(AscB(MidB(encInd, c, 1)))
next
encodePakke = encUd
end function
'###########################################################

Function FileUpload(strPath, intMaxSize, arrAcceptType, arrAcceptExt, ByRef
strContentType, ByRef strFilename, ByRef intFileTotalBytes, ByRef
strNewFilename)
'Variable deklaration
Dim intPostTotalBytes, intStartPos, intEndPos, i
Dim bstrPostData, bstrDivider
Dim strTemp, strFileSpec
Dim arrSplit
Dim vbCrLfB
Dim bolStopLoop, bolContentTypeOK, bolExtOK
Dim fs, ts, f

'Sæt returværdier
strContentType = ""
strFilename = ""
intFileTotalBytes = 0

'Check: Er det faktisk POST upload?
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then

'Dan vbCrLf som binær streng
vbCrLfB = ChrB(13) & ChrB(10)

'Hent den binære POST fra brugeren
intPostTotalBytes = Request.TotalBytes 'Find antallet af bytes i
POST
bstrPostData = Request.BinaryRead(intPostTotalBytes) 'Hent POST til
en binær streng
If LenB(bstrPostData) <> intPostTotalBytes Then 'Check: Er antallet
af bytes i POST forskelligt fra den binære streng?
'Returner værdi og stop
FileUpload = 1
Exit Function
End If

'Hent delelinien inkl. vbCrLfB (altid hele første linje)
bstrDivider = LeftB(bstrPostData, InStrB(bstrPostData, vbCrLfB) + 1)

'Default StartPos
intStartPos = 1

'Find Content-Disposition hvor name="fileupload"
bolStopLoop = False
Do
'Find starten af denne Content del (umiddelbart efter
delelinien)
intStartPos = InStrB(intStartPos, bstrPostData, bstrDivider) +
LenB(bstrDivider)
If intStartPos = 0 Then
'Ikke flere Content delere - Returner værdi og stop
FileUpload = 2
Exit Function
End If

'Find slutningen af denne Content del (umiddelbart inden den
næste delelinie)
intEndPos = InStrB(intStartPos, bstrPostData, bstrDivider)
If intEndPos = 0 Then
'Ikke flere Content delere - Returner værdi og stop
FileUpload = 2
Exit Function
End If

'Hent denne Content-Disposition (uden vbCrLf)
strTemp = bin2str(MidB(bstrPostData, intStartPos,
InStrB(intStartPos, bstrPostData, vbCrLfB) - intStartPos))

'Er fileupload feltet i denne Content-Disposition?
If InStr(LCase(strTemp), "name=""fileupload""") > 0 Then
'Stop løkken her
bolStopLoop = True
Else
'Start igen umiddelbart efter denne Content, men før næste
divider
intStartPos = intEndPos
End If
Loop Until bolStopLoop

'Flyt intStartPos til efter Content-Disposition linjen
intStartPos = intStartPos + Len(strTemp) + 2

'Ekstrakt POST filnavnet fra strTemp
arrSplit = Split(strTemp, ";") 'Opdel strTemp ved ;:
Content-Disposition: form-data; name="fileupload"; filename="filen.txt"

'Find filnavnet fra filename= array
strTemp = "" 'Værdi ved fejl
For i = 0 To UBound(arrSplit) 'Køres for alle i denne array
If LCase(Left(Trim(arrSplit(i)), 9)) = "filename=" Then 'Står
der filename= ?
strTemp = Trim(arrSplit(i))
Exit For
End If
Next

'Afbryd hvis der ikke blev fundet noget filnavn
If strTemp = "" Or strTemp = "filename=""""" Then
FileUpload = 3
Exit Function
End If

'Find filnavnet
arrSplit = Split(strTemp, """") 'Opdel streng ved "
strTemp = arrSplit(UBound(arrSplit) - 1) 'Næstsidste indholder
filnavn
arrSplit = Split(strTemp, "\") 'Del ved alle \ Så indeholder den
sidste filnavn.ext"
strFilename = arrSplit(UBound(arrSplit)) 'Hent den sidste array, der
må være filnavnet

'*************************************************
' indsæt dags dato som første del af fil-navnet
' i formatet ååååmmdd-filnavn

'strdato = date
'strdato = "20" & mid(strdato,7,2) & mid(strdato,4,2) & left(strdato,2) &
"-"
'strFilename = strdato & strFilename

'*************************************************



'#################################################
' Her undersøges om filen skal have et andet navn
'
' Thomas Petersen, tp@doller.dk, 2001-08-30
'#################################################
if strNewFilename <> "" and instr(strFilename, ".") then
strExt = mid(strFilename, instr(strFilename, "."), len(strFilename) -
instr(strFilename, ".") + 1)
strNewFilename = strNewFileName & strExt
strFilename = strNewFilename
end if
'#################################################

'Dan det fulde outputfilnavn via MapPath
'strFileSpec = Server.MapPath(LCase(strPath & strFilename)) 'LCase
kan evt fjernes herfra
strFileSpec = LCase(strPath & strFilename) 'LCase kan evt fjernes herfra

'Hent Content-Type (uden vbCrLf)
strTemp = bin2str(MidB(bstrPostData, intStartPos,
InStrB(intStartPos, bstrPostData, vbCrLfB) - intStartPos))

'Flyt intStartPos til efter Content-Type linjen
intStartPos = intStartPos + Len(strTemp) + 2

'Ekstrakt POST Content-Type
arrSplit = Split(strTemp, " ")
strContentType = arrSplit(UBound(arrSplit))

'Skal Content-Type checkes?
bolContentTypeOK = False
If arrAcceptType(LBound(arrAcceptType)) <> "" Then
For Each strTemp In arrAcceptType
If strContentType = strTemp Then
bolContentTypeOK = True
End If
Next

'Check: Er det en accepteret Content-Type?
If Not bolContentTypeOK Then
'ContentType ikke fundet - Returner værdi og stop
FileUpload = 4
Exit Function
End If
End If

'Skal ekstention checkes?
bolExtOK = False
If arrAcceptExt(LBound(arrAcceptExt)) <> "" Then
For Each strTemp In arrAcceptExt
If LCase(Right(strFilename, Len(strTemp))) = strTemp Then
bolExtOK = True
End If
Next

'Check: Er det en accepteret ekstention?
If Not bolExtOK Then
'Ekstention ikke fundet - Returner værdi og stop
FileUpload = 5
Exit Function
End If
End If

'Find faktiske start/slut på datafilen ved at fjerne foranstillede
og efterstillede vbCrLfB
intStartPos = intStartPos + 2
intEndPos = intEndPos - 2
intFileTotalBytes = intEndPos - intStartPos

'Skal filstørrelsen checkes?
If intMaxSize > 0 Then
'Check: Er filen for stor?
If intFileTotalBytes > intMaxSize Then
'Filen er for stor - Returner værdi og stop
FileUpload = 6
Exit Function
End If
End If

'Åbn, skriv og luk outputfilen
Set fs = CreateObject("Scripting.FileSystemObject") 'Filsystem
objekt
Set ts = fs.CreateTextFile(strFileSpec, True) 'Åbn outputfil,
overskriv evt. eksisterende

' For i = intStartPos To intEndPos - 1
' ts.Write(Chr(AscB(MidB(bstrPostData, i, 1)))) 'Skriv data eet tegn af
gangen
' Next


'###########################################################################
#########################
' Her begynder ny upload funktion. Denne deler filen op i 1Kb stykker,
hvis filen er over 1Kb i alt.
' Derved opnåes en højere uploadhastighed.
'
' Thomas Petersen, tp@doller.dk, 2001-08-30

'###########################################################################
#########################
dim intPakkeStr, intStep, ialt
intPakkeStr = 1024
if intFileTotalBytes > intPakkeStr then
intStep = intPakkeStr
else
intStep = intFileTotalBytes
end if
intPakkeStr = intStep
ialt = 0
i = intStartPos
Do Until i > intEndPos - 1
if i + intStep > intEndPos - 1 then
intPakkeStr = intEndPos - i
end if
ialt = ialt + intPakkeStr
ts.Write encodePakke(MidB(bstrPostData, i, intPakkeStr))
i = i + intStep
Loop

'###########################################################################
#########################

ts.Close 'Luk outputfil

'Check: Blev filen oprettet og har den samme størrelse?
Set f = fs.GetFile(strFileSpec)
If f.Size <> intFileTotalBytes Then
response.write f.size
FileUpload = 7
Exit Function
End If

'* Returner OK
FileUpload = 0
End If
End Function

'* Funktion der oversætter en bstr binær streng til en almindelig streng
'* Pas på med 00 værdier, da de fungerer som EOF i en almindelig streng
Function bin2str(bstrBinary)
Dim i
For i = 1 To LenB(bstrBinary)
bin2str = bin2str & Chr(AscB(MidB(bstrBinary, i, 1)))
Next
End Function

'-------------------- Slut: fileupload.inc --------------------
%>




 
 
Jens Gyldenkærne Cla~ (20-06-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 20-06-03 11:49

Webmaster - Landsbyen, Nibe skrev:

> "Der opstod en Microsoft VBScript-kørselsfejl fejl '800a01c2'
> Antallet af argumenter er forkert eller egenskabstildelingen
> er ugyldig: 'FileUpload'
> /natur/upload/upload2.asp, linje 51"

Koden omkring linje 51 er interessant - resten er ikke.

> Jeg har kopieret både min side og scriptet ind, herunder.

Det er ikke en god ide. Nyhedsklienter er ikke gode til at læse
store kodemængder i - specielt ikke når linjerne også bliver
ombrudt. Nøjes med at sende de linjer der fejler med. Brug gerne
response.write til at skrive debug-værdier ud på siden.

Prøv at læse følgende artikel fra denne gruppes OSS (Ofte Stillede
Spørgsmåls / FAQ): <http://asp-faq.dk/article/?id=41>
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jon Klose Larsen (20-06-2003)
Kommentar
Fra : Jon Klose Larsen


Dato : 20-06-03 13:55


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns93A0826101D36jcdmfdk@gyrosmod.cybercity.dk...
> Webmaster - Landsbyen, Nibe skrev:
>
> > "Der opstod en Microsoft VBScript-kørselsfejl fejl '800a01c2'
> > Antallet af argumenter er forkert eller egenskabstildelingen
> > er ugyldig: 'FileUpload'
> > /natur/upload/upload2.asp, linje 51"
>
> Koden omkring linje 51 er interessant - resten er ikke.

Nu er det jo sådan, at jeg ikke lige kan se hvilken som er linie 51, når
først scriptet er blevet includeret... men jeg kan da komme med et
kvalificeret gæt... og så skulle dette her være linie 51...

Function FileUpload(strPath, intMaxSize, arrAcceptType, arrAcceptExt, ByRef
strContentType, ByRef strFilename, ByRef intFileTotalBytes, ByRef
strNewFilename)

Det som står lige før og efter har ingen mulighed for at fejle, da det er
kommentarer og defineringer af variabler til senere brug.

Derfor sendte jeg hele koden med.

>
> > Jeg har kopieret både min side og scriptet ind, herunder.
>
> Det er ikke en god ide. Nyhedsklienter er ikke gode til at læse
> store kodemængder i - specielt ikke når linjerne også bliver
> ombrudt. Nøjes med at sende de linjer der fejler med. Brug gerne
> response.write til at skrive debug-værdier ud på siden.

Jeg har prøvet at skrive debug-værdier ud, men intet gav nogen "hints" til
hvad der kunne være galt.

Hvis jeg skulle komme med et gæt, så er fejlen at jeg ikke kan overføre
værdierne uden at bruge Form Post metoden, men så meget forstand har jeg
heller ikke på det.... derfor sendte jeg hele koden med, så en anden måske
kunne kigge på det.


>
> Prøv at læse følgende artikel fra denne gruppes OSS (Ofte Stillede
> Spørgsmåls / FAQ): <http://asp-faq.dk/article/?id=41>

Har læst og forstået, men bare ikke brugbar i denne situation (se mine svar
ovenfor)

Hilsen
Jon



Jens Gyldenkærne Cla~ (20-06-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 20-06-03 14:54

Jon Klose Larsen skrev:

>> Koden omkring linje 51 er interessant - resten er ikke.
>
> Nu er det jo sådan, at jeg ikke lige kan se hvilken som er
> linie 51, når først scriptet er blevet includeret...

Hvis du ikke kan, hvordan skal vi så kunne?

Så vidt jeg husker, fortæller asp-parseren i øvrigt hvilken fil den
finder fejl i - også selvom det er en includefil. I alle tilfælde
kan du eksperimentere med at sætte ekstralinjer ind i dit script og
se om fejllinjenummeret flytter sig.

> kan da komme med et kvalificeret gæt... og så skulle dette her
> være linie 51...
>
> Function FileUpload(strPath, intMaxSize, arrAcceptType,
> arrAcceptExt, ByRef strContentType, ByRef strFilename, ByRef
> intFileTotalBytes, ByRef strNewFilename)

Jeg tror ikke det er den. Når der står "Antallet af argumenter er
forkert eller egenskabstildelingen er ugyldig" tyder det på at det
er et kald til funktionen FileUpload den er gal med - ikke selve
funktionsdefinitionen.


> Det som står lige før og efter har ingen mulighed for at
> fejle, da det er kommentarer og defineringer af variabler til
> senere brug.
>
> Derfor sendte jeg hele koden med.

Det forstår jeg ikke. Jeg kan godt forstå at man kan være i tvivl
om hvor man skal finde fejlen i en kode. Men det er stadig en
dårlig ide at sende en hel side som et newsindlæg.


> Jeg har prøvet at skrive debug-værdier ud, men intet gav nogen
> "hints" til hvad der kunne være galt.

Hvad og hvor har du skrevet ud? Hvis din side skal komme til at
virke er der flere skridt at tage. Først og fremmest skal man få
siden til at validere som asp (siden skal kunne vises uden en asp-
fejl). Når man er nået så langt, kan man begynde at undersøge om
siden så fungerer som den skal.

> Hvis jeg skulle komme med et gæt, så er fejlen at jeg ikke kan
> overføre værdierne uden at bruge Form Post metoden, men så
> meget forstand har jeg heller ikke på det.... derfor sendte
> jeg hele koden med, så en anden måske kunne kigge på det.

Det kan sagtens tænkes at du har ret i at der er problemer med
Form.Post. Men det ændrer ikke ved at du kan bruge almindelig
fejlfinding - find frem til den linje der fejler, og undersøg
hvorfor (udskriv evt. variabelindhold) - også i dette tilfælde.

*Hvis* en anden skulle kigge på hele din kode, skulle vedkommende
for det første selv reparere ombrydningen af linjerne. Dernæst skal
man sætte koden ind på sin egen server - og i den forbindelse være
sikker på at den ikke indeholder kode der kan skabe problemer for
eksisterende applikationer på serveren. Det kan selvfølgelig godt
lade sig gøre - men jeg tror ikke du finder ret mange herinde der
er villige til at gøre den slags. Der er for mange
usikkerhedsfaktorer - i nogle situationer kan problemet skyldes en
opsætningsfejl på serveren, og så er man jo lige vidt når man kan
konstatere at koden virker på en anden server.

>> <http://asp-faq.dk/article/?id=41>
>
> Har læst og forstået, men bare ikke brugbar i denne situation
> (se mine svar ovenfor)

Artiklen er i høj grad brugbar - også i dit tilfælde.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408935
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste