如何读取一个数据表的几个字段形成超链接,链接显示表中的另外一个字段的内容?

时间:2022-11-15 15:29:27
使用sql server 2000数据库,建表为:
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
%>

#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
%>

#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>,在这个页面中,你必须显示你的图像。
不知道是不是你的想法。
要结贴点击标题另边的“管理”,进入即可给分

#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
%>

源代码大致如此,具体你自己改一改就可用了

#6


非常感谢各位的热心帮助!我很仔细地看了各位的代码,有一些启发。

我把问题讲细一点:表中有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”请放于同一目录下。

#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>

#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>

#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中?

请继续跟贴,参与有分,谢谢!

#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中?

请继续跟贴,参与有分,谢谢!

#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??

#13


1、关于你的结贴,呵呵。。。。。
你可以点击右上角“回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口 ”中的管理,然后在那里面结贴。

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字段存储起来以供调用??令人迷惑?请继续跟贴,非常感谢!

#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
'------------------------------------
%>

#16


没有上传图像至数据库表中的建议及代码吗?我想要解决的最主要的问题是--存储图像(上传图像)至数据库表,然后从数据库中读出数据显示在客户端中。

我怎么不能加分啊?

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”在这里面我和另一位朋友有一定的介绍。

还有,关于“ 一般用什么软件把图片以二进制打开呢?”这个问题,其

#23


To jetplane(喷气飞机):
     
    好些天没有上来瞧了,看到你发的帖子真是很高兴。能在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
%>

#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
%>

#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>,在这个页面中,你必须显示你的图像。
不知道是不是你的想法。
要结贴点击标题另边的“管理”,进入即可给分

#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
%>

源代码大致如此,具体你自己改一改就可用了

#6


非常感谢各位的热心帮助!我很仔细地看了各位的代码,有一些启发。

我把问题讲细一点:表中有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”请放于同一目录下。

#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>

#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>

#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中?

请继续跟贴,参与有分,谢谢!

#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中?

请继续跟贴,参与有分,谢谢!

#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??

#13


1、关于你的结贴,呵呵。。。。。
你可以点击右上角“回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口 ”中的管理,然后在那里面结贴。

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字段存储起来以供调用??令人迷惑?请继续跟贴,非常感谢!

#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
'------------------------------------
%>

#16


没有上传图像至数据库表中的建议及代码吗?我想要解决的最主要的问题是--存储图像(上传图像)至数据库表,然后从数据库中读出数据显示在客户端中。

我怎么不能加分啊?

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”在这里面我和另一位朋友有一定的介绍。

还有,关于“ 一般用什么软件把图片以二进制打开呢?”这个问题,其

#23


To jetplane(喷气飞机):
     
    好些天没有上来瞧了,看到你发的帖子真是很高兴。能在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