webForumDet fria alternativet

FSO Mappstorlek

ASP

20 svar · 677 visningar · startad av Melea

Medlem sedan juli 20033 147 inlägg
Frågan#1

Hejsan! :)

1.

Ännu en fråga om FSO...

Jag hittade ett script här på wF som listar alla subdirs i en katalog och visar hur stora de är...

Nu vill jag göra så storleken endast visas på den mappen jag är i.
Så här ser koden ut i nuläget:

<%
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:\Inetpub\wwwroot\Creative\files\")
Set subFolders = folder.SubFolders
count = 1
Response.ContentType = "text/xml"
Response.Write "<?xml version=""1.0""?>" & Vbcrlf
Response.Write "<system>" & Vbcrlf
For Each folderObject in SubFolders
	Call Skriv(folderObject.Name, folderObject.Size)
	count = count + 1
Next
Response.Write "</system>" & Vbcrlf

Sub Skriv(namn, size)
	Response.Write "<webbplats id=""" & count & """>" & Vbcrlf & "<katalog>" & namn & "</katalog>" _
	& Vbcrlf & "<sizemb>" & CInt(size / 1024) & "</sizemb>" & Vbcrlf & "</webbplats>" & Vbcrlf
End Sub

Set subFolders = Nothing
Set folder = Nothing
Set fso = Nothing
%>

2.

Går det och begränsa storleken på en mapp så användaren enbart kan lägga upp 2 mb? Och isåfall hur?

MVH

Medlem sedan mars 20015 287 inlägg
#2

1.

<%
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:\Inetpub\wwwroot\Creative\files\")

count = 1
Response.ContentType = "text/xml"
Response.Write "<?xml version=""1.0""?>" & Vbcrlf
Response.Write "<system>" & Vbcrlf

	Call Skriv(folder.Name, folder.Size)

Response.Write "</system>" & Vbcrlf

Sub Skriv(namn, size)
	Response.Write "<webbplats id=""" & count & """>" & Vbcrlf & "<katalog>" & namn & "</katalog>" _
	& Vbcrlf & "<sizemb>" & CInt(size / 1024) & "</sizemb>" & Vbcrlf & "</webbplats>" & Vbcrlf
End Sub

Set folder = Nothing
Set fso = Nothing
%>
Medlem sedan nov. 20017 144 inlägg
#3

Har inte en aning hur man gör det med xml, men någon slags enkel if-sats borde ju göra susen.

Medlem sedan juli 20033 147 inlägg
#4

Solbulle, jag får detta felmeddelande:

Det går inte att visa XML-sidan 
Det går inte att visa XML-indata med formatmallen XSL. 
Korrigera felet och klicka sedan på knappen Uppdatera eller försök igen senare. 

--------------------------------------------------------------------------------

Sluttaggen head matchar inte starttaggen link. 
Det gick inte att behandla resursen 
[url]http://localhost/creative/counter-strike/admin.asp?login=yes&show=files&editID=1.[/url]
Rad 13, Position 3 
 

</head>
--^

Aldrig sett ngt liknande innan, vad kan felet vara?
*Redigerat
Om jag klickar på länken utan att ha räknaren i dokumentet funkar det och sen när jag klistrar in räknaren och sedan uppdaterar funkar det också, men det strular när jag trycker på länken till dokumentet, när jag har koden i dokumentet...

Jesper T: joa, du fick mig på rätt väg, ska se vad jag kan göra åt det nu, tack! :)

3.
En fråga till... hur gör jag If satsen? jag har försökt med

If ScriptObject.GetFile(Server.MapPath(MyFile)).size > "2000" then
Session("fel") = "Du har bara 2 mb att använda till filer"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID & " "
End If

men det funkar inge vidare, förslag?

MVH

Medlem sedan mars 20015 287 inlägg
#5

3.

If ScriptObject.GetFile(Server.MapPath(MyFile)).size > 2000 then

borde väl fungera.

Angående det andra, hur ser hela koden ut nu?

Medlem sedan juli 20033 147 inlägg
#6

som du skrev innan:

<%
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:\Inetpub\wwwroot\Creative\files\")

count = 1
Response.ContentType = "text/xml"
Response.Write "<?xml version=""1.0""?>" & Vbcrlf
Response.Write "<system>" & Vbcrlf

	Call Skriv(folder.Name, folder.Size)

Response.Write "</system>" & Vbcrlf

Sub Skriv(namn, size)
	Response.Write "<webbplats id=""" & count & """>" & Vbcrlf & "<katalog>" & namn & "</katalog>" _
	& Vbcrlf & "<sizemb>" & CInt(size / 1024) & "</sizemb>" & Vbcrlf & "</webbplats>" & Vbcrlf
End Sub

Set folder = Nothing
Set fso = Nothing
%>

3.
får felmeddelandet:

Feltyp:
Körningsfel i Microsoft VBScript (0x800A000D)
Inkompatibla typer: 'Server.MapPath'

MVH

Medlem sedan mars 20015 287 inlägg
#7

Nu är jag inte riktigt med igen...

Vi börjar från slutet med 3:an.

Jag antar att det beror på att din variabel Myfile inte innehåller något, eller innehåller ett felaktig värde, namn.
Kör du det där i typ denna funktion/sub http://www.webforum.nu/showthread.php?s=&postid=686736#post686736 eller?

PS.
Nu när jag kikar närmare på just den funktionen ser jag att just Myfile är ett väldigt dumt variabelnamn där, eftersom du använder det till annat i ditt skript.
( Function getFileSize(MyFile) )

Det andra felet du undrar över verkar vara någon sorts xml-fel som jag inte har den blekaste aning om vad det kan vara.
Den kod som asp-skriptet genererar, ser den ok ut?

Du skriver:

Om jag klickar på länken utan att ha räknaren i dokumentet funkar det och sen när jag klistrar in räknaren och sedan uppdaterar funkar det också, men det strular när jag trycker på länken till dokumentet, när jag har koden i dokumentet...

Det tolkar jag som om att det finns mer kod i den sidan, är det inte där du får något fel då?
Använder du sessions eller querystrings som du plockar ner på den sidan?

Medlem sedan juli 20033 147 inlägg
#8

Så här ser koden ut med MyFile variablen etc.

<%
Response.Expires=0
Response.Buffer = TRUE
Response.Clear
'Response.BinaryWrite(Request.BinaryRead(Request.TotalBytes))
byteCount = Request.TotalBytes
'Response.BinaryWrite(Request.BinaryRead(varByteCount))

RequestBin = Request.BinaryRead(byteCount)
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")

BuildUploadRequest RequestBin

editID =  UploadRequest.Item("editID").Item("Value")
username =  UploadRequest.Item("username").Item("Value")
datum =  Now()

contentType = UploadRequest.Item("filename").Item("ContentType")
filepathname = UploadRequest.Item("filename").Item("FileName")
filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
value = UploadRequest.Item("filename").Item("Value")

'Create FileSytemObject Component

If Session("access") = "2" then
If byteCount=>500000 THEN
Session("fel") = "Den måste vara mindre än 500kb!"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID & " "
End If
End If

dim filesys, newfolder, newfolderpath
newfolderpath = Server.MapPath("../../files/") & "\" & Session("username") 
set filesys=CreateObject("Scripting.FileSystemObject") 
If  Not filesys.FolderExists(newfolderpath) Then
   Set newfolder = filesys.CreateFolder(newfolderpath) 
End If

Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")

'Create and Write to a File
pathEnd = Len(Server.mappath(Request.ServerVariables("PATH_INFO")))-14
' Set MyFile = ScriptObject.CreateTextFile(Left(Server.mappath(Request.ServerVariables("PATH_INFO")),pathEnd)&filename)
Set MyFile = ScriptObject.CreateTextFile(Server.mappath("/Creative/files/" & Session("username") & "/" & filename))

If ScriptObject.GetFile(Server.MapPath(MyFile)).size > "2000" then
Session("fel") = "Du har bara 2 mb att använda till filer"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID & " "
End If

For i = 1 to LenB(value)
MyFile.Write chr(AscB(MidB(value,i,1)))
Next

Function getFileSize(MyFile)
Set fil = ScriptObject.GetFile(Server.MapPath(MyFile))
storlek = fil.size
getFileSize = round((storlek / 1024),2)
Set fil = Nothing
End Function

storlek = getFileSize("/Creative/files/" & Session("username") & "/" & filename)

	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "Driver={MySQL ODBC 3.51 Driver};server="&strserver&";uid="&struser&";pwd="&strpass&";database="&strdb&"" 

	sql = "insert into files (filename, username, datum, storlek) values ('" & filename & "', '" & username & "','" & datum & "','" & storlek & "')"
	Connect.Execute(sql),,128

	Connect.Close : Set objConnect = Nothing

MyFile.Close

Ska det spela någon roll om man använder variablen MyFile i två olika "script" i koden?

Sen angående det andra så funkar koden utmärkt utan själva räknaren. Just den här delen (ifsatsen) av dokumentet öppnas upp med querystring medans en del (ifsats) längre ner i dokumentet öppnas upp med where username = '" & lcase(Session("username")) & "'

Som sagt, koden funkar utmärkt när jag inte använder

<%
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:\Inetpub\wwwroot\Creative\files\")

count = 1
Response.ContentType = "text/xml"
Response.Write "<?xml version=""1.0""?>" & Vbcrlf
Response.Write "<system>" & Vbcrlf

	Call Skriv(folder.Name, folder.Size)

Response.Write "</system>" & Vbcrlf

Sub Skriv(namn, size)
	Response.Write "<webbplats id=""" & count & """>" & Vbcrlf & "<katalog>" & namn & "</katalog>" _
	& Vbcrlf & "<sizemb>" & CInt(size / 1024) & "</sizemb>" & Vbcrlf & "</webbplats>" & Vbcrlf
End Sub

Set folder = Nothing
Set fso = Nothing
%>

Den funkar också när jag bara klistrar in koden direkt när jag redan är på sidan! Och sedan uppdaterar... Det är när jag trycker på länken till sidan som jag får XML felet...

MVH

Medlem sedan maj 20012 812 inlägg
#9

Du kan inte begärnsa användares möjlighet att lägga upp Max 2 MB så som du tänkt dig.

Du kanske kan (beroende på hur man laddar upp filerna) göra så att man inte kan ladda upp fler filer om du har mer än 2 MB i mappen.

Men om mappen är tom och jag får ladda upp, så kan jag ju ladda upp en fil som är på 100 MB och när du sedan kollar hur stor mappen är, så är den större än 2 MB så jag får inte ladda upp mer, men innehållet är större än 2 MB.

För att begränsa så att man endast kan ha 2 MB MAX måste du använda något Quota system, Win2000/Win2003 har detta inbyggt så man kan sätta det så att en viss användare endast får ha 2 MB filer på servern (eller om det var per folder).

- M

Medlem sedan mars 20015 287 inlägg
#10

Han kan visst begränsa ungefär så som han har tänkt sig.
Han kan antingen kolla hur mycket utrymme allt tar efter uppladdningen och radera den nyss uppladdade filen, eller smartare, kolla först hur mycket som är lagrat och kolla om det plus storleken på den fil som just laddas upp håller sig under 2mb.
Han har ju även en spärr som gör att man ej kan ladda upp filer större än 500kb.

Angående variabeln Myfile, visst går det väl att använda samma namn, men det är ju som upplagt för förväxlingar.
I ditt fall har det blivit lite tokigt när du försöker kolla totala mappstorleken, det är inte objektet MyFile du ska använda dig av. Du ska använda sökvägen till den mapp som ska storlekskollas.

Testa detta:

If ScriptObject.GetFile(Server.MapPath(newfolderpath)).size > 2000 then
Session("fel") = "Du har bara 2 mb att använda till filer"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID
End If
Medlem sedan maj 20012 812 inlägg
#11

Missade spärren på 500 Kb. :(

- M

Medlem sedan juli 20033 147 inlägg
#12

Solbulle, tack för ditt tålamod men nu får jag det här felmeddelandet:

Feltyp:
Server.MapPath(), ASP 0172 (0x80004005)
Parametern Path för metoden MapPath måste vara en virtuell sökväg. En fysisk sökväg har använts.

MVH

Medlem sedan nov. 20017 144 inlägg
#13

server.mappath("../din_mapp/")
är en virituell sökväg, kontrollera vad variabeln "newfolderpath" innehåller.

Medlem sedan mars 20015 287 inlägg
#14

Aj, man lever inte som man lär direkt...
Så här skulle det ju vara... tror jag...

If ScriptObject.GetFile(newfolderpath).size > 2000 then
Session("fel") = "Du har bara 2 mb att använda till filer"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID
End If

"Vi" har ju redan gjort server.mappath och fått fram sökvägen i just variabeln newfolderpath, det var därför jag tänkte att vi skulle utnyttja den igen.
Men då behöver vi ju givetvis inte, som Jesper T påpekar, använda oss av server.mappath igen.

Medlem sedan juli 20033 147 inlägg
#15

Jag bytte ut lite saker i koden.
"Vi" hade inte gjort så 2000 var / 1024 så jag multiplicerade 2000 med 1024 och fick ut 2048000, så jag bytte ut 2000 mot det talet.

Nu ser koden ut såhär:

If ScriptObject.GetFile(Server.MapPath("../../files/") & "\" & Session("username")).size > "2048000" then
Session("fel") = "Du har bara 2 mb att använda till filer"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID
End If

Men nu får jag felmeddelandet:

Feltyp:
Körningsfel i Microsoft VBScript (0x800A0035)
Det går inte att hitta filen.

Medlem sedan nov. 20014 054 inlägg
#16

Kolla först hur stor mappen är innan du låter dem göra en uppladdning, eftersom du kan läsa ut hur stor deras mapp är, så kolla först storleken på den fil som laddas upp.

Och om den aktuella mappens storlek plus den nya filens storlek överstiger 1024*2000 bytes så radera filen, eller stoppa uppladdningen.

Medlem sedan juli 20033 147 inlägg
#17

Har du några tips eller ideér på hur jag ska kolla hur stor mappen är? Är ganska kass på asp än sålänge men jag lär mig :)

Solbulle: jag bytte ut koden mot:

If Server.MapPath("../../files/") & "\" & Session("username").size > "2048000" then
Session("fel") = "Du har bara 2 mb att använda till filer"
Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID
End If

eftersom det inte är ngn fil "vi" anropar men då står det:

Feltyp:
Körningsfel i Microsoft VBScript (0x800A01A8)
Objekt krävs.: 'Session(...)'

Medlem sedan mars 20015 287 inlägg
#18

Stuvade om lite...

'först lite formulärhämtning o grejer..

Set MyFile = ScriptObject.CreateTextFile(newfolderpath & "/" & filename)

mappstorlek = getFolderSize(newfolderpath)

For i = 1 to LenB(value)
MyFile.Write chr(AscB(MidB(value,i,1)))
Next

MyFile.Close

storlek = getFileSize(newfolderpath & "\" & filename)

If mappstorlek + storlek > 2000 then
	Session("fel") = "Du har bara 2 mb att använda till filer, du har nu " & mappstorlek & "kb uppladdat."
	'Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID
	response.write "Du har bara 2 mb att använda till filer, du har nu " & mappstorlek & "kb uppladdat."

	deleteFile(newfolderpath & "\" & filename)
End If

	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "Driver={MySQL ODBC 3.51 Driver};server="&strserver&";uid="&struser&";pwd="&strpass&";database="&strdb&"" 

	sql = "insert into files (filename, username, datum, storlek) values ('" & filename & "', '" & username & "','" & datum & "','" & storlek & "')"
	Connect.Execute(sql),,128

	Connect.Close : Set objConnect = Nothing

Function getFolderSize(strfolder) 
Set folder = ScriptObject.GetFolder(strfolder)
storlek = folder.size
getFolderSize = round((storlek / 1024),2)
Set folder = Nothing
End Function

Function getFileSize(strfilen)
Set fil = ScriptObject.GetFile(strfilen)
storlek = fil.size
getFileSize = round((storlek / 1024),2)
Set fil = Nothing
End Function

Function deleteFile(strfilen)
Set fileObject = ScriptObject.GetFile(strfilen)
fileObject.Delete
Set fileObject = Nothing
End Function

'resterande subbar med själva uppladdningsprylarna.
Medlem sedan juli 20033 147 inlägg
#19

Man tackar! Det funkar perfekt, ska bara fixa en funktion som tar bort det ur databasen också...

Just nu tas filen bort men datan lagras i databasen...
Det borde väl inte vara så svårt?

Bara o lägga till:

sql = " delete from files where id = " & editID & " "
Connect.Execute(SQL)

efter den sista raden i din kod ovan?

*Redigerat
Det funkar inte, var ska jag lägga koden? :D

MVH

Medlem sedan mars 20015 287 inlägg
#20

Hupp, det tänkte jag inte på, lägg till inläggandet i if-satsen så.

If mappstorlek + storlek > 2000 then
	Session("fel") = "Du har bara 2 mb att använda till filer, du har nu " & mappstorlek & "kb uppladdat."
	'Response.Redirect "../admin.asp?login=yes&show=files&editID=" & editID
	response.write "Du har bara 2 mb att använda till filer, du har nu " & mappstorlek & "kb uppladdat."

	deleteFile(newfolderpath & "\" & filename)
Else

	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "Driver={MySQL ODBC 3.51 Driver};server="&strserver&";uid="&struser&";pwd="&strpass&";database="&strdb&"" 

	sql = "insert into files (filename, username, datum, storlek) values ('" & filename & "', '" & username & "','" & datum & "','" & storlek & "')"
	Connect.Execute(sql),,128

	Connect.Close : Set objConnect = Nothing

End If
270 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)