中文的无组件文件上传ASP函数-虚拟主机资讯

2013 年 5 月 7 日4510

说明:持中文的无组件文件上传asp函数,由于asp不支持二进制写入文件,所以存成文件时必须使用组件,本函数只提供截取上传文件的数据,可以写入到数据库。

<script runat=server language=vbscript>

function getupload(formdata)

dim datastart,divstr,divlen,datasize,formfielddata

分隔标志串(+crlf)

divstr = leftb(formdata,instrb(formdata,str2bin(vbcrlf)) + 1)

分隔标志串长度

divlen = lenb(divstr)

posopenboundary = instrb(formdata,divstr)

poscloseboundary = instrb(posopenboundary + 1,formdata,divstr)

set fields = createobject("scripting.dictionary")

while posopenboundary > 0 and poscloseboundary > 0

name起始位置(name="xxxxx"),加6是因为[name="]长度为6

fieldnamestart = instrb(posopenboundary,formdata,str2bin("name=")) + 6

fieldnamesize = instrb(fieldnamestart,formdata,chrb(34)) - fieldnamestart (")的asc值=34

formfieldname = bin2str(midb(formdata,fieldnamestart,fieldnamesize))

filename起始位置(filename="xxxxx")

fieldfilenamestart = instrb(posopenboundary,formdata,str2bin("filename=")) + 10

if fieldfilenamestart < poscloseboundary and fieldfilenamestart > posopenboundary then

fieldfilenamesize = instrb(fieldfilenamestart,formdata,chrb(34)) - fieldfilenamestart (")的asc值=34

formfilename = bin2str(midb(formdata,fieldfilenamestart,fieldfilenamesize))

else

formfilename = ""

end if

content-type起始位置(content-type: xxxxx)

fieldfilectstart = instrb(posopenboundary,formdata,str2bin("content-type:")) + 14

if fieldfilectstart < poscloseboundaryand fieldfilectstart > posopenboundary then

fieldfilectsize = instrb(fieldfilectstart,formdata,str2bin(vbcrlf & vbcrlf)) - fieldfilectstart

formfilect = bin2str(midb(formdata,fieldfilectstart,fieldfilectsize))

else

formfilect = ""

end if

数据起始位置:2个crlf开始

datastart = instrb(posopenboundary,formdata,str2bin(vbcrlf & vbcrlf)) + 4

if formfilename <> "" then

数据长度,减1是因为数据文件的存取字节数问题(可能是appendchunk方法的问题):

由于字节数为奇数的图象存到数据库时会去掉最后一个字符导致图象不能正确显示,

字节数为偶数的数据文件就不会出现这个问题,因此必须保持字节数为偶数。

datasize = instrb(datastart,formdata,divstr) - datastart - 1

formfielddata = midb(formdata,datastart,datasize)

else

数据长度,减2是因为分隔标志串前有一个crlf

datasize = instrb(datastart,formdata,divstr) - datastart - 2

formfielddata = bin2str(midb(formdata,datastart,datasize))

end if

建立一个dictionary集存储form中各个field的相关数据

set field = createuploadfield()

field.name = formfieldname

field.filepath = formfilename

field.filename = getfilename(formfilename)

field.contenttype = formfilect

field.length = lenb(formfielddata)

field.value = formfielddata

fields.add formfieldname, field

posopenboundary = poscloseboundary

poscloseboundary = instrb(posopenboundary + 1,formdata,divstr)

wend

set getupload = fields

end function

把二进制字符串转换成普通字符串函数

function bin2str(binstr)

dim varlen,clow,ccc,skipflag

中文字符skip标志

skipflag=0

ccc = ""

if not isnull(binstr) then

varlen=lenb(binstr)

for i=1 to varlen

if skipflag=0 then

clow = midb(binstr,i,1)

判断是否中文的字符

if ascb(clow) > 127 then

ascw会把二进制的中文双字节字符高位和低位反转,所以要先把中文的高低位反转

ccc =ccc & chr(ascw(midb(binstr,i+1,1) & clow))

skipflag=1

else

ccc = ccc & chr(ascb(clow))

end if

else

skipflag=0

end if

next

end if

bin2str = ccc

end function

把普通字符串转成二进制字符串函数

function str2bin(varstr)

str2bin=""

for i=1 to len(varstr)

varchar=mid(varstr,i,1)

varasc = asc(varchar)

asc对中文字符求出来的值可能为负数,

加上65536就可求出它的无符号数值

-1在机器内是用补码表示的0xffff,

其无符号值为65535,65535=-1+65536

其他负数依次类推。

if varasc<0 then

varasc = varasc + 65535

end if

对中文的处理:把双字节低位和高位分开

if varasc>255 then

varlow = left(hex(asc(varchar)),2)

varhigh = right(hex(asc(varchar)),2)

str2bin = str2bin & chrb("&h" & varlow) & chrb("&h" & varhigh)

else

str2bin = str2bin & chrb(ascb(varchar))

end if

next

end function

取得文件名(去掉path)

function getfilename(fullpath)

if fullpath <> "" then

fullpath = strreverse(fullpath)

fullpath = left(fullpath, instr(1, fullpath, "\") - 1)

getfilename = strreverse(fullpath)

else

getfilename = ""

end if

end function

</script>

<script runat=server language=jscript>

function createuploadfield(){ return new uf_init() }

function uf_init(){

this.name = null

this.filename = null

this.filepath = null

this.contenttype = null

this.value = null

this.length = null

}

示例

【woozhj】 于 00-4-17 上午 09:37:43 加贴在 joy asp ↑:

文件:uploadtest.asp

<html>

<head>

<title>untitled document</title>

<meta http-equiv="content-type" content="text/html; charset=gb2312">

</head>

<body bgcolor="#ffffff">

<formmethod="post" name="form1" enctype="multipart/form-data" action="showdata.asp">

<p>text1:

<input type="text" name="text1">

</p>

<p>text2:

<input type="text" name="text2">

</p>

<p>txtarea:

<textarea name="textfield" cols="20" rows="10"></textarea>

</p>

<p>file:

<input type="file" name="newfile">

</p>

<p>

<input type="submit" name="submit" value="submit">

<input type="reset" name="reset" value="reset">

</p>

</form>

</body>

</html>

文件:showdata.asp

<!--#include file="upload.inc"-->

<%

fields("xxx").name 取得form中xxx(form object)的名字

fields("xxx").filepath 如果是file object 取得文件的完整路径

fields("xxx").filename 如果是file object 取得文件名

fields("xxx").contenttype 如果是file object 取得文件的类型

fields("xxx").length 取得form中xxx(form object)的数据长度

fields("xxx").value 取得form中xxx(form object)的数据内容

dim formdata,formsize

formsize=request.totalbytes

formdata=request.binaryread(formsize)

set fields = getupload(formdata)

response.write "text1:" & fields("text1").value & "<br>" & vbcrlf

response.write "text2:" & fields("text2").value & "<br>" & vbcrlf

response.write "textarea:" & fields("textfield").value & "<br>" & vbcrlf

response.write fields("newfile").filename

response.write fields("newfile").contenttype

response.contenttype = fields("newfile").contenttype

if fields("newfile").filename<>"" then

response.contenttype = fields("newfile").contenttype

response.binarywrite fields("newfile").value

end if

response.binarywrite formdata

%>

wakeful】 于 00-4-15 下午 08:30:49 加贴在 joy asp ↑:

file:upload.asp

<%

author philippe collignon

email phcollignon@email.com

sub builduploadrequest(requestbin)

get the boundary

posbeg = 1

posend = instrb(posbeg,requestbin,getbytestring(chr(13)))

boundary = midb(requestbin,posbeg,posend-posbeg)

boundarypos = instrb(1,requestbin,boundary)

get all data inside the boundaries

do until (boundarypos=instrb(requestbin,boundary & getbytestring("--")))

members variable of objects are put in a dictionary object

dim uploadcontrol

set uploadcontrol = createobject("scripting.dictionary")

get an object name

pos = instrb(boundarypos,requestbin,getbytestring("content-disposition"))

pos = instrb(pos,requestbin,getbytestring("name="))

posbeg = pos+6

posend = instrb(posbeg,requestbin,getbytestring(chr(34)))

name = getstring(midb(requestbin,posbeg,posend-posbeg))

posfile = instrb(boundarypos,requestbin,getbytestring("filename="))

posbound = instrb(posend,requestbin,boundary)

test if object is of file type

ifposfile<>0 and (posfile<posbound) then

get filename, content-type and content of file

posbeg = posfile + 10

posend =instrb(posbeg,requestbin,getbytestring(chr(34)))

filename = getstring(midb(requestbin,posbeg,posend-posbeg))

add filename to dictionary object

uploadcontrol.add "filename", filename

pos = instrb(posend,requestbin,getbytestring("content-type:"))

posbeg = pos+14

posend = instrb(posbeg,requestbin,getbytestring(chr(13)))

add content-type to dictionary object

contenttype = getstring(midb(requestbin,posbeg,posend-posbeg))

uploadcontrol.add "contenttype",contenttype

get content of object

posbeg = posend+4

posend = instrb(posbeg,requestbin,boundary)-2

value = midb(requestbin,posbeg,posend-posbeg)

else

get content of object

pos = instrb(pos,requestbin,getbytestring(chr(13)))

posbeg = pos+4

posend = instrb(posbeg,requestbin,boundary)-2

value = getstring(midb(requestbin,posbeg,posend-posbeg))

end if

add content to dictionary object

uploadcontrol.add "value" , value

add dictionary object to main dictionary

uploadrequest.add name, uploadcontrol

loop to next object

boundarypos=instrb(boundarypos+lenb(boundary),requestbin,boundary)

loop

end sub

string to byte string conversion

function getbytestring(stringstr)

for i = 1 to len(stringstr)

char = mid(stringstr,i,1)

getbytestring = getbytestring & chrb(ascb(char))

next

end function

byte string to string conversion

function getstring(stringbin)

getstring =""

for intcount = 1 to lenb(stringbin)

getstring = getstring & chr(ascb(midb(stringbin,intcount,1)))

next

end function

%>

outputfile.asp

<%

author philippe collignon

email phcollignon@email.com

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")

builduploadrequestrequestbin

email = uploadrequest.item("email").item("value")

contenttype = uploadrequest.item("blob").item("contenttype")

filepathname = uploadrequest.item("blob").item("filename")

filename = right(filepathname,len(filepathname)-instrrev(filepathname,"\"))

value = uploadrequest.item("blob").item("value")

create filesytemobject component

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)&"uploaded"&filename)

for i = 1 to lenb(value)

myfile.write chr(ascb(midb(value,i,1)))

next

myfile.close

%>

<b>uploaded file : </b><%="uploaded"&filename%><br>

<img src="<%="uploaded"&filename%>">

<!--#include file="upload.asp"-->

outputclient.asp

<%

author philippe collignon

email phcollignon@email.com

response.buffer = true

response.clear

bytecount = request.totalbytes

requestbin = request.binaryread(bytecount)

dim uploadrequest

set uploadrequest = createobject("scripting.dictionary")

builduploadrequestrequestbin

email = uploadrequest.item("email").item("value")

contenttype = uploadrequest.item("blob").item("contenttype")

filepathname = uploadrequest.item("blob").item("filename")

filename = right(filepathname,len(filepathname)-instrrev(filepathname,"\"))

value = uploadrequest.item("blob").item("value")

%>

your email is : <%= email %><br>

file name of you picture is <%=filepathname%><br>

file type of your picture is <%=contenttype%><br>

<!--#include file="upload.asp"-->

binaryoutputclient.asp

<%

author philippe collignon

email phcollignon@email.com

response.buffer = true

response.clear

bytecount = request.totalbytes

requestbin = request.binaryread(bytecount)

dim uploadrequest

set uploadrequest = createobject("scripting.dictionary")

builduploadrequestrequestbin

email = uploadrequest.item("email").item("value")

contenttype =uploadrequest.item("blob").item("contenttype")

filepathname = uploadrequest.item("blob").item("filename")

filename = right(filepathname,len(filepathname)-instrrev(filepathname,"\"))

picture = uploadrequest.item("blob").item("value")

response.contenttype = contenttype

response.binarywrite picture

%>

<!--#include file="upload.asp"-->

uploadform.htm

<!-- author philippe collignon -->

<!-- email phcollignon@email.com -->

<html>

<head>

<title>upload form</title>

</head>

<body>

<b>output to client</b>

<form method="post" enctype="multipart/form-data" action="outputclient.asp">

email : <input type="text" name="email" value="phcollignon@email.com"><br>

picture : <input type="file" name="blob"><br>

<input type="submit" name="enter">

</form>

<b>binary output to client</b>

<form method="post" enctype="multipart/form-data" action="binaryoutputclient.asp">

email : <input type="text" name="email" value="phcollignon@email.com"><br>

picture : <input type="file" name="blob"><br>

<input type="submit" name="enter">

</form>

<b>output to file system</b>

<form method="post" enctype="multipart/form-data" action="outputfile.asp">

email : <input type="text" name="email" value="phcollignon@email.com"><br>

picture : <input type="file" name="blob"><br>

<input type="submit" name="enter">

</form>

</body>

</html>

文章整理:西部数码--专业提供域名注册、虚拟主机服务

http://http://www.zjjv.com//

以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

0 0