In need of some help and I'm new to ASP. I can't use one of the uploaders on the market because the client can't install the needed stuff, and plus I have this mostly working.
I can upload seemingly just about any file, except a JPG. I only want to allow extensions of GIF, JPG, and JPEG, and I can't figure out for the life of me why this code hangs when uploading a JPG, but GIF is working fine.
This wasn't my original code, but I can't remember where I found it. I've changed it a bit, but like I said evthing but jpg works. I know its a lot to sift through, but based on my experience in other web technologies, I would assume its a lot easier than 500 points would sugguest.
Thanks for all your help
Please advise.
Code for the form (choosefile.asp):
<!--#include file="header.asp"-->
<form action="filePost.asp" enctype="multipart/form-da
ta" method="post" name="f" id="f">
Pick a file to upload:<br/>
<input type="file" name="test" size="50" />
<br />
<!---input type="radio" name="filename" value="original" checked />
Use filename from disk
<br />
<input type="radio" name="filename" value="userSpecified" />
Use the following name:
<input type="text" name="userSpecifiedName" value="" /--->
input type="hidden" name="userSpecifiedName">
<input type="hidden" name="filename" value="original">
<br/>
Link to: <br/>
<input type="text" name="linkto" size="50" value="
http://">
<input type="submit" value="Upload Ad" />
</form>
<!--#include file="footer.asp"-->
Code for the upload page (filepost.asp):
<!--#include file="header.asp"-->
<%
'Adjust this depending on the size of the files you'll
'be expecting; longer timeout for larger files!
Server.ScriptTimeout = 5400
Const ForWriting = 2
Const TristateTrue = -1
CrLf = Chr(13) & Chr(10)
'This function retreives a field's name
Function GetFieldName(infoStr)
sPos = InStr(infoStr, "name=")
EndPos = InStr(sPos + 6, infoStr, Chr(34) & ";")
If EndPos = 0 Then
EndPos = inStr(sPos + 6, infoStr, Chr(34))
End If
GetFieldName = Mid(infoStr, sPos + 6, endPos - _
(sPos + 6))
End Function
'This function retreives a file field's filename
Function GetFileName(infoStr)
sPos = InStr(infoStr, "filename=")
EndPos = InStr(infoStr, Chr(34) & CrLf)
GetFileName = Mid(infoStr, sPos + 10, EndPos - _
(sPos + 10))
End Function
'This function retreives a file field's MIME type
Function GetFileType(infoStr)
sPos = InStr(infoStr, "Content-Type: ")
GetFileType = Mid(infoStr, sPos + 14)
End Function
'Yank the file (and anything else) that was posted
PostData = ""
Dim biData
biData = Request.BinaryRead(Request
.TotalByte
s)
'Careful! It's binary! So, let's change it into
'something a bit more manageable.
For nIndex = 1 to LenB(biData)
PostData = PostData & Chr(AscB(MidB(biData,nInde
x,1)))
Next
'Having used BinaryRead, the Request.Form collection is
'no longer available to us. So, we have to parse the
'request variables ourselves!
'First, let's find that encoding type!
ContentType = Request.ServerVariables( _
"HTTP_CONTENT_TYPE")
ctArray = Split(ContentType, ";")
'File posts only work well when the encoding is
'"multipart/form-data", so let's check for that!
If Trim(ctArray(0)) = "multipart/form-data" Then
ErrMsg = ""
' grab the form boundary...
bArray = Split(Trim(ctArray(1)), "=")
Boundary = Trim(bArray(1))
'Now use that to split up all the variables!
FormData = Split(PostData, Boundary)
'Extract the information for each variable and its data
Dim myRequest, myRequestFiles(9, 3)
Set myRequest = CreateObject("Scripting.Di
ctionary")
FileCount = 0
For x = 0 to UBound(FormData)
'Two CrLfs mark the end of the information about
'this field; everything after that is the value
InfoEnd = InStr(FormData(x), CrLf & CrLf)
If InfoEnd > 0 Then
'Get info for this field, minus stuff at the end
varInfo = Mid(FormData(x), 3, InfoEnd - 3)
'Get value for this field, being sure to skip
'CrLf pairs at the start and the CrLf at the end
varValue = Mid(FormData(x), InfoEnd + 4, _
Len(FormData(x)) - InfoEnd - 7)
'Is this a file?
If (InStr(varInfo, "filename=") > 0) Then
'Place it into our files array
'(While this supports more than one file
'uploaded at a time we only consider the
'single file case in this example)
myRequestFiles(FileCount, 0) = GetFieldName( _
varInfo)
myRequestFiles(FileCount, 1) = varValue
myRequestFiles(FileCount, 2) = GetFileName( _
varInfo)
myRequestFiles(FileCount, 3) = GetFileType( _
varInfo)
FileCount = FileCount + 1
Else
'It's a regular field
myRequest.add GetFieldName(varInfo), varValue
End If
End If
Next
Else
ErrMsg = "Wrong encoding type!"
End If
'Save the actual posted file
'If supporting more than one file, turn this into a loop!
'Set lf = server.createObject("Scrip
ting.FileS
ystemObjec
t")
'file extension
sPos = InStrRev(myRequestFiles(0,
2), ".")
extension = mid(myRequestFiles(0, 2), sPos + 1)
if lcase(extension) = "jpg" or lcase(extension) = "gif" or lcase(extension) = "jpeg" then
Set cn = Server.CreateObject("ADODB
.Connectio
n")
Set rs = Server.CreateObject("ADODB
.Recordset
")
sql = "select max(id) from adverts "
cn.Open connectString
rs.Open sql, cn, 1
if isnumeric(rs.fields(0)) then
newFileNum=rs.fields(0)+1
else
newFileNum=1
end if
finalFileName="ad" & newFileNum & "." & extension
FilePath = "./images/ad" & newFileNum & "." & extension
response.Write("'" & filepath & "'")
rs.close
cn.close
'SavePath = Server.MapPath(FilePath)
'Set SaveFile = lf.CreateTextFile(SavePath
, True)
'SaveFile.Write(myRequestF
iles(0, 1))
'SaveFile.Close
'insert the ad
'Set objConn = Server.CreateObject("ADODB
.Connectio
n")
' -- Open the Connection
'objConn.Open connectString
'sql = "insert into adverts (aduserid,filename,linkto)
values (" _
' & session("aduserid") & ", '" & finalFileName & "', '" & myRequest("linkto") & "')"
' - Execute
'response.Write(sql)
'objConn.Execute (sql)
'objConn.Close
'set objConn = Nothing
else
ErrMsg = "The advertisement must be a JPG or GIF."
end if
'IIS may hang if you don't explicitly return SOMETHING.
'So, redirect to another page or provide some kind of
'feedback below...
%>
<% If ErrMsg = "" Then %>
Your advertisement has been uploaded. Don't forget to <a href="purchase.asp">purcha
se time</a> for it to display.
<% Else %>
<%= ErrMsg %>
Please <a href="javascript:history.g
o(-1);">go
back</a> and correct the problem.
<% End If %>
<!--#include file="footer.asp"-->