Hej hej.
Jag har fått problem med ett skript som modifierar bilder. När jag har ett par hundra bilder i katalogen så får jag ett timeoutfel på skriptet.
Antar att det finns sätt att komma runt detta som tex en bättre design på lösningen. Ideer mottages tackasamt.
<% ' LOOPAR ALLA FILER I VALD KATALOG
filepath = server.mappath(varFolderPath)
set fso = server.createobject("scripting.filesystemobject")
Set folder = fso.GetFolder(filepath)
Set folderCollection = folder.SubFolders
varBildCount = 1
for each file in folder.files %>
<% ' HANTERAR ORGINALFILERNA
varFileName = lcase(file.name)
' LETAR EFTER FILER SOM INTE ÄR MODIFIERADE
if inStr(varFileName,"_org.") = 0 AND inStr(varFileName,"_sma.") = 0 AND inStr(varFileName,"_med.") = 0 then%>
<hr><font face=verdana size=5>Hanterar bild <%=varBildCount%></font><p>
<% 'SKAPAR NYA TUMBNAILS OM FILEN ÄR EN BILD
if inStr(varFileName,".gif") > 0 OR inStr(varFileName,".jpg") > 0 then
varBildCount = varBildCount +1
call subCreateThumbnails(varFileName)
end if%>
<% response.flush %>
<% end if %>
<% next %>
Subben som anropas ser ut så här...
<% sub subCreateThumbnails(varFileName)
'Här sparas filen
filepath = server.mappath(varFolderPath)
'response.write "<hr>" &filepath &"<hr>"
varFileNameAndPath = filepath &"/" &varFileName%>
<p>1) Hämtar bild för hantering från servens hårddisk: <b><%=varFileName%></b><br>
Filstorleken är: <b><%=file.size\1024%> kb</b> <p>
<% ' Create instance of AspJpeg
Set Jpeg = Server.CreateObject("Persits.Jpeg")
' Open source image
Jpeg.Open varFileNameAndPath
response.write " <p> 2) Nuvarande storlek (upplösning) är:<b> " &Jpeg.OriginalWidth &" x " & Jpeg.OriginalHeight &" pixlar</b><p>"
'Sätter nytt filnamn på orginalfilen
varFileExtension = fso.GetExtensionName(varFileNameAndPath) 'Hämtar längden på filändelsen
varCut = len(varFileExtension)
varTotalLen = len(varFileName)
varCut = varTotalLen - varCut
varNewFileName = left(varFileName,varCut-1)
varNewFileName = varNewFileName &"_org." &varFileExtension
varSaveThis = filepath &"/" &varNewFileName
Jpeg.Save varSaveThis
varFileNameOrginal = varNewFileName
response.write "<p>3) Kopierar filen och byter namn till: <b>" & varNewFileName &"</b> <p>"
'Skalar om orginalbilden om den är större än 300 punkter bred
varSkalaTillDennaBreddNum = 400 '=bredden på bilden.
if Jpeg.width > varSkalaTillDennaBreddNum then
' Räkna fram hur många procent som vi vill minska bilden med. Bredden ska vara fixerad.
varMellanSumman = Jpeg.OriginalWidth - varSkalaTillDennaBreddNum
varDecimalProcent = varMellanSumman / Jpeg.OriginalWidth
' räknar fram hur många pixlar %en motsvarar.
varTaBortBredd = varDecimalProcent * Jpeg.OriginalWidth
varTaBortHojd = varDecimalProcent * Jpeg.OriginalHeight
' Skalar om bilderna
Jpeg.Width = Jpeg.OriginalWidth - varTaBortBredd
Jpeg.Height = Jpeg.OriginalHeight - varTaBortHojd
if Jpeg.Height < 100 then
' Lägg till vitt
'response.write "<h1>LÄGG TILL</h1>"
elseif Jpeg.Height > 100 then
'response.write "<h1>CROP</h1>"
end if
'Sätter nytt filnamn
varFileExtension = fso.GetExtensionName(varFilePath &"\" &varFileName) 'Hämtar längden på filändelsen
varCut = len(varFileExtension)
varTotalLen = len(varFileName)
varCut = varTotalLen - varCut
varNewFileName = left(varFileName,varCut-1)
varNewFileName = varNewFileName &"_med." &varFileExtension
varSaveThis = filepath &"/" &varNewFileName
Jpeg.Save varSaveThis
varFileNameNormal = varNewFileName
end if
%>
<p>
4) Ändrar storleken (upplösning) till: <b><%=Jpeg.Width%></b> x <b><%=Jpeg.Height%> pixlar</b><p>
5) Sparar den omskalade bilden som: <b><%=varNewFileName%></b> <p>
<p>
<%
' SKAPA LITEN BILD
' Räkna fram hur många procent som vi vill minska bilden med. Bredden ska vara fixerad.
varSkalaTillDennaBreddNum = 100 '=bredden på bilden.
varMellanSumman = Jpeg.OriginalWidth - varSkalaTillDennaBreddNum '=bredden på bilden.
varDecimalProcent = varMellanSumman / Jpeg.OriginalWidth
' räknar fram hur många pixlar %en motsvarar.
varTaBortBredd = varDecimalProcent * Jpeg.OriginalWidth
varTaBortHojd = varDecimalProcent * Jpeg.OriginalHeight
' Skalar om bilderna
Jpeg.Width = Jpeg.OriginalWidth - varTaBortBredd
Jpeg.Height = Jpeg.OriginalHeight - varTaBortHojd
if Jpeg.Height < 100 then
' Lägg till vitt
'response.write "<h1>LÄGG TILL</h1>"
elseif Jpeg.Height > 100 then
'response.write "<h1>CROP</h1>"
end if
'Sätter nytt filnamn
varFileExtension = fso.GetExtensionName(varFilePath &"\" &varFileName) 'Hämtar längden på filändelsen
varCut = len(varFileExtension)
varTotalLen = len(varFileName)
varCut = varTotalLen - varCut
varNewFileName = left(varFileName,varCut-1)
varNewFileName = varNewFileName &"_sma." &varFileExtension
' create thumbnail and save it to disk
varSaveThis = filepath &"/" &varNewFileName
Jpeg.Save varSaveThis
varFileNameThumb = varNewFileName
%>
6) Ändrar storleken (upplösning) till: <b><%=Jpeg.Width%></b> x <b><%=Jpeg.Height%> pixlar</b><p>
7) Sparar den omskalade bilden som: <b><%=varNewFileName%></b> <p>
<% ' RADERAR ORGIANLBILDEN EFTER ATT NYA HAR SKAPATS
Set file = fso.GetFile(varFileNameAndPath)
file.delete %>
8) Raderar filen: <b><%=varFileName%></b><p>
<!--- Lägger till filerna i databasen --->
<p>
9) Sparar filnamnen i databasen med en insert <b><%=varFileNameOrginal%></b> , <b><%=varFileNameNormal%></b> , <b><%=varFileNameThumb%></b>
<p>
<%' KONTROLLERAR OM FILEN REDAN FINNS I DATABASEN
sql = "SELECT id FROM T_bild_register WHERE bild_path_orginal = '" &varFileNameOrginal &"' AND album_id =" &sTillAlbumId
set rs = connect.execute(sql)
if rs.eof then
'FILEN FINNS INTE I DATABASEN
'LÄGG TILL DEN
sql_question = "INSERT INTO T_bild_register (bild_path_orginal, bild_path_normal, bild_path_thumb, album_id) "
sql_question = sql_question &" VALUES "
sql_question = sql_question &"('" &varFileNameOrginal &"',"
sql_question = sql_question &"'" &varFileNameNormal &"',"
sql_question = sql_question &"'" &varFileNameThumb &"',"
sql_question = sql_question &"" &sTillAlbumId &")"
response.write "<p><b>DEBUG Insert databasen:</b> " &sql_question &"<p>"
connect.execute(sql_question)
else
response.write("<font color=red>ERROR: DETTA SKULLE INTE KUNNA INTRÄFFA. DATABASEN INNEHÅLLER REDAN DETTA FILNAMN. SE indexera_nya_bilder.asp</font>")
end if
%>
<% end sub %>
@ndersMedlem sedan juni 200032 969 inlägg Om du inte har något emot att vänta en liten stund kan du ju alltid sätta upp timeouten...
emissionMedlem sedan dec. 19996 721 inlägg LIte stökig kod, och vissa saker görs flera gånger i onödan (filnamnen t.ex.) men generellt såg det ut som om den gjorde rätt saker. Bildskalningen kanske helt enkelt tar för lång tid, och då får du ställa upp Server.ScriptTimeout
Ja att det är stökigt ska jag fixa... håller på med någon sorts grovskiss just nu.
Något som jag funderar över är varför inte <% response.flush %> skriver ut infromationen bild för bild. Som det är nu så tar det x antal sekunder (ganska många) sedan kommer allt, inklusive timeoutfelet.
Rad 1 = <% response.buffer = true %>
Trodde inte att det behövdes något mer ?!
Antar att man har följande syntax:
<%
response.buffer = true
Server.ScriptTimeout = 2000
%>
Vad är vanligt värde på server.scriptTimeout? Jag hittade ovan när jag sökte här på forumet.
@ndersMedlem sedan juni 200032 969 inlägg Jag har för mig att 120 (sekunder) är defaultvärdet på scripttimeouten, om det var det du undrade.
mvh
mattiasnordin skrev:
Ja att det är stökigt ska jag fixa... håller på med någon sorts grovskiss just nu.
Något som jag funderar över är varför inte <% response.flush %> skriver ut infromationen bild för bild. Som det är nu så tar det x antal sekunder (ganska många) sedan kommer allt, inklusive timeoutfelet.
Rad 1 = <% response.buffer = true %>
Trodde inte att det behövdes något mer ?!
...flush skickar ju kontinuerligt html till webläsaren, så egentligen skickar den ju inte bilden. Bilden hämtas ju ifrån webläsaren när denna bestämmer sig för att det är dags, och detta beror ju på hur du anropar bilden i htmlsidan.
Hmmm.... Tänkte att jag åter skulle se om jag kunde hitta en lösning på mitt problem med response.flush.
Som det är nu så visas resultatet först när allt är klart eller att jag har fått mitt timeoutfel. Jag skulle kunna leva med att sätta timeouten till jättehögt om jag bara fick någon feedback från skriptet att något händer.
Några ideer ?