webForumDet fria alternativet

Filuppladdning misslyckas

ASP

5 svar · 240 visningar · startad av Oputres

Medlem sedan feb. 2004333 inlägg
Frågan#1

Allå!

Nu är jag inne på ett område jag inte behärskar så bra, nämligen filuppladdning och i det här fallet av bilder. Jag har hittat ett skript som jag håller på att anpassa efter mina behov men får följande felmeddelande när jag försöker ladda upp en .jpg-bild:

Objekt krävs.: ''
/public_html/medlemssidor/administration.asp, line 797

Rad 797 ser ut så här:

For i = 1 to LenB(fcontent)
[B]File.Write chr(AscB(MidB(fcontent, i, 1)))[/B]
Next

Så här ser hela faderullan ut. Notera att den inte är klar och jag vet inte exakt vad alla delar gör men principen är att man laddar upp en fil, funktionen kontrollerar att inte filen redan finns och laddar därefter upp den. Sedan skickas man till skicka.asp där man får skriva en beskrivning av filen i en databas.

Vårsågoda:

...
ElseIf Request.QueryString("Do") = "Add" Then
  Select Case(Request.QueryString("What"))

  Case "Bilder"

Dim UPLOAD_PATH, Fso, Folder, Upload, fcontent, allowlist, extension, i, file
UPLOAD_PATH	= Server.MapPath("bildarkiv")
Set Fso		= Server.CreateObject("Scripting.FileSystemObject")
Set Folder	= Fso.getFolder(UPLOAD_PATH)

