Data1 Data2 Data3 Data4 Data5
tinyint tinyint varchar varchar(8000) image(16)
前三个要生成超链接 要链接内容 要链接图像
我创包括前三个字段在内的视图。欲使用ASP在一网页中生成Data1、Data2和Data3组成的超链接,链接要显示的内容为Data4记录,如果Data5(图像)非空,则要生成一个链接,此链接显示Data5的图像。
高分请教,在此问题上我将再加100分。另外就是如何结贴?
先谢谢各位!
25 个解决方案
#1
'先将记录值取出,赋值变量
//ShowData4.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
//ShowData4.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
#2
Sorry,有个地方写错了。就是取数据的页面的名称不是ShowData4.asp,假设为GetData.asp
'先将记录值取出,赋值变量
//GetData.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
'先将记录值取出,赋值变量
//GetData.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
#3
第一步,先判断到底是要显示4或是5中的内容:
if 5=true then
data4="<img src=view_pic.asp>"
else
data4=rs("data4")
end if
由变量data4来表示欲显示的内容,之后,再用如下方式:
<a href="<%=rs("data1")&rs("data2")&rs("data3")%>"><%=data4%></a>
图像格式必须在另外一个页面显示,所以用<img src=view_pic.asp>,在这个页面中,你必须显示你的图像。
不知道是不是你的想法。
要结贴点击标题另边的“管理”,进入即可给分
if 5=true then
data4="<img src=view_pic.asp>"
else
data4=rs("data4")
end if
由变量data4来表示欲显示的内容,之后,再用如下方式:
<a href="<%=rs("data1")&rs("data2")&rs("data3")%>"><%=data4%></a>
图像格式必须在另外一个页面显示,所以用<img src=view_pic.asp>,在这个页面中,你必须显示你的图像。
不知道是不是你的想法。
要结贴点击标题另边的“管理”,进入即可给分
#4
结题方法:点击本帖右上角或右下角,红色标题中的"管理",进入后先填入你要给谁多少分(每个人分数的总和必须等于本帖你所给的"问题点数"),然后输入你的密码,最后按"给分"结题.
#5
<%
'先建立connection对象
Set conn=Server.createobject("adodb.connection")
connstr="" '这里connstr请将数据源写上
conn.open connstr
'建立recordset对象
Set rs=Server.createobject("adodb.recordset")
Sql="Select * from table名"
rs.open sql,conn,1,1
If not rs.eof or rs.bof then
If rs("Data5")<>"" then
lll=rs("Data5")
Else
lll=rs("Data4")
End if
%>
<a href="<%rs("Data1")&"\"&rs("Data2")&"\"&rs("Data3")&"\"&lll%>">你的链接</a>
<%
rs.close
set rs=nothing
conn.close
Set conn=nothing
End if
%>
源代码大致如此,具体你自己改一改就可用了
'先建立connection对象
Set conn=Server.createobject("adodb.connection")
connstr="" '这里connstr请将数据源写上
conn.open connstr
'建立recordset对象
Set rs=Server.createobject("adodb.recordset")
Sql="Select * from table名"
rs.open sql,conn,1,1
If not rs.eof or rs.bof then
If rs("Data5")<>"" then
lll=rs("Data5")
Else
lll=rs("Data4")
End if
%>
<a href="<%rs("Data1")&"\"&rs("Data2")&"\"&rs("Data3")&"\"&lll%>">你的链接</a>
<%
rs.close
set rs=nothing
conn.close
Set conn=nothing
End if
%>
源代码大致如此,具体你自己改一改就可用了
#6
非常感谢各位的热心帮助!我很仔细地看了各位的代码,有一些启发。
我把问题讲细一点:表中有5个字段,前三条产生链接文体(如Data1、Data2、Data3分别为1、1、中国程序员则在一页面中显示 "11 中国程序员" 这个超链接,而这个超链接链接到该条记录的Data4,在另一页面显示其内容。如果Data5有图像,也产生一个链接,链接最好在Data4页面里面,该链接显示图像),后面两个列是链接的内容。当然表中有多条记录要待显示。
读取表中前三字段显示一系列链接,链接显示后面两字段,这个该如何做呢?救救我吧!
我是ASP与SQL的初学者,一开始就是看你们写的ASP,再稍加修改或直接使用,^_^
请继续跟贴,谢谢!
我把问题讲细一点:表中有5个字段,前三条产生链接文体(如Data1、Data2、Data3分别为1、1、中国程序员则在一页面中显示 "11 中国程序员" 这个超链接,而这个超链接链接到该条记录的Data4,在另一页面显示其内容。如果Data5有图像,也产生一个链接,链接最好在Data4页面里面,该链接显示图像),后面两个列是链接的内容。当然表中有多条记录要待显示。
读取表中前三字段显示一系列链接,链接显示后面两字段,这个该如何做呢?救救我吧!
我是ASP与SQL的初学者,一开始就是看你们写的ASP,再稍加修改或直接使用,^_^
请继续跟贴,谢谢!
#7
//Load.asp用于建立与数据库的连结。它将被包含在页面的开始。
//Load.asp======================================================
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Driver={SQL Server};Server=(local);DataBase=xxx;UID=xxx;PWD=xxx"
%>
//Unload.asp用来关闭与数据库的连结。它将被包含在页面的结尾。
//Unload.asp===================================================
<%
if not isEmpty(rs) then
Set rs=Nothing
end if
if not isEmpty(Conn) then
On Error Resume Next
Conn.Close
Set Conn = Nothing
end if
%>
//GetData.asp===================================================
'先将记录值取出,赋值变量
'GetData.asp页面用于从数据库中取出记录值。
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
//ShowData4.asp===================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
szData4 = trim(Request("Value"))
szData5 = trim(Request("img"))
Response.write szData4
if szData5 <> "" then
Response.Write "<img src=""" & szData5 & """>"
end if
%>
</body>
</html>
这里的几个文件“Load.asp、Unload.asp、Getdata.asp、ShowData.asp”请放于同一目录下。
//Load.asp======================================================
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Driver={SQL Server};Server=(local);DataBase=xxx;UID=xxx;PWD=xxx"
%>
//Unload.asp用来关闭与数据库的连结。它将被包含在页面的结尾。
//Unload.asp===================================================
<%
if not isEmpty(rs) then
Set rs=Nothing
end if
if not isEmpty(Conn) then
On Error Resume Next
Conn.Close
Set Conn = Nothing
end if
%>
//GetData.asp===================================================
'先将记录值取出,赋值变量
'GetData.asp页面用于从数据库中取出记录值。
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
//ShowData4.asp===================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
szData4 = trim(Request("Value"))
szData5 = trim(Request("img"))
Response.write szData4
if szData5 <> "" then
Response.Write "<img src=""" & szData5 & """>"
end if
%>
</body>
</html>
这里的几个文件“Load.asp、Unload.asp、Getdata.asp、ShowData.asp”请放于同一目录下。
#8
Sorry:
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
#9
Sorry:
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
#10
感谢jetplane(喷气飞机) 提供的详细的代码,问题已经颇见明朗。真的很感谢初学ASP与SQL时你们提供的帮助。我说过此问题200分,可是为什么不能再加100分?让我不致于失信吧!它说加上分的话已经超过最大限制了,可是我却看到有好几百分的问题?
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
#11
感谢jetplane(喷气飞机) 提供的详细的代码,问题已经颇见明朗。真的很感谢初学ASP与SQL时你们提供的帮助。我说过此问题200分,可是为什么不能再加100分?让我不致于失信吧!它说加上分的话已经超过最大限制了,可是我却看到有好几百分的问题?
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
#12
to janhance(IT业边缘的徘徊者):
1、“szLink=Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))”这个语句是我的失误,因为我没看清你的data1/2的类型是“tinyint”,如果字段类型为“int”就可以了。不过没关系,去掉Int()函数后,ASP也可以自动识别数据类型。所以你改用“szLink=rs("Data1") & rs("Data2") & rs("Data3")”也无妨,不过建议rs("Data3")前面加上Trim()函数,这样可以截去首尾的空格。不然有可能取出的数据很长(后面带了一大段空格)。。。。
2、关于“如何把图像(gif,jpeg等)存入数据表字段image中?”答案是,要把图像以它的二进制流文件格式存入数据库。如下:
将上载数据存入数据库
图像的content-type 也存入数据库中(Gif/jpg),以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=wroxdns","user","pass"
然后从连接中创建记录集:
sql = "SELECT PHOTO, CONTENTTYPE FROM MYTABLE"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 3, 3
记录集创建之后,要将二进制数据放入数据库的blob域中:
picturechunk = picture & chrB(0)
rs.Fields("PICTURE").appendChunk picturechunk
rs.Fields("CONTENTTYPE") = contentType
rs.Update
conn.close
在appendChunk 方法中,我不得不解决一个臭虫。事实上当二进制数据有奇数字节时,appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("CONTENTTYPE")
size = rs.Fields("PICTURE").ActualSize
blob = rs.Fields("PICTURE").GetChunk(size)
Response.binarywrite blob
其中“Response.binarywrite blob”可以直接在网页上看到数据库中的图档
OK??
1、“szLink=Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))”这个语句是我的失误,因为我没看清你的data1/2的类型是“tinyint”,如果字段类型为“int”就可以了。不过没关系,去掉Int()函数后,ASP也可以自动识别数据类型。所以你改用“szLink=rs("Data1") & rs("Data2") & rs("Data3")”也无妨,不过建议rs("Data3")前面加上Trim()函数,这样可以截去首尾的空格。不然有可能取出的数据很长(后面带了一大段空格)。。。。
2、关于“如何把图像(gif,jpeg等)存入数据表字段image中?”答案是,要把图像以它的二进制流文件格式存入数据库。如下:
将上载数据存入数据库
图像的content-type 也存入数据库中(Gif/jpg),以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=wroxdns","user","pass"
然后从连接中创建记录集:
sql = "SELECT PHOTO, CONTENTTYPE FROM MYTABLE"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 3, 3
记录集创建之后,要将二进制数据放入数据库的blob域中:
picturechunk = picture & chrB(0)
rs.Fields("PICTURE").appendChunk picturechunk
rs.Fields("CONTENTTYPE") = contentType
rs.Update
conn.close
在appendChunk 方法中,我不得不解决一个臭虫。事实上当二进制数据有奇数字节时,appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("CONTENTTYPE")
size = rs.Fields("PICTURE").ActualSize
blob = rs.Fields("PICTURE").GetChunk(size)
Response.binarywrite blob
其中“Response.binarywrite blob”可以直接在网页上看到数据库中的图档
OK??
#13
1、关于你的结贴,呵呵。。。。。
你可以点击右上角“回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口 ”中的管理,然后在那里面结贴。
2、关于贴子加分:
1、只有贴主才有权力给自己的贴子加分(斑竹也没有权利给别人贴子加分),加分后的上限是贴主可发分的上限
2、非技术区贴子不允许加分
3、贴主所加的分数不可以超过自己所有可用分
4、不能加负分,0分
5、扩充话题区贴子不允许加分
加分方法:点“管理”链接进入帖子,有一个“帖子加分”链接,点击后,在弹出的窗口填入分数,然后点“确定”。
你是新上来玩CSDN吧?还要多看看使用说明噢:)
有问题继续问。我会每半小时至一小时上来关注的。
你可以点击右上角“回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口 ”中的管理,然后在那里面结贴。
2、关于贴子加分:
1、只有贴主才有权力给自己的贴子加分(斑竹也没有权利给别人贴子加分),加分后的上限是贴主可发分的上限
2、非技术区贴子不允许加分
3、贴主所加的分数不可以超过自己所有可用分
4、不能加负分,0分
5、扩充话题区贴子不允许加分
加分方法:点“管理”链接进入帖子,有一个“帖子加分”链接,点击后,在弹出的窗口填入分数,然后点“确定”。
你是新上来玩CSDN吧?还要多看看使用说明噢:)
有问题继续问。我会每半小时至一小时上来关注的。
#14
终于把以前的两个帖子结掉了,这样让我也有种轻松的感觉。^_^
我申请ID很久了,只是这一个月才来看看,真的好多好东西!学习了不少东西!
jetplane(喷气飞机):我想通过一个asp页面将图像存入数据库表(tab)字段image中,当然有帐号和权限审核后才能更新,主要是在本机更新数据。我设想这样一个页面:
用户:________密码:_______
Data1____Data2_____Data3____Data4____Data5_____通过按钮选择图片
要将图片存在Data5这个image字段中,是使用http://www.csdn.net/expert/topic/602/602547.xml?temp=.9119532里面 ssm1226(雨中人)说的那种方法吗?看了他(她)说的,却是几乎一点都不懂。
请问这个问题到底该如何解决?我问一些网友,他们说用二进制存储。但图片难道一定要使用一个什么软件以二进制打开,然后copy到image字段存储起来以供调用??令人迷惑?请继续跟贴,非常感谢!
我申请ID很久了,只是这一个月才来看看,真的好多好东西!学习了不少东西!
jetplane(喷气飞机):我想通过一个asp页面将图像存入数据库表(tab)字段image中,当然有帐号和权限审核后才能更新,主要是在本机更新数据。我设想这样一个页面:
用户:________密码:_______
Data1____Data2_____Data3____Data4____Data5_____通过按钮选择图片
要将图片存在Data5这个image字段中,是使用http://www.csdn.net/expert/topic/602/602547.xml?temp=.9119532里面 ssm1226(雨中人)说的那种方法吗?看了他(她)说的,却是几乎一点都不懂。
请问这个问题到底该如何解决?我问一些网友,他们说用二进制存储。但图片难道一定要使用一个什么软件以二进制打开,然后copy到image字段存储起来以供调用??令人迷惑?请继续跟贴,非常感谢!
#15
呵呵,
其实你的问题是想通过网页的形式上传图片,对不?
想通过网页的形式上传图片一般有两种常用方法:
一种是、通过第三方组件,即要在服务器端安装一个第三方开发的软件(一般为.Dll控件),在网页程序中调用这个第三方组件,上传文件。
二种是、无组件上传,即通过程序来上传文件,一般这需要写一些代码。这种无组件上传比较方便,也基本符合你所说的哪些。
这里先发来两段代码(两个页面)。这两个页面(一个表单、一个是接收页面)会将你上传的图片存入服务器的“C:\”下并命名为“text1.jpg”。当然这只是一个测试,上传文件的路径和文件名你都可以自己改。
先提供你关于上传至路径下的代码,也可以上传至数据库,代码一会提供
上传至文件夹的代码如下:
//======================1.htm===========================
1.htm:
<html>
<body>
<form method="POST" action="1.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="text1" size="20"></p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
</form>
</body>
</html>
//======================1.asp===========================
1.asp
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'将二进制流数据同时写入Uploadfile_Stream这个Stream对象
Set Uploadfile_Stream=CreateObject("Adodb.Stream")
Uploadfile_Stream.mode=3
Uploadfile_Stream.type=1
Uploadfile_Stream.open
Uploadfile_Stream.Write RequestBin
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = PosBeg & "$$" & PosEnd
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
Response.write "表单数据text2:" & text2 & "<br>"
'不过对于上传的文件,即file类型的上传数据。dictionary对象中只保留它们的始/终位置。我们要取出这两个位置,
'然后用Stream对象来分解出。
'将上传文件写入指定目录下。
text1 = UploadRequest.Item("text1").Item("Value")
If instr(1,text1,"$$")>0 then
arrTmpValue = split(text1,"$$")
'起始位置
PosBeg = arrTmpValue(0)
'结束位置
PosEnd = arrTmpValue(1)
If PosBeg < PosEnd then
Set Savefile_Stream=CreateObject("Adodb.Stream")
Savefile_Stream.mode=3
Savefile_Stream.type=1
Savefile_Stream.Open
Uploadfile_Stream.Position = PosBeg -1
Uploadfile_Stream.Copyto Savefile_Stream,(PosEnd - PosBeg)
SavefilePath = "C:\text1.jpg"
Savefile_Stream.SaveToFile SavefilePath,2
Savefile_Stream.Close
Set Savefile_Stream=Nothing
Response.Write "文件上传起始位置:" & PosBeg & "<br>"
Response.Write "文件上传终于位置:" & PosEnd & "<br>"
Else
Response.Write "没有文件上传!"
End if
Else
Response.Write "没有文件上传!"
End if
'------------------------------------
%>
其实你的问题是想通过网页的形式上传图片,对不?
想通过网页的形式上传图片一般有两种常用方法:
一种是、通过第三方组件,即要在服务器端安装一个第三方开发的软件(一般为.Dll控件),在网页程序中调用这个第三方组件,上传文件。
二种是、无组件上传,即通过程序来上传文件,一般这需要写一些代码。这种无组件上传比较方便,也基本符合你所说的哪些。
这里先发来两段代码(两个页面)。这两个页面(一个表单、一个是接收页面)会将你上传的图片存入服务器的“C:\”下并命名为“text1.jpg”。当然这只是一个测试,上传文件的路径和文件名你都可以自己改。
先提供你关于上传至路径下的代码,也可以上传至数据库,代码一会提供
上传至文件夹的代码如下:
//======================1.htm===========================
1.htm:
<html>
<body>
<form method="POST" action="1.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="text1" size="20"></p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
</form>
</body>
</html>
//======================1.asp===========================
1.asp
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'将二进制流数据同时写入Uploadfile_Stream这个Stream对象
Set Uploadfile_Stream=CreateObject("Adodb.Stream")
Uploadfile_Stream.mode=3
Uploadfile_Stream.type=1
Uploadfile_Stream.open
Uploadfile_Stream.Write RequestBin
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = PosBeg & "$$" & PosEnd
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
Response.write "表单数据text2:" & text2 & "<br>"
'不过对于上传的文件,即file类型的上传数据。dictionary对象中只保留它们的始/终位置。我们要取出这两个位置,
'然后用Stream对象来分解出。
'将上传文件写入指定目录下。
text1 = UploadRequest.Item("text1").Item("Value")
If instr(1,text1,"$$")>0 then
arrTmpValue = split(text1,"$$")
'起始位置
PosBeg = arrTmpValue(0)
'结束位置
PosEnd = arrTmpValue(1)
If PosBeg < PosEnd then
Set Savefile_Stream=CreateObject("Adodb.Stream")
Savefile_Stream.mode=3
Savefile_Stream.type=1
Savefile_Stream.Open
Uploadfile_Stream.Position = PosBeg -1
Uploadfile_Stream.Copyto Savefile_Stream,(PosEnd - PosBeg)
SavefilePath = "C:\text1.jpg"
Savefile_Stream.SaveToFile SavefilePath,2
Savefile_Stream.Close
Set Savefile_Stream=Nothing
Response.Write "文件上传起始位置:" & PosBeg & "<br>"
Response.Write "文件上传终于位置:" & PosEnd & "<br>"
Else
Response.Write "没有文件上传!"
End if
Else
Response.Write "没有文件上传!"
End if
'------------------------------------
%>
#16
没有上传图像至数据库表中的建议及代码吗?我想要解决的最主要的问题是--存储图像(上传图像)至数据库表,然后从数据库中读出数据显示在客户端中。
我怎么不能加分啊?
jetplane(喷气飞机) ,那些代码我没怎么弄明白,是头脑太笨了吧!:(
我怎么不能加分啊?
jetplane(喷气飞机) ,那些代码我没怎么弄明白,是头脑太笨了吧!:(
#17
jetplane(喷气飞机) ﹐你真是太棒了﹗﹗﹗
可是為什么要把圖片存在數據庫里啊﹖﹖﹖
其實把圖片名存在數據庫里﹐圖片存在一個目錄里﹐根據名稱建立連接這樣不是好點嗎﹖圖片存在數據庫里不是搞到數據庫很大嗎﹖這樣對存取速度有沒有影響的啊﹖
關注這個問題。
可是為什么要把圖片存在數據庫里啊﹖﹖﹖
其實把圖片名存在數據庫里﹐圖片存在一個目錄里﹐根據名稱建立連接這樣不是好點嗎﹖圖片存在數據庫里不是搞到數據庫很大嗎﹖這樣對存取速度有沒有影響的啊﹖
關注這個問題。
#18
不用太明白,有时候糊涂点好,先照着贴上去,先用着再说。
太多要学的了,等到了前面再回头看一下以前不懂的,然后自然就懂了~~~`
太多要学的了,等到了前面再回头看一下以前不懂的,然后自然就懂了~~~`
#19
一般用什么软件把图片以二进制打开呢?
#20
请继续关注,谢谢!
图片存到数据库中,只是想弄懂这种方法,并没有什么特别的目的,马上要结贴了,请关注。
图片存到数据库中,只是想弄懂这种方法,并没有什么特别的目的,马上要结贴了,请关注。
#21
对于varchar类型的记录,最多可以存储8000个字符,那么image呢?还有就是能否一次读取多余8000个字符的数据,然后用两个varchar字段来存储,具体如何实现?
请关注,谢谢!
请关注,谢谢!
#22
To janhance(IT业边缘的徘徊者):
非常不好意思,自星期五下班前我发了那篇“上传成文件”的代码后,我就下班了。后来因为一直比较忙,也就忘了继续把“上传至数据库”的情况道与您了。今天才看到你的回复。迟复为谦!
其实对于“无组件上传文件”来说,上传至数据库比以文件形式上传要容易。简单的讲就是图片的二进制文件容易从上传的表单数据中分离,但由于在ASP的创建文件函数中只提供了CreatTextFile的方法,而它只能传递ACSII码文件(如TXT档),而对图档这样的二进制文件是不行的。所以我们还要用到其它的对象,如ADODB.Stream对象(但这需要服务器安排有ADO2.5以上的版本,当然现在win服务器基本都是有的);
而上传至数据库,则只要把分离出来的数据写到数据库里就可以了。
不过正如“simpleli(simply)”所说的:一般我们做法都是将图档上传至文件夹下,在数据库只保留有图档的路径。这样一来打开的快。二来数据库的负担也比较轻的。
下面就是上传至数据库的实验代码:
1、上传图档的页面funtest4.htm===================================
<form method="POST" action="futest4rd.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="pic" size="20">
</p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2">
</p>
</form>
2、接收页面funtest4rd.asp=======================================
其中假设有一mdb数据库testdb.mdb,有表“PicTab”
其中有“contenttype(文本类型)”和“picdata(OLE对象类型)”两个字段相当重要,前者是存图档类型的;后者是存图档数据的。
另外分离数据的“BuildUploadRequest”过程与前面的上传成文件的“BuildUploadRequest”也有一个关键的改动(一条语句,但很关键),是关于分离出来的图档的Value的值的(具体的你可以自己去比较一下上传至文件的“BuildUploadRequest”和这里传至数据库的“BuildUploadRequest”,改变的原因可以看上面我谈的上传成文件与传至数据库的不同点。。。。)
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
'============================================================
'数据存入数据库。content-type 也要存入数据库中,以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set rs = Server.CreateObject("ADODB.Recordset")
'然后从连接中创建记录集:
rs.Open "PicTab", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("../db/testdb.mdb"), 2, 2
'记录集创建之后,要将二进制数据放入数据库中:
rs.AddNew
contentType = UploadRequest.Item("pic").Item("ContentType")
rs("contenttype") = contentType
text1 = UploadRequest.Item("pic").Item("Value")
picturechunk = text1 & chrB(0)
rs.Fields("picdata").appendChunk picturechunk
rs.Update
'rs.Close
'Set rs = nothing
'-----------------------
'在appendChunk 方法中,要解决一个臭虫。即当二进制数据有奇数字节时,
'appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
'要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("contenttype")
'
size = rs.Fields("picdata").ActualSize
blob = rs.Fields("picdata").GetChunk(size)
Response.binarywrite blob
rs.Close
Set rs = nothing
'------------------------------------
%>
//=======================================================
另,关于“那些代码我没怎么弄明白”这个问题,你可以参看一下另一篇贴子
“http://www.csdn.net/expert/topic/648/648974.xml?temp=.2759363”在这里面我和另一位朋友有一定的介绍。
还有,关于“ 一般用什么软件把图片以二进制打开呢?”这个问题,其
非常不好意思,自星期五下班前我发了那篇“上传成文件”的代码后,我就下班了。后来因为一直比较忙,也就忘了继续把“上传至数据库”的情况道与您了。今天才看到你的回复。迟复为谦!
其实对于“无组件上传文件”来说,上传至数据库比以文件形式上传要容易。简单的讲就是图片的二进制文件容易从上传的表单数据中分离,但由于在ASP的创建文件函数中只提供了CreatTextFile的方法,而它只能传递ACSII码文件(如TXT档),而对图档这样的二进制文件是不行的。所以我们还要用到其它的对象,如ADODB.Stream对象(但这需要服务器安排有ADO2.5以上的版本,当然现在win服务器基本都是有的);
而上传至数据库,则只要把分离出来的数据写到数据库里就可以了。
不过正如“simpleli(simply)”所说的:一般我们做法都是将图档上传至文件夹下,在数据库只保留有图档的路径。这样一来打开的快。二来数据库的负担也比较轻的。
下面就是上传至数据库的实验代码:
1、上传图档的页面funtest4.htm===================================
<form method="POST" action="futest4rd.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="pic" size="20">
</p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2">
</p>
</form>
2、接收页面funtest4rd.asp=======================================
其中假设有一mdb数据库testdb.mdb,有表“PicTab”
其中有“contenttype(文本类型)”和“picdata(OLE对象类型)”两个字段相当重要,前者是存图档类型的;后者是存图档数据的。
另外分离数据的“BuildUploadRequest”过程与前面的上传成文件的“BuildUploadRequest”也有一个关键的改动(一条语句,但很关键),是关于分离出来的图档的Value的值的(具体的你可以自己去比较一下上传至文件的“BuildUploadRequest”和这里传至数据库的“BuildUploadRequest”,改变的原因可以看上面我谈的上传成文件与传至数据库的不同点。。。。)
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
'============================================================
'数据存入数据库。content-type 也要存入数据库中,以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set rs = Server.CreateObject("ADODB.Recordset")
'然后从连接中创建记录集:
rs.Open "PicTab", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("../db/testdb.mdb"), 2, 2
'记录集创建之后,要将二进制数据放入数据库中:
rs.AddNew
contentType = UploadRequest.Item("pic").Item("ContentType")
rs("contenttype") = contentType
text1 = UploadRequest.Item("pic").Item("Value")
picturechunk = text1 & chrB(0)
rs.Fields("picdata").appendChunk picturechunk
rs.Update
'rs.Close
'Set rs = nothing
'-----------------------
'在appendChunk 方法中,要解决一个臭虫。即当二进制数据有奇数字节时,
'appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
'要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("contenttype")
'
size = rs.Fields("picdata").ActualSize
blob = rs.Fields("picdata").GetChunk(size)
Response.binarywrite blob
rs.Close
Set rs = nothing
'------------------------------------
%>
//=======================================================
另,关于“那些代码我没怎么弄明白”这个问题,你可以参看一下另一篇贴子
“http://www.csdn.net/expert/topic/648/648974.xml?temp=.2759363”在这里面我和另一位朋友有一定的介绍。
还有,关于“ 一般用什么软件把图片以二进制打开呢?”这个问题,其
#23
To jetplane(喷气飞机):
好些天没有上来瞧了,看到你发的帖子真是很高兴。能在csdn上得到你的帮助让我不知道怎么感谢你才好!在读书的时候我几乎从不问老师问题的,也不知道为什么,呵呵。懵懵懂懂的读了十几年书,在很多问题上都是一知半解。
我还有好多问题呢。我到时发贴,还请你多多关照咯!
jetplane(喷气飞机),可以发一些学习ASP的资料给我吗?我的EMAIL:janhance@163.net
特别需要表单和图像同一个页面提交的代码。我在csdn上发现不少这方面的帖子,csdn上有篇文章有介绍(http://www.csdn.net/expert/topic/647/647755.xml?temp=.6268732)。我另外也下载了几个进行试验,有些挺成功的。这几天一直在看网上的关于图像提交到数据库的帖子,不过有些关于流方面的语句及其相关东西很难看懂,一般没有注释,也没有找到有关参考书。
我还有问题的话,会继续发贴,我等着你的回答哦。
好些天没有上来瞧了,看到你发的帖子真是很高兴。能在csdn上得到你的帮助让我不知道怎么感谢你才好!在读书的时候我几乎从不问老师问题的,也不知道为什么,呵呵。懵懵懂懂的读了十几年书,在很多问题上都是一知半解。
我还有好多问题呢。我到时发贴,还请你多多关照咯!
jetplane(喷气飞机),可以发一些学习ASP的资料给我吗?我的EMAIL:janhance@163.net
特别需要表单和图像同一个页面提交的代码。我在csdn上发现不少这方面的帖子,csdn上有篇文章有介绍(http://www.csdn.net/expert/topic/647/647755.xml?temp=.6268732)。我另外也下载了几个进行试验,有些挺成功的。这几天一直在看网上的关于图像提交到数据库的帖子,不过有些关于流方面的语句及其相关东西很难看懂,一般没有注释,也没有找到有关参考书。
我还有问题的话,会继续发贴,我等着你的回答哦。
#24
有相关贴子,欢迎各位去:http://www.csdn.net/expert/topic/674/674728.xml?temp=.2518885
#25
有相关贴子,欢迎各位去:http://www.csdn.net/expert/topic/675/675768.xml?temp=.8812372
#1
'先将记录值取出,赋值变量
//ShowData4.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
//ShowData4.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
#2
Sorry,有个地方写错了。就是取数据的页面的名称不是ShowData4.asp,假设为GetData.asp
'先将记录值取出,赋值变量
//GetData.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
'先将记录值取出,赋值变量
//GetData.asp===================================================
<%
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
If not rs.EOF then
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
End if
rs.Close
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
%>
//ShowData4.asp===================================================
<%
szData4 = trim(Request("Value"))
Response.write szData4
%>
#3
第一步,先判断到底是要显示4或是5中的内容:
if 5=true then
data4="<img src=view_pic.asp>"
else
data4=rs("data4")
end if
由变量data4来表示欲显示的内容,之后,再用如下方式:
<a href="<%=rs("data1")&rs("data2")&rs("data3")%>"><%=data4%></a>
图像格式必须在另外一个页面显示,所以用<img src=view_pic.asp>,在这个页面中,你必须显示你的图像。
不知道是不是你的想法。
要结贴点击标题另边的“管理”,进入即可给分
if 5=true then
data4="<img src=view_pic.asp>"
else
data4=rs("data4")
end if
由变量data4来表示欲显示的内容,之后,再用如下方式:
<a href="<%=rs("data1")&rs("data2")&rs("data3")%>"><%=data4%></a>
图像格式必须在另外一个页面显示,所以用<img src=view_pic.asp>,在这个页面中,你必须显示你的图像。
不知道是不是你的想法。
要结贴点击标题另边的“管理”,进入即可给分
#4
结题方法:点击本帖右上角或右下角,红色标题中的"管理",进入后先填入你要给谁多少分(每个人分数的总和必须等于本帖你所给的"问题点数"),然后输入你的密码,最后按"给分"结题.
#5
<%
'先建立connection对象
Set conn=Server.createobject("adodb.connection")
connstr="" '这里connstr请将数据源写上
conn.open connstr
'建立recordset对象
Set rs=Server.createobject("adodb.recordset")
Sql="Select * from table名"
rs.open sql,conn,1,1
If not rs.eof or rs.bof then
If rs("Data5")<>"" then
lll=rs("Data5")
Else
lll=rs("Data4")
End if
%>
<a href="<%rs("Data1")&"\"&rs("Data2")&"\"&rs("Data3")&"\"&lll%>">你的链接</a>
<%
rs.close
set rs=nothing
conn.close
Set conn=nothing
End if
%>
源代码大致如此,具体你自己改一改就可用了
'先建立connection对象
Set conn=Server.createobject("adodb.connection")
connstr="" '这里connstr请将数据源写上
conn.open connstr
'建立recordset对象
Set rs=Server.createobject("adodb.recordset")
Sql="Select * from table名"
rs.open sql,conn,1,1
If not rs.eof or rs.bof then
If rs("Data5")<>"" then
lll=rs("Data5")
Else
lll=rs("Data4")
End if
%>
<a href="<%rs("Data1")&"\"&rs("Data2")&"\"&rs("Data3")&"\"&lll%>">你的链接</a>
<%
rs.close
set rs=nothing
conn.close
Set conn=nothing
End if
%>
源代码大致如此,具体你自己改一改就可用了
#6
非常感谢各位的热心帮助!我很仔细地看了各位的代码,有一些启发。
我把问题讲细一点:表中有5个字段,前三条产生链接文体(如Data1、Data2、Data3分别为1、1、中国程序员则在一页面中显示 "11 中国程序员" 这个超链接,而这个超链接链接到该条记录的Data4,在另一页面显示其内容。如果Data5有图像,也产生一个链接,链接最好在Data4页面里面,该链接显示图像),后面两个列是链接的内容。当然表中有多条记录要待显示。
读取表中前三字段显示一系列链接,链接显示后面两字段,这个该如何做呢?救救我吧!
我是ASP与SQL的初学者,一开始就是看你们写的ASP,再稍加修改或直接使用,^_^
请继续跟贴,谢谢!
我把问题讲细一点:表中有5个字段,前三条产生链接文体(如Data1、Data2、Data3分别为1、1、中国程序员则在一页面中显示 "11 中国程序员" 这个超链接,而这个超链接链接到该条记录的Data4,在另一页面显示其内容。如果Data5有图像,也产生一个链接,链接最好在Data4页面里面,该链接显示图像),后面两个列是链接的内容。当然表中有多条记录要待显示。
读取表中前三字段显示一系列链接,链接显示后面两字段,这个该如何做呢?救救我吧!
我是ASP与SQL的初学者,一开始就是看你们写的ASP,再稍加修改或直接使用,^_^
请继续跟贴,谢谢!
#7
//Load.asp用于建立与数据库的连结。它将被包含在页面的开始。
//Load.asp======================================================
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Driver={SQL Server};Server=(local);DataBase=xxx;UID=xxx;PWD=xxx"
%>
//Unload.asp用来关闭与数据库的连结。它将被包含在页面的结尾。
//Unload.asp===================================================
<%
if not isEmpty(rs) then
Set rs=Nothing
end if
if not isEmpty(Conn) then
On Error Resume Next
Conn.Close
Set Conn = Nothing
end if
%>
//GetData.asp===================================================
'先将记录值取出,赋值变量
'GetData.asp页面用于从数据库中取出记录值。
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
//ShowData4.asp===================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
szData4 = trim(Request("Value"))
szData5 = trim(Request("img"))
Response.write szData4
if szData5 <> "" then
Response.Write "<img src=""" & szData5 & """>"
end if
%>
</body>
</html>
这里的几个文件“Load.asp、Unload.asp、Getdata.asp、ShowData.asp”请放于同一目录下。
//Load.asp======================================================
<%
Set Conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.RecordSet")
Conn.Open "Driver={SQL Server};Server=(local);DataBase=xxx;UID=xxx;PWD=xxx"
%>
//Unload.asp用来关闭与数据库的连结。它将被包含在页面的结尾。
//Unload.asp===================================================
<%
if not isEmpty(rs) then
Set rs=Nothing
end if
if not isEmpty(Conn) then
On Error Resume Next
Conn.Close
Set Conn = Nothing
end if
%>
//GetData.asp===================================================
'先将记录值取出,赋值变量
'GetData.asp页面用于从数据库中取出记录值。
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
//ShowData4.asp===================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
szData4 = trim(Request("Value"))
szData5 = trim(Request("img"))
Response.write szData4
if szData5 <> "" then
Response.Write "<img src=""" & szData5 & """>"
end if
%>
</body>
</html>
这里的几个文件“Load.asp、Unload.asp、Getdata.asp、ShowData.asp”请放于同一目录下。
#8
Sorry:
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
#9
Sorry:
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
GetData.asp有个小错误,在Do while 循环中的Response.write 后面要加个& "<br>"。这样写出的每条记录都是一行,不然都连在一起了。
就是这样,下面是完整的GetData.asp
<!-- #include file="load.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
Dim sql
Dim szRet
sql = "SELECT Data1,Data2,Data3,Data4,Data5 FROM tab"
rs.Open sql, conn, 1, 1
Do while not rs.EOF
szLink = Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))
szData4 = Trim(rs("Data4"))
szData5 = rs("Data5")
'如果不为空,显示一链结“ShowData4.asp”,显示Data4的内容
If szLink <> "" and szData4 <> "" then
If szData5 = "" then
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
Else
Response.write "<a href=""#"" style=""color: #990000"" onclick=""javascript:open('ShowData4.asp?Value=" & szData4 & "&img=" & szData5 & "','','height=260,width=480,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes');"">" & "ShowData4" & "</a>" & "<br>"
End if
End if
rs.MoveNext
Loop
rs.Close
%>
<!-- #include file="Unload.asp" -->
</body>
</html>
#10
感谢jetplane(喷气飞机) 提供的详细的代码,问题已经颇见明朗。真的很感谢初学ASP与SQL时你们提供的帮助。我说过此问题200分,可是为什么不能再加100分?让我不致于失信吧!它说加上分的话已经超过最大限制了,可是我却看到有好几百分的问题?
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
#11
感谢jetplane(喷气飞机) 提供的详细的代码,问题已经颇见明朗。真的很感谢初学ASP与SQL时你们提供的帮助。我说过此问题200分,可是为什么不能再加100分?让我不致于失信吧!它说加上分的话已经超过最大限制了,可是我却看到有好几百分的问题?
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
另外,jetplane(喷气飞机) 你写的代码szLink = Int(rs( "Data1 ")) & Int(rs( "Data3 ")) & Trim(rs( "Data3 ")) 这一行为什么不能用,而直接写成szLink=rs("Data1") & rs("Data2") & rs("Data3")却行呢?
关于varchar类型的问题,以及image类型的问题,我想问到底该如何把图像(gif,jpeg等)存入数据表字段image中?
请继续跟贴,参与有分,谢谢!
#12
to janhance(IT业边缘的徘徊者):
1、“szLink=Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))”这个语句是我的失误,因为我没看清你的data1/2的类型是“tinyint”,如果字段类型为“int”就可以了。不过没关系,去掉Int()函数后,ASP也可以自动识别数据类型。所以你改用“szLink=rs("Data1") & rs("Data2") & rs("Data3")”也无妨,不过建议rs("Data3")前面加上Trim()函数,这样可以截去首尾的空格。不然有可能取出的数据很长(后面带了一大段空格)。。。。
2、关于“如何把图像(gif,jpeg等)存入数据表字段image中?”答案是,要把图像以它的二进制流文件格式存入数据库。如下:
将上载数据存入数据库
图像的content-type 也存入数据库中(Gif/jpg),以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=wroxdns","user","pass"
然后从连接中创建记录集:
sql = "SELECT PHOTO, CONTENTTYPE FROM MYTABLE"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 3, 3
记录集创建之后,要将二进制数据放入数据库的blob域中:
picturechunk = picture & chrB(0)
rs.Fields("PICTURE").appendChunk picturechunk
rs.Fields("CONTENTTYPE") = contentType
rs.Update
conn.close
在appendChunk 方法中,我不得不解决一个臭虫。事实上当二进制数据有奇数字节时,appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("CONTENTTYPE")
size = rs.Fields("PICTURE").ActualSize
blob = rs.Fields("PICTURE").GetChunk(size)
Response.binarywrite blob
其中“Response.binarywrite blob”可以直接在网页上看到数据库中的图档
OK??
1、“szLink=Int(rs("Data1")) & Int(rs("Data3")) & Trim(rs("Data3"))”这个语句是我的失误,因为我没看清你的data1/2的类型是“tinyint”,如果字段类型为“int”就可以了。不过没关系,去掉Int()函数后,ASP也可以自动识别数据类型。所以你改用“szLink=rs("Data1") & rs("Data2") & rs("Data3")”也无妨,不过建议rs("Data3")前面加上Trim()函数,这样可以截去首尾的空格。不然有可能取出的数据很长(后面带了一大段空格)。。。。
2、关于“如何把图像(gif,jpeg等)存入数据表字段image中?”答案是,要把图像以它的二进制流文件格式存入数据库。如下:
将上载数据存入数据库
图像的content-type 也存入数据库中(Gif/jpg),以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=wroxdns","user","pass"
然后从连接中创建记录集:
sql = "SELECT PHOTO, CONTENTTYPE FROM MYTABLE"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 3, 3
记录集创建之后,要将二进制数据放入数据库的blob域中:
picturechunk = picture & chrB(0)
rs.Fields("PICTURE").appendChunk picturechunk
rs.Fields("CONTENTTYPE") = contentType
rs.Update
conn.close
在appendChunk 方法中,我不得不解决一个臭虫。事实上当二进制数据有奇数字节时,appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("CONTENTTYPE")
size = rs.Fields("PICTURE").ActualSize
blob = rs.Fields("PICTURE").GetChunk(size)
Response.binarywrite blob
其中“Response.binarywrite blob”可以直接在网页上看到数据库中的图档
OK??
#13
1、关于你的结贴,呵呵。。。。。
你可以点击右上角“回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口 ”中的管理,然后在那里面结贴。
2、关于贴子加分:
1、只有贴主才有权力给自己的贴子加分(斑竹也没有权利给别人贴子加分),加分后的上限是贴主可发分的上限
2、非技术区贴子不允许加分
3、贴主所加的分数不可以超过自己所有可用分
4、不能加负分,0分
5、扩充话题区贴子不允许加分
加分方法:点“管理”链接进入帖子,有一个“帖子加分”链接,点击后,在弹出的窗口填入分数,然后点“确定”。
你是新上来玩CSDN吧?还要多看看使用说明噢:)
有问题继续问。我会每半小时至一小时上来关注的。
你可以点击右上角“回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口 ”中的管理,然后在那里面结贴。
2、关于贴子加分:
1、只有贴主才有权力给自己的贴子加分(斑竹也没有权利给别人贴子加分),加分后的上限是贴主可发分的上限
2、非技术区贴子不允许加分
3、贴主所加的分数不可以超过自己所有可用分
4、不能加负分,0分
5、扩充话题区贴子不允许加分
加分方法:点“管理”链接进入帖子,有一个“帖子加分”链接,点击后,在弹出的窗口填入分数,然后点“确定”。
你是新上来玩CSDN吧?还要多看看使用说明噢:)
有问题继续问。我会每半小时至一小时上来关注的。
#14
终于把以前的两个帖子结掉了,这样让我也有种轻松的感觉。^_^
我申请ID很久了,只是这一个月才来看看,真的好多好东西!学习了不少东西!
jetplane(喷气飞机):我想通过一个asp页面将图像存入数据库表(tab)字段image中,当然有帐号和权限审核后才能更新,主要是在本机更新数据。我设想这样一个页面:
用户:________密码:_______
Data1____Data2_____Data3____Data4____Data5_____通过按钮选择图片
要将图片存在Data5这个image字段中,是使用http://www.csdn.net/expert/topic/602/602547.xml?temp=.9119532里面 ssm1226(雨中人)说的那种方法吗?看了他(她)说的,却是几乎一点都不懂。
请问这个问题到底该如何解决?我问一些网友,他们说用二进制存储。但图片难道一定要使用一个什么软件以二进制打开,然后copy到image字段存储起来以供调用??令人迷惑?请继续跟贴,非常感谢!
我申请ID很久了,只是这一个月才来看看,真的好多好东西!学习了不少东西!
jetplane(喷气飞机):我想通过一个asp页面将图像存入数据库表(tab)字段image中,当然有帐号和权限审核后才能更新,主要是在本机更新数据。我设想这样一个页面:
用户:________密码:_______
Data1____Data2_____Data3____Data4____Data5_____通过按钮选择图片
要将图片存在Data5这个image字段中,是使用http://www.csdn.net/expert/topic/602/602547.xml?temp=.9119532里面 ssm1226(雨中人)说的那种方法吗?看了他(她)说的,却是几乎一点都不懂。
请问这个问题到底该如何解决?我问一些网友,他们说用二进制存储。但图片难道一定要使用一个什么软件以二进制打开,然后copy到image字段存储起来以供调用??令人迷惑?请继续跟贴,非常感谢!
#15
呵呵,
其实你的问题是想通过网页的形式上传图片,对不?
想通过网页的形式上传图片一般有两种常用方法:
一种是、通过第三方组件,即要在服务器端安装一个第三方开发的软件(一般为.Dll控件),在网页程序中调用这个第三方组件,上传文件。
二种是、无组件上传,即通过程序来上传文件,一般这需要写一些代码。这种无组件上传比较方便,也基本符合你所说的哪些。
这里先发来两段代码(两个页面)。这两个页面(一个表单、一个是接收页面)会将你上传的图片存入服务器的“C:\”下并命名为“text1.jpg”。当然这只是一个测试,上传文件的路径和文件名你都可以自己改。
先提供你关于上传至路径下的代码,也可以上传至数据库,代码一会提供
上传至文件夹的代码如下:
//======================1.htm===========================
1.htm:
<html>
<body>
<form method="POST" action="1.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="text1" size="20"></p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
</form>
</body>
</html>
//======================1.asp===========================
1.asp
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'将二进制流数据同时写入Uploadfile_Stream这个Stream对象
Set Uploadfile_Stream=CreateObject("Adodb.Stream")
Uploadfile_Stream.mode=3
Uploadfile_Stream.type=1
Uploadfile_Stream.open
Uploadfile_Stream.Write RequestBin
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = PosBeg & "$$" & PosEnd
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
Response.write "表单数据text2:" & text2 & "<br>"
'不过对于上传的文件,即file类型的上传数据。dictionary对象中只保留它们的始/终位置。我们要取出这两个位置,
'然后用Stream对象来分解出。
'将上传文件写入指定目录下。
text1 = UploadRequest.Item("text1").Item("Value")
If instr(1,text1,"$$")>0 then
arrTmpValue = split(text1,"$$")
'起始位置
PosBeg = arrTmpValue(0)
'结束位置
PosEnd = arrTmpValue(1)
If PosBeg < PosEnd then
Set Savefile_Stream=CreateObject("Adodb.Stream")
Savefile_Stream.mode=3
Savefile_Stream.type=1
Savefile_Stream.Open
Uploadfile_Stream.Position = PosBeg -1
Uploadfile_Stream.Copyto Savefile_Stream,(PosEnd - PosBeg)
SavefilePath = "C:\text1.jpg"
Savefile_Stream.SaveToFile SavefilePath,2
Savefile_Stream.Close
Set Savefile_Stream=Nothing
Response.Write "文件上传起始位置:" & PosBeg & "<br>"
Response.Write "文件上传终于位置:" & PosEnd & "<br>"
Else
Response.Write "没有文件上传!"
End if
Else
Response.Write "没有文件上传!"
End if
'------------------------------------
%>
其实你的问题是想通过网页的形式上传图片,对不?
想通过网页的形式上传图片一般有两种常用方法:
一种是、通过第三方组件,即要在服务器端安装一个第三方开发的软件(一般为.Dll控件),在网页程序中调用这个第三方组件,上传文件。
二种是、无组件上传,即通过程序来上传文件,一般这需要写一些代码。这种无组件上传比较方便,也基本符合你所说的哪些。
这里先发来两段代码(两个页面)。这两个页面(一个表单、一个是接收页面)会将你上传的图片存入服务器的“C:\”下并命名为“text1.jpg”。当然这只是一个测试,上传文件的路径和文件名你都可以自己改。
先提供你关于上传至路径下的代码,也可以上传至数据库,代码一会提供
上传至文件夹的代码如下:
//======================1.htm===========================
1.htm:
<html>
<body>
<form method="POST" action="1.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="text1" size="20"></p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
</form>
</body>
</html>
//======================1.asp===========================
1.asp
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'将二进制流数据同时写入Uploadfile_Stream这个Stream对象
Set Uploadfile_Stream=CreateObject("Adodb.Stream")
Uploadfile_Stream.mode=3
Uploadfile_Stream.type=1
Uploadfile_Stream.open
Uploadfile_Stream.Write RequestBin
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = PosBeg & "$$" & PosEnd
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
Response.write "表单数据text2:" & text2 & "<br>"
'不过对于上传的文件,即file类型的上传数据。dictionary对象中只保留它们的始/终位置。我们要取出这两个位置,
'然后用Stream对象来分解出。
'将上传文件写入指定目录下。
text1 = UploadRequest.Item("text1").Item("Value")
If instr(1,text1,"$$")>0 then
arrTmpValue = split(text1,"$$")
'起始位置
PosBeg = arrTmpValue(0)
'结束位置
PosEnd = arrTmpValue(1)
If PosBeg < PosEnd then
Set Savefile_Stream=CreateObject("Adodb.Stream")
Savefile_Stream.mode=3
Savefile_Stream.type=1
Savefile_Stream.Open
Uploadfile_Stream.Position = PosBeg -1
Uploadfile_Stream.Copyto Savefile_Stream,(PosEnd - PosBeg)
SavefilePath = "C:\text1.jpg"
Savefile_Stream.SaveToFile SavefilePath,2
Savefile_Stream.Close
Set Savefile_Stream=Nothing
Response.Write "文件上传起始位置:" & PosBeg & "<br>"
Response.Write "文件上传终于位置:" & PosEnd & "<br>"
Else
Response.Write "没有文件上传!"
End if
Else
Response.Write "没有文件上传!"
End if
'------------------------------------
%>
#16
没有上传图像至数据库表中的建议及代码吗?我想要解决的最主要的问题是--存储图像(上传图像)至数据库表,然后从数据库中读出数据显示在客户端中。
我怎么不能加分啊?
jetplane(喷气飞机) ,那些代码我没怎么弄明白,是头脑太笨了吧!:(
我怎么不能加分啊?
jetplane(喷气飞机) ,那些代码我没怎么弄明白,是头脑太笨了吧!:(
#17
jetplane(喷气飞机) ﹐你真是太棒了﹗﹗﹗
可是為什么要把圖片存在數據庫里啊﹖﹖﹖
其實把圖片名存在數據庫里﹐圖片存在一個目錄里﹐根據名稱建立連接這樣不是好點嗎﹖圖片存在數據庫里不是搞到數據庫很大嗎﹖這樣對存取速度有沒有影響的啊﹖
關注這個問題。
可是為什么要把圖片存在數據庫里啊﹖﹖﹖
其實把圖片名存在數據庫里﹐圖片存在一個目錄里﹐根據名稱建立連接這樣不是好點嗎﹖圖片存在數據庫里不是搞到數據庫很大嗎﹖這樣對存取速度有沒有影響的啊﹖
關注這個問題。
#18
不用太明白,有时候糊涂点好,先照着贴上去,先用着再说。
太多要学的了,等到了前面再回头看一下以前不懂的,然后自然就懂了~~~`
太多要学的了,等到了前面再回头看一下以前不懂的,然后自然就懂了~~~`
#19
一般用什么软件把图片以二进制打开呢?
#20
请继续关注,谢谢!
图片存到数据库中,只是想弄懂这种方法,并没有什么特别的目的,马上要结贴了,请关注。
图片存到数据库中,只是想弄懂这种方法,并没有什么特别的目的,马上要结贴了,请关注。
#21
对于varchar类型的记录,最多可以存储8000个字符,那么image呢?还有就是能否一次读取多余8000个字符的数据,然后用两个varchar字段来存储,具体如何实现?
请关注,谢谢!
请关注,谢谢!
#22
To janhance(IT业边缘的徘徊者):
非常不好意思,自星期五下班前我发了那篇“上传成文件”的代码后,我就下班了。后来因为一直比较忙,也就忘了继续把“上传至数据库”的情况道与您了。今天才看到你的回复。迟复为谦!
其实对于“无组件上传文件”来说,上传至数据库比以文件形式上传要容易。简单的讲就是图片的二进制文件容易从上传的表单数据中分离,但由于在ASP的创建文件函数中只提供了CreatTextFile的方法,而它只能传递ACSII码文件(如TXT档),而对图档这样的二进制文件是不行的。所以我们还要用到其它的对象,如ADODB.Stream对象(但这需要服务器安排有ADO2.5以上的版本,当然现在win服务器基本都是有的);
而上传至数据库,则只要把分离出来的数据写到数据库里就可以了。
不过正如“simpleli(simply)”所说的:一般我们做法都是将图档上传至文件夹下,在数据库只保留有图档的路径。这样一来打开的快。二来数据库的负担也比较轻的。
下面就是上传至数据库的实验代码:
1、上传图档的页面funtest4.htm===================================
<form method="POST" action="futest4rd.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="pic" size="20">
</p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2">
</p>
</form>
2、接收页面funtest4rd.asp=======================================
其中假设有一mdb数据库testdb.mdb,有表“PicTab”
其中有“contenttype(文本类型)”和“picdata(OLE对象类型)”两个字段相当重要,前者是存图档类型的;后者是存图档数据的。
另外分离数据的“BuildUploadRequest”过程与前面的上传成文件的“BuildUploadRequest”也有一个关键的改动(一条语句,但很关键),是关于分离出来的图档的Value的值的(具体的你可以自己去比较一下上传至文件的“BuildUploadRequest”和这里传至数据库的“BuildUploadRequest”,改变的原因可以看上面我谈的上传成文件与传至数据库的不同点。。。。)
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
'============================================================
'数据存入数据库。content-type 也要存入数据库中,以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set rs = Server.CreateObject("ADODB.Recordset")
'然后从连接中创建记录集:
rs.Open "PicTab", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("../db/testdb.mdb"), 2, 2
'记录集创建之后,要将二进制数据放入数据库中:
rs.AddNew
contentType = UploadRequest.Item("pic").Item("ContentType")
rs("contenttype") = contentType
text1 = UploadRequest.Item("pic").Item("Value")
picturechunk = text1 & chrB(0)
rs.Fields("picdata").appendChunk picturechunk
rs.Update
'rs.Close
'Set rs = nothing
'-----------------------
'在appendChunk 方法中,要解决一个臭虫。即当二进制数据有奇数字节时,
'appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
'要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("contenttype")
'
size = rs.Fields("picdata").ActualSize
blob = rs.Fields("picdata").GetChunk(size)
Response.binarywrite blob
rs.Close
Set rs = nothing
'------------------------------------
%>
//=======================================================
另,关于“那些代码我没怎么弄明白”这个问题,你可以参看一下另一篇贴子
“http://www.csdn.net/expert/topic/648/648974.xml?temp=.2759363”在这里面我和另一位朋友有一定的介绍。
还有,关于“ 一般用什么软件把图片以二进制打开呢?”这个问题,其
非常不好意思,自星期五下班前我发了那篇“上传成文件”的代码后,我就下班了。后来因为一直比较忙,也就忘了继续把“上传至数据库”的情况道与您了。今天才看到你的回复。迟复为谦!
其实对于“无组件上传文件”来说,上传至数据库比以文件形式上传要容易。简单的讲就是图片的二进制文件容易从上传的表单数据中分离,但由于在ASP的创建文件函数中只提供了CreatTextFile的方法,而它只能传递ACSII码文件(如TXT档),而对图档这样的二进制文件是不行的。所以我们还要用到其它的对象,如ADODB.Stream对象(但这需要服务器安排有ADO2.5以上的版本,当然现在win服务器基本都是有的);
而上传至数据库,则只要把分离出来的数据写到数据库里就可以了。
不过正如“simpleli(simply)”所说的:一般我们做法都是将图档上传至文件夹下,在数据库只保留有图档的路径。这样一来打开的快。二来数据库的负担也比较轻的。
下面就是上传至数据库的实验代码:
1、上传图档的页面funtest4.htm===================================
<form method="POST" action="futest4rd.asp" name="form1" enctype="multipart/form-data">
<p>
<input type="file" name="pic" size="20">
</p>
<p>
<input type="text" name="text2" size="20">
<input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2">
</p>
</form>
2、接收页面funtest4rd.asp=======================================
其中假设有一mdb数据库testdb.mdb,有表“PicTab”
其中有“contenttype(文本类型)”和“picdata(OLE对象类型)”两个字段相当重要,前者是存图档类型的;后者是存图档数据的。
另外分离数据的“BuildUploadRequest”过程与前面的上传成文件的“BuildUploadRequest”也有一个关键的改动(一条语句,但很关键),是关于分离出来的图档的Value的值的(具体的你可以自己去比较一下上传至文件的“BuildUploadRequest”和这里传至数据库的“BuildUploadRequest”,改变的原因可以看上面我谈的上传成文件与传至数据库的不同点。。。。)
<%
Dim Uploadfile_Stream
Dim RequestBin,iTotBytes
'取得上传的二进制数据
iTotBytes = Request.TotalBytes
'将二进制数据赋值RequestBin
RequestBin = Request.BinaryRead(iTotBytes)
'-------------------------------------------
'以下三个函数用于二进制字符数据(包含中文数据)与字节的相互转化
Private Function getByteString(byval StringStr)
dim char, i
For i = 1 to Len(StringStr)
char = Mid(StringStr, i, 1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function
Public Function getString(byval StringBin)
dim intCount
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
Public Function getStringChinese(ByVal strFrom)
Dim i
Dim l
Dim strTo
Dim ch, cl
l = LenB(strFrom)
i = 1
Do While i <= l
If AscB(MidB(strFrom, i, 1)) <= 127 Then
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
Else
If i + 1 <= l Then
If AscB(MidB(strFrom, i + 1, 1)) > 63 Then
ch = AscB(MidB(strFrom, i, 1))
cl = AscB(MidB(strFrom, i + 1, 1))
strTo = strTo + Chr(ch * 256 + cl)
i = i + 1
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
Else
strTo = strTo + ChrW(AscB(MidB(strFrom, i, 1)))
End If
End If
i = i + 1
Loop
getStringChinese = strTo
End Function
'-------------------------------------------
'BuildUploadRequest用于分离上传的表单数据。
Public Sub BuildUploadRequest(byref RequestBin, byref UploadRequest)
dim PosBeg, PosEnd, boundary, boundaryPos, Pos, Name, PosFile
dim PosBound, FileName, ContentType, Value, sEncType, sReqMeth
dim tmphash, isfile
'zero byte check
if lenb(RequestBin) = 0 then
exit sub
end if
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
if posend = 0 then
BuildUploadRequest_ASCII getString(requestbin), UploadRequest
Exit Sub
end if
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = Server.CreateObject("Scripting.Dictionary")
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition"))
Pos = InstrB(Pos,RequestBin,getByteString("name="))
PosBeg = Pos+6
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
Name = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
isfile = false
If PosFile<>0 AND (PosFile<PosBound) Then
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
isfile = true
Else
Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
PosBeg = Pos+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = getStringChinese(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
isfile = false
End If
UploadControl.Add "Value" , Value
UploadControl.Add "InputName", Name
If not uploadrequest.exists(name) then
UploadRequest.Add name, UploadControl
Else
If not isfile then
Set tmphash = uploadrequest(name)
tmphash("Value") = tmphash("Value") & ", " & Value
Set uploadrequest(name) = tmphash
End if
End if
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop
End Sub
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
'调用BuildUploadRequest,获取各表单数据。
BuildUploadRequest RequestBin,UploadRequest
'数据被分解并存储在dictionary对象中,并用Item() 方法恢复。
'这些item 数据可以保存在VBScript 变量中,并且可以在代码的任何地方使用。
'数据可以作为响应传送回客户机,或用在ASP代码中,或写进文件中及放入数据库中。取回数据
'UploadRequest 对象的普通数据可用Item("key") 函数进行存取。
'现在来考虑一下这样的情况:要存取你要的text2控制的值。可以这样做:
text2 = UploadRequest.Item("text2").Item("Value")
'============================================================
'数据存入数据库。content-type 也要存入数据库中,以便以后显示数据。首先要建立与数据库的连接,假定已经设置了适当的DSN:
Set rs = Server.CreateObject("ADODB.Recordset")
'然后从连接中创建记录集:
rs.Open "PicTab", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("../db/testdb.mdb"), 2, 2
'记录集创建之后,要将二进制数据放入数据库中:
rs.AddNew
contentType = UploadRequest.Item("pic").Item("ContentType")
rs("contenttype") = contentType
text1 = UploadRequest.Item("pic").Item("Value")
picturechunk = text1 & chrB(0)
rs.Fields("picdata").appendChunk picturechunk
rs.Update
'rs.Close
'Set rs = nothing
'-----------------------
'在appendChunk 方法中,要解决一个臭虫。即当二进制数据有奇数字节时,
'appendChunk 方法就不传送最后一个字节。解决的办法是增加一个chr(0),以确保传送了所有的字节。
'要得到数据库的映象,使用相同的记录集,并用正确的内容类型将它作为响应发送回客户机。
Response.contentType = rs.Fields("contenttype")
'
size = rs.Fields("picdata").ActualSize
blob = rs.Fields("picdata").GetChunk(size)
Response.binarywrite blob
rs.Close
Set rs = nothing
'------------------------------------
%>
//=======================================================
另,关于“那些代码我没怎么弄明白”这个问题,你可以参看一下另一篇贴子
“http://www.csdn.net/expert/topic/648/648974.xml?temp=.2759363”在这里面我和另一位朋友有一定的介绍。
还有,关于“ 一般用什么软件把图片以二进制打开呢?”这个问题,其
#23
To jetplane(喷气飞机):
好些天没有上来瞧了,看到你发的帖子真是很高兴。能在csdn上得到你的帮助让我不知道怎么感谢你才好!在读书的时候我几乎从不问老师问题的,也不知道为什么,呵呵。懵懵懂懂的读了十几年书,在很多问题上都是一知半解。
我还有好多问题呢。我到时发贴,还请你多多关照咯!
jetplane(喷气飞机),可以发一些学习ASP的资料给我吗?我的EMAIL:janhance@163.net
特别需要表单和图像同一个页面提交的代码。我在csdn上发现不少这方面的帖子,csdn上有篇文章有介绍(http://www.csdn.net/expert/topic/647/647755.xml?temp=.6268732)。我另外也下载了几个进行试验,有些挺成功的。这几天一直在看网上的关于图像提交到数据库的帖子,不过有些关于流方面的语句及其相关东西很难看懂,一般没有注释,也没有找到有关参考书。
我还有问题的话,会继续发贴,我等着你的回答哦。
好些天没有上来瞧了,看到你发的帖子真是很高兴。能在csdn上得到你的帮助让我不知道怎么感谢你才好!在读书的时候我几乎从不问老师问题的,也不知道为什么,呵呵。懵懵懂懂的读了十几年书,在很多问题上都是一知半解。
我还有好多问题呢。我到时发贴,还请你多多关照咯!
jetplane(喷气飞机),可以发一些学习ASP的资料给我吗?我的EMAIL:janhance@163.net
特别需要表单和图像同一个页面提交的代码。我在csdn上发现不少这方面的帖子,csdn上有篇文章有介绍(http://www.csdn.net/expert/topic/647/647755.xml?temp=.6268732)。我另外也下载了几个进行试验,有些挺成功的。这几天一直在看网上的关于图像提交到数据库的帖子,不过有些关于流方面的语句及其相关东西很难看懂,一般没有注释,也没有找到有关参考书。
我还有问题的话,会继续发贴,我等着你的回答哦。
#24
有相关贴子,欢迎各位去:http://www.csdn.net/expert/topic/674/674728.xml?temp=.2518885
#25
有相关贴子,欢迎各位去:http://www.csdn.net/expert/topic/675/675768.xml?temp=.8812372