关于文件上传的问题,解决问题分可以再加

tmpx 2005-06-08 04:38:29
任务:要把普通的5个文本框数据和3张图片文件用同一个form上传到同一张表中
问题:用<form action="" name="form1" method="post" enctype="multipart/form-data">的时候上传的数据全部都被转为2进制,分不出哪些是文本框数据,哪些是图片数据
请教高手如何解决这个问题?或者有替代方法也行,最好有详细解决方案和代码,分不是问题,解决之后在加100也可以。
...全文
59 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tmpx 2005-06-08
多谢几位大师指点
回复
mymyal123 2005-06-08
调用 方法:

<!-- #include file="inc_upload_img.asp" -->
Dim Form, FormSize, FormData
formsize=Request.TotalBytes
formdata=Request.BinaryRead(formsize)
bncrlf=chrB(13) & chrB(10)
divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf & bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(formdata,datastart,dataend) //mydata为图片内容

BLOG_BIAOTI=(GetUpLoad(FormData)("上一页的文本框1").Value)
BLOG_TYPE_ID=(GetUpLoad(FormData)("上一页的文本框2").Value)
BLOG_NEIRONG=(GetUpLoad(FormData)("上一页的文本框3").Value)

不过要同时上传三张图片没试过,而且这个控件要把文本框放到图片上传选择框的后面
回复
mymyal123 2005-06-08
上传控件:

<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 < PosCloseBoundary And 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(FormFieldName, FormFileName, FormFileCT, FormFieldData, DataSize)
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(Name, FilePath, ContentType, Value, Length)
{
return new uf_Init(Name, FilePath, ContentType, Value, Length)
}
function uf_Init(Name, FilePath, ContentType, Value, Length)
{
this.Name = Name
this.Value = Value;
this.Length = Length;
if (ContentType != "")
{
this.FileName = GetFileName(FilePath);
this.FilePath = FilePath;
this.ContentType = ContentType;
}
}
</script>
回复
tmpx 2005-06-08
无组件上传可不可以做到?
回复
孟子E章 2005-06-08
http://www.pcsky.cn/article/list.asp?id=42

无组件文件上传代码实例(支持多文件上传及文件和input域混合上传)
回复
孟子E章 2005-06-08
一般的上传组件都会提供分解的方法的
回复
szjhxu 2005-06-08
用ASPUpLoad组件做一个上传页面,很容易搞定的。

ASPUpLoad组件网上找得到的。
回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2005-06-08 04:38
社区公告
暂无公告