'Denna rad behövs nog inte eftersom jag använder ElseIf Request.QueryString ovan för att läsa anropet.
'If (Request.ServerVariables("REQUEST_METHOD") = "POST") Then

  Set Upload	= get_upload_files()
  fcontent	= Upload("upload").Item("content")

  allowlist = ".gif,.GIF,.jpg,.JPG,.jpeg,.JPEG,.bmp,.BMP"
  extension = right(extract_filename(Upload("upload").Item("filename")),4)
  If Fso.FileExists(UPLOAD_PATH & "\" & extract_filename(Upload("upload").Item("filename"))) Then
    Response.Write "En fil med det namnet finns redan! Döp om filen du vill ladda upp och prova igen"
    Response.Write "<b><a href='JavaScript:history.go(-1);'>Tillbaka</a></b>"
  Else
    If instr(allowlist,extension) then
      Set File	= Fso.CreateTextFile(UPLOAD_PATH & "\" & extract_filename(Upload("upload").Item("filename")))
    Else
      Response.Write "Filen är i felaktigt format. Endast " & allowlist & " är godkända."
      Response.Write "<b><a href='JavaScript:history.go(-1);'>Tillbaka</a></b>"
    End If
  End If

For i = 1 to LenB(fcontent)
File.Write chr(AscB(MidB(fcontent, i, 1)))
Next
File.Close: Set File = Nothing
Session("fil") = extract_filename(Upload("upload").Item("filename"))
Session("visa") = "ok"
'################################################################################## LÄGG IN SKICKA.ASP MED IF-SATS ISTÄLLET
Response.Redirect "skicka.asp"
'################################################################################## LÄGG IN SKICKA.ASP MED IF-SATS ISTÄLLET
'End If

Function get_upload_files()
Dim upload_object, request_binaries, position_start, position_end, boundary, boundary_pos, name, pos_file

Set upload_object	= Server.CreateObject("Scripting.Dictionary")
request_binaries	= Request.BinaryRead(Request.TotalBytes)
position_start		= 1
position_end		= InstrB(position_start, request_binaries, get_byte_string(chr(13)))
boundary		= MidB(request_binaries, position_start, (position_end - position_start))
boundary_pos		= InstrB(1, request_binaries, boundary)

Do Until (boundary_pos = InstrB(request_binaries, boundary & get_byte_string("--")))
If Not(Response.IsClientConnected) Then Response.End
  position_start	= (InstrB(InstrB(boundary_pos, request_binaries, get_byte_string("Content-Disposition")), request_binaries, get_byte_string("name=")) + 6)
  position_end		= InstrB(position_start, request_binaries, get_byte_string(chr(34)))

  name			= get_string(MidB(request_binaries, position_start, (position_end - position_start)))
  pos_file		= InstrB(boundary_pos, request_binaries, get_byte_string("filename="))

  If  ((pos_file <> 0) AND (pos_file < InstrB(position_end, request_binaries, boundary))) Then
    upload_object.Add name, Server.CreateObject("Scripting.Dictionary")
    position_start	= (pos_file + 10)
    position_end	= InstrB(position_start, request_binaries, get_byte_string(chr(34)))
    upload_object.item(name).Add "filename", get_string(MidB(request_binaries, position_start, (position_end - position_start)))

    position_start	= (InstrB(position_end, request_binaries, get_byte_string("Content-Type:")) + 14)
    position_end	= InstrB(position_start, request_binaries, get_byte_string(chr(13)))
    upload_object.item(name).Add "content-type", get_string(MidB(request_binaries, position_start, (position_end - position_start)))

    position_start	= (position_end + 4)
    position_end	= InstrB(position_start, request_binaries, boundary) - 2
    upload_object.item(name).Add "size", ((position_end - position_start))
    upload_object.item(name).Add "content", MidB(request_binaries, position_start, (position_end - position_start))
  End If
boundary_pos	= InstrB(boundary_pos + LenB(boundary), request_binaries, boundary)
Loop

Set get_upload_files = upload_object
End Function

Function get_byte_string(str)
Dim cnt
For cnt = 1 to Len(str)
get_byte_string	= get_byte_string & chrB(AscB(Mid(str, cnt, 1)))
Next
End Function

Function get_string(str)
Dim cnt
For cnt = 1 to LenB(str)
get_string = get_string & chr(AscB(MidB(str, cnt, 1))) 
Next
End Function

Function extract_filename(filename)
extract_filename = Right(filename, Len(filename) - InStrRev(filename, "\", -1, 1))
End Function

  End Select

Else
'-------------------------------------- VISA BILDFORMULÄR
%>

<font size="3"><b>Lägg till bild:</b></font><br>
<img src="bilder/main_rule_admin.jpg" width="590"><br>
<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td bgcolor="#FFFFCC">
<font size="1">Nedan kan en bild med något av formatet gif, jpg, jpeg, eller bmp laddas upp. Efter uppladdning skett
kan beskrivning skrivas till bilden.</font>
</td></tr></table><br>

<script language="JavaScript">
<!-- 
function blured()
{
for (a in document.links) document.links[a].onfocus = document.links[a].blur;
}
if (document.all)
{
document.onmousedown = blured;
}
// -->
</script>

<form name="frmUpload" method="post" enctype="multipart/form-data" action="administration.asp?AnvId=<% =AnvId %>&Sida=Bilder&Do=Add&What=Bilder">
  <input type="file" name="upload" size="35">&nbsp;<input type="submit" value="Ladda upp">
  <%If Session("mess") <> "" Then%>
    <%=Session("mess")%><%Session("mess") = ""%>
  <%End If%>
</form>
...
Medlem sedan juni 200032 967 inlägg
#2

Då verkar det som att objektet File inte är skapat.
Lägg till lite testutskrifter för att försöka ta reda på varför.

Medlem sedan feb. 2004333 inlägg
#3

Nu hittade varför det inte fungerade, filen fanns redan uppladdad, så uppladdningen fungerar alltså. Första gången får jag bara felmeddelandet om att den inte hittar skicka.asp vilken inte heller finns tillgänglig ännu, uppladdningen har alltså gått igenom.

Därför måste det brista i kontrollen om det redan finns en fil i mappen. Jag provade också ladda upp en .zip-fil, vilken inte skall godkännas av den här snutten:

  allowlist = ".gif,.GIF,.jpg,.JPG,.jpeg,.JPEG,.bmp,.BMP"
  extension = right(extract_filename(Upload("upload").Item("filename")),4)
  If Fso.FileExists(UPLOAD_PATH & "\" & extract_filename(Upload("upload").Item("filename"))) Then
    Response.Write "En fil med det namnet finns redan! Döp om filen du vill ladda upp och prova igen"
    Response.Write "<b><a href='java script:history.go(-1);'>Tillbaka</a></b>"
  Else
    If instr(allowlist,extension) then
      Set File	= Fso.CreateTextFile(UPLOAD_PATH & "\" & extract_filename(Upload("upload").Item("filename")))
    Else
      Response.Write "Filen är i felaktigt format. Endast " & allowlist & " är godkända."
      Response.Write "<b><a href='java script:history.go(-1);'>Tillbaka</a></b>"
    End If
  End If

Några tips på varför kontrollen inte fungerar? Kan det ha att göra med att jag slopat:

'If (Request.ServerVariables("REQUEST_METHOD") = "POST") Then
Medlem sedan dec. 19996 721 inlägg
#4

Liten upprensning. Otestad, men kan kanske hjälpa

allowlist = "gif,jpg,jpeg,bmp"
filename = extract_filename(Upload("upload").Item("filename"))
extension = Fso.GetExtensionName(filename)
If Fso.FileExists(UPLOAD_PATH & "\" & filename) Then
   Response.Write "En fil med det namnet finns redan! Döp om filen du vill ladda upp och prova igen"
   Response.Write "<b><a href='java script:history.go(-1);'>Tillbaka</a></b>"
Else
   If instr("," & allowlist & ",","," & extension & ",")>0 then
      Set File	= Fso.CreateTextFile(UPLOAD_PATH & "\" & filename)
   Else
      Response.Write "Filen är i felaktigt format. Endast " & allowlist & " är godkända."
      Response.Write "<b><a href='java script:history.go(-1);'>Tillbaka</a></b>"
   End If
End If
Medlem sedan feb. 2004333 inlägg
#5

Jag tror jag löser det! Felet består i fetmarkerade områden. Jag ändrade dessa till en Response.Redirect så att man försvinner innan resten av koden körs.

If Fso.FileExists(UPLOAD_PATH & "\" & filename) Then
   [B]Response.Write "En fil med det namnet finns redan! Döp om filen du vill ladda upp och prova igen"[/B]
   [B]Response.Write "<b><a href='java script:history.go(-1);'>Tillbaka</a></b>"[/B]
Else
   If instr("," & allowlist & ",","," & extension & ",")>0 then
      Set File	= Fso.CreateTextFile(UPLOAD_PATH & "\" & filename)
   Else
      [B]Response.Write "Filen är i felaktigt format. Endast " & allowlist & " är godkända."[/B]
      [B]Response.Write "<b><a href='java script:history.go(-1);'>Tillbaka</a></b>"[/B]
   End If
End If

Obs, koden är från Emission ovan.

På återseende, för så lär det bli senare ;)

Medlem sedan dec. 19996 721 inlägg
#6

Gött. Btw, du bör lägga till en lite lcase, så att skiftläget på filslutet inte spelar någon roll

extension = lcase(Fso.GetExtensionName(filename))

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)