问遍了全天下的asp程序员都不会的问题!
具体情况是这样的:数据库是sql server2000,存储图片的字段类型是image.
数据库里的图片使用一个办公软件存储进去的,现在需要用网页的方式把它读取出来,但是这个方法读取不出来,
<%
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
Response.ContentType = "image/gif"
Set rs= Server.CreateObject("ADODB.Recordset")
rs.open "select * from news where id="&Request.QueryString("id"),conn,1,2
Response.BinaryWrite rs("pic")
Response.End
%>
后来我看了一下,字段里包含了一些这样的信息:
C:\DOCUME~1\81187\桌面\电网快迅\1.jpg,是不是因为存在这样的东西我才读取不出来,请各位高手帮帮忙!
问题点数:70、回复次数:73Top
1 楼possible_Y(████本人签名需要刮开,方可看到 )回复于 2003-12-02 13:01:25 得分 0
是以二进制方式存入数据库的吗?Top
2 楼yliang82()回复于 2003-12-02 13:06:20 得分 0
是,Top
3 楼yliang82()回复于 2003-12-02 13:08:04 得分 0
不好意思,这个问题我问过,但是没有什么人理我,所以我才有重新发了一遍!Top
4 楼Tal(Tal)回复于 2003-12-02 13:08:58 得分 0
你没把文件信息分出来
含文件名等Top
5 楼cuipi2003(脆皮)回复于 2003-12-02 13:09:10 得分 0
既然都不会,那么我就算会,现在也不会了Top
6 楼yliang82()回复于 2003-12-02 13:15:38 得分 0
是别人存进去的,我没有办法让他去改他的程序!
cuipi2003(冰) 别这么说,起这个名只是想引起大家的注意,没别的意思!帮帮我吧!Top
7 楼cloudchen(cloudchen)回复于 2003-12-02 13:18:08 得分 0
rs("pic").getChunk(rs("pic").ActualSize)
Top
8 楼yliang82()回复于 2003-12-02 13:30:36 得分 0
rs("pic").getChunk(rs("pic").ActualSize)
这个方式读出的是乱码!Top
9 楼13617650029(酒瓶子)回复于 2003-12-02 13:30:55 得分 0
Set rs=Server.CreateObject("ADODB.recordset")
sql="select * from 表 where id=" & trim(request("id"))
rs.open sql,Conn,1,1
Response.ContentType = rs("fileContentType")
Response.BinaryWrite rs("content").getChunk(7500000)
Top
10 楼cuipi2003(脆皮)回复于 2003-12-02 13:31:12 得分 10
function dl(f,n)
on error resume next
Set S=CreateObject("Adodb.Stream")
S.Mode=3
S.Type=1
S.Open
S.LoadFromFile(f)
if Err.Number>0 then
Response.Status="404"
else
Response.ContentType="application/octet-stream"
Response.AddHeader "Content-Disposition:","attachment; filename=" & n
Range=Mid(Request.ServerVariables("HTTP_RANGE"),7)
if Range="" then
Response.BinaryWrite(S.Read)
else
S.position=Clng(Split(Range,"-")(0))
Response.BinaryWrite(S.Read)
End if
end if
Response.End
end function
函数使用示例:
call dl(Server.MapPath("../download/07.zip"),"07.zip")
以前在csdn上看到的
估计你掉了些东西
Response.ContentType="application/octet-stream"
Response.AddHeader "Content-Disposition:","attachment; filename=" & n
Range=Mid(Request.ServerVariables("HTTP_RANGE"),7)Top
11 楼yliang82()回复于 2003-12-02 13:55:34 得分 0
好晕,而且还有这个
call dl(Server.MapPath("../download/07.zip"),"07.zip")
Top
12 楼yliang82()回复于 2003-12-02 14:46:07 得分 0
大家帮帮忙好吗!Top
13 楼lnpgc(比尔)回复于 2003-12-02 14:52:41 得分 0
你的id是什么类型啊?
如果是字符型那应该写成:N''
如果是数字类型那应该写成:''
你写的不伦不类.sql server中不可能有id=125这种语句啊,你试一下.
Top
14 楼yliang82()回复于 2003-12-02 15:00:04 得分 0
lnpgc(比尔)这个和读取图片有直接联系吗!
不过你倒是说出了另一个问题:“如果是字符型那应该写成:N''“具体怎么写?Top
15 楼yliang82()回复于 2003-12-02 15:37:33 得分 0
难道真的很难吗!Top
16 楼snakegod(蛇姬)回复于 2003-12-02 20:04:57 得分 0
晕 楼主以后少用这种低级的激将法 什么狗屁问题 也值得问
Top
17 楼yliang82()回复于 2003-12-02 21:04:13 得分 0
为什么在这么有名的网站里还会出现snakegod(蛇姬) 这样的人,真不明白!
也许你编程序很牛,所以你就觉得这种问题不值得问。那么我问你,你就没有不会的时候吗?
你的问题在那些会的人眼里就不是你所谓的“什么狗屁问题”嘛!
你刚开始的时候就什么都会吗!请你先提高一下自己的素质好吗!Top
18 楼alexzhang00(三角猫)回复于 2003-12-02 21:18:58 得分 0
楼主又提出来了?
我上次给你答过了,你的 IMAGE字段里,并不完全是 图片信息,还有其他信息,而这种格式是我们所不了解的,你用PB存的,也不知又存了什么附加信息在里面,我也是 爱莫能助啊
你不要着急Top
19 楼yliang82()回复于 2003-12-02 21:35:32 得分 0
alexzhang00(三角猫(sjcatsoft)) 谢谢你的关心呀!
我前几天在qq上问了一个人,他只点了几点就走了,他是这么说的:
根据规律查找啊。
比如,如果是多了第一行,可以用instrb(data, chrb(13))找到第一个回车位置,然后用mid或right函数截掉。
但是我不知道从何处下手!
Top
20 楼alexzhang00(三角猫)回复于 2003-12-02 22:08:07 得分 0
这样吧,你弄几个 那个字段的 二进制代码,发给我,我帮你分析一下
sjcatsoft@163.com
但我不保证一定能解决Top
21 楼alexzhang00(三角猫)回复于 2003-12-02 22:09:59 得分 0
还是这样吧
你导几条数据到 ACCESS数据库,然后把库发我吧Top
22 楼hillhero789(丘)回复于 2003-12-02 23:05:28 得分 0
把数据库的pic读出来然后分离,或者直接就在入库前分离。
具体如何分离可以看看无组件上传的例子Top
23 楼xxrl(孔曰成仁,孟曰取媳妇-->她太有才了)回复于 2003-12-03 09:18:08 得分 0
只能编写那个办公软件的工具在写一个能够嵌入到网页中的去读取数据库里面的图片格式,然后显示,Top
24 楼maxroc()回复于 2003-12-03 09:45:53 得分 0
数据写入的时候他会检测你的文件长度,如果是奇数就在后面补加一个字节,这样就破坏了文件的结构,可能是数据库二进制存储特有的要求吧,你可以在打开文件的时候或则,使写入文件的时候去掉最后的那个字节,就可以了。Top
25 楼tiantangyrb(天堂土老帽)回复于 2003-12-03 09:48:39 得分 0
很简单
Response.ContentType = "image/*"
Response.BinaryWrite rec("pic").getChunk(7500000)
Top
26 楼yliang82()回复于 2003-12-03 10:43:30 得分 0
tiantangyrb(天堂土老帽)你说的方法我试过,不行.
maxroc怎么写呀?能帮我写个例子吗?写入图片是已经没办法修改了,只能是在读取的时候了。但是我不知道怎么写。帮帮忙!Top
27 楼shenqiwei2000(fjqiwei)回复于 2003-12-03 11:01:38 得分 0
把办公软件存放图片的路径找到就可以了Top
28 楼lnpgc(比尔)回复于 2003-12-03 11:39:46 得分 0
如果你其他的都没有问题,应该是我说的那种情况.你改一下试试Top
29 楼yliang82()回复于 2003-12-03 12:15:08 得分 0
lnpgc(比尔) :“如果是字符型那应该写成:N''“具体怎么写?能写一下吗?
Top
30 楼yliang82()回复于 2003-12-03 20:24:16 得分 0
绝望了!Top
31 楼bluemind(graymind)回复于 2003-12-03 20:45:19 得分 0
lnpgc(比尔) :“如果是字符型那应该写成:N''“具体怎么写?能写一下吗?
他指的是保存时,定义成nvarchar or nchar则保存时写成N'
Top
32 楼yliang82()回复于 2003-12-03 21:11:28 得分 0
为什么这段代码报:Microsoft VBScript 运行时错误 错误 '800a0005'
无效的过程调用或参数: 'leftb'
<!-- #include file="common.inc" -->
<%
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
Response.ContentType = "image/jpg"
sid=Request.QueryString("id")
Set rs= Server.CreateObject("ADODB.Recordset")
rs.open "select * from xinxi_mishuchu where code="&sid,conn,1,1
formsize=rs("picture1").ActualSize
formdata= rs("picture1").getchunk(rs("picture1").actualsize)
bncrlf=chrB(13) & chrB(10)
divider=leftb(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf & bncrlf)+4
response.write datastart
Response.End
%>
<html>
<head>
<title>显示数据库图片</title>
</head>
<body>
</body>
</html>Top
33 楼liwb(初学者)回复于 2003-12-03 21:34:45 得分 0
Response.BinaryWrite rs("pic").getchunk(size)
size为文件大小,可以不用Top
34 楼bluemind(graymind)回复于 2003-12-03 22:02:45 得分 0
instrb(formdata,bncrlf)-1<0,所以clng()报错Top
35 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-03 22:39:30 得分 0
全天下的asp程序员都不会的问题??
想来砸场吗?
不理你Top
36 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2003-12-03 22:40:44 得分 0
全天下的asp程序员都不会的问题??
想来砸场吗?
不理你Top
37 楼yliang82()回复于 2003-12-04 08:57:13 得分 0
superdullwolf(超级大笨狼) 别这么说,起这个名只是想引起大家的注意,没有砸场的意思,再说了,我有什么资格砸呀。帮帮我吧!
Top
38 楼liuchuntao(世寒)回复于 2003-12-04 09:00:53 得分 0
以后凡是楼主提出的问题 我们都别回答!Top
39 楼shuzai()回复于 2003-12-04 09:05:24 得分 0
真的不会,楼主太利害了Top
40 楼yliang82()回复于 2003-12-04 09:22:53 得分 0
完了,我引起公愤了!Top
41 楼Tal(Tal)回复于 2003-12-04 09:30:06 得分 0
别人写的你可取出来
再重新从中去掉多于的部份即可
有一定规陆可寻的
有分格符Top
42 楼yliang82()回复于 2003-12-04 09:33:20 得分 0
Tal(Tal)我也知道是这个意思,但是我就是不会写呀!帮帮忙吧!
今天已经被催了!Top
43 楼lwgyewen()回复于 2003-12-04 09:45:24 得分 0
i am sorry i don't knowTop
44 楼Tal(Tal)回复于 2003-12-04 10:13:49 得分 0
我有点忙,看明天有空再给你写吧
你把数据库中的二进制先转换成字符串看看吧
很简单的
我有程序
你可一参看无组件上船的Top
45 楼inelm(木野狐)回复于 2003-12-04 22:04:49 得分 0
在数据库中用 OLE 对象的形式保存图片时, 有可能会存进去多余的文件名等信息。(我知道 access 是这样的, 但是 sql server 是不是也这样就不清楚了), 这时就需要
需要逐个字节的读取, 跳过开始的 SOI marker, 对于 jpeg 格式而言,这个值是 FFD8, bmp 格式的图片是 424D.
也就是说, 你要先将那个字段逐字节的读到 SOI marker 处, 然后开始输出的才是真正的图片内容。Top
46 楼yaozhg(网站开发架构师)回复于 2003-12-04 22:06:34 得分 0
我真的不会呀,没试过存入数据库.Top
47 楼inelm(木野狐)回复于 2003-12-04 22:15:07 得分 0
我想尝试一下解决你这个问题Top
48 楼bear6(bear)回复于 2003-12-04 22:17:19 得分 0
关键在于判断文件类型
估计你的文件不止是图片
Top
49 楼inelm(木野狐)回复于 2003-12-04 22:22:35 得分 0
你的 sql 数据库大不大, 不大的话发给我看看。
mark@weiqi.netTop
50 楼yliang82()回复于 2003-12-05 09:37:37 得分 0
inelm(Archimond 【阿克蒙德】)我已经给你发过去了!Top
51 楼qing205(君不见)回复于 2003-12-05 10:26:11 得分 0
比较一下 在存进数据库之前与之后的图片数据 试试这样行不?Top
52 楼flying310(林林)回复于 2003-12-05 10:31:12 得分 0
我有个例子,你可以看看参考一下.也许有帮助.
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
dim rs
dim cn
dim sql
set rs=server.CreateObject("adodb.recordset")
set cn=Server.CreateObject("ADODB.Connection")
cn.Open "数据库名", "sa","你的密码"
sql="SELECT * FROM pic WHERE imageid = '" & Request.Item("tmid") & "'"
rs.Open sql,cn,1,1
'set rsTemp1=server.CreateObject("Adodb.recordset")
'rsTemp1.open strSQL,Con,3,2
'filesize=rsTemp1("filesize")
Response.ContentType="image/gif"
'Response.BinaryWrite content
'response.contenttype="x-mixed-replace"
Response.BinaryWrite rs("image")
'Response.BinaryWrite content
rs.Close
cn.close
set cn=nothingTop
53 楼inelm(木野狐)回复于 2003-12-05 12:51:47 得分 0
你发给我的文件没用啊, 兄弟。
你在 sql server 中把数据库分离,然后把对应的那个 .mdf 文件发给我。Top
54 楼yliang82()回复于 2003-12-05 13:15:23 得分 0
可以用呀,我是完全备份的。
你强制还原就可以了Top
55 楼yliang82()回复于 2003-12-05 13:28:08 得分 0
我又给你发了一个.mdf的。Top
56 楼yliang82()回复于 2003-12-05 21:03:39 得分 0
失望and绝望中!Top
57 楼inelm(木野狐)回复于 2003-12-05 22:23:59 得分 0
我用 delphi 做了个小程序分析了一下, 的确就是我上面说的原因。 看到部分图片了, 是 jpg 格式的,是一些领导人视察的照片。 但是中间有些图片格式不对,无法读取。
下面我考虑一下如何用 asp 跳过开始的部分。Top
58 楼inelm(木野狐)回复于 2003-12-05 23:25:26 得分 0
搞定! 以下代码调试通过, 可以输出一切 jpeg 格式的图片
<%
'----------------------------------------------------------
' 函数:function JpegStartAt(arr)
' 作者: inelm(Archimond【阿克蒙德】) from csdn
' Date: 2003-12-5
' 功能: 取得保存 jpeg 图片的字节数组中的 SOI marker 开始位置。
' 注: jpeg 格式的 SOI marker : FFD8
' bmp 格式:424D
' 参数: 字节数组
' 返回值: SOI marker 的位置
'-----------------------------------------------------------
function JpegStartAt(arr)
dim i
for i = lbound(arr) to ubound(arr)
if AscB(arr(i)) = &HFF and AscB(arr(i + 1)) = &HD8 then
JpegStartAt = i
exit function
end if
next
end function
'-------- 主程序开始 -------------
dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=123;Data Source=MARK")
sql = "select * from xinxi_mishuchu"
set rs = conn.execute(sql)
'要输出字段的总字节数
size = rs("picture1").ActualSize
dim a()
redim a(size - 1)
'把图片字段的内容逐字节的复制到数组中
for i = 0 to size - 1
a(i) = MidB(rs("picture1"), i + 1, 1)
next
'求得 SOI marker 开始的位置
start = JpegStartAt(a)
'忽略前面的无用信息, 从 SOI marker 开始输出真正的图片信息
response.buffer = true
response.clear
response.ContentType = "image/jpeg"
for j = start to size - 1
response.BinaryWrite a(j)
next
'打完收功!
rs.close : set rs = nothing
conn.close : set conn = nothing
%>
Top
59 楼inelm(木野狐)回复于 2003-12-06 00:49:28 得分 0
接着我又尝试把上面的代码写到一个函数里, 用图片字段作为传入参数, 但不知何故,这样做的结果是输出了一堆的无效字符。
只好等有空再改进了。Top
60 楼yliang82()回复于 2003-12-06 17:26:22 得分 0
inelm(Archimond 【阿克蒙德】)
太感谢你了,这么晚还在帮我研究!
终于看到希望了!Top
61 楼99percent(大鱼大肉)回复于 2003-12-06 18:12:32 得分 0
http://www.ld100.com/nicky/i_center/i_article.asp?id=29&action=news&title=猜问题
你以为是这个吗?
欢迎来友情链接。Top
62 楼yliang82()回复于 2003-12-06 21:32:14 得分 0
inelm(Archimond 【阿克蒙德】)
有两个问题:
1.是不是因为执行程序的时候要“把图片字段的内容逐字节的复制到数组中
”所以执行的时候很慢,在你那里慢吗?我这里很慢。
2.if AscB(arr(i)) = &HFF and AscB(arr(i + 1)) = &HD8 then这句话是不是用来判断是不是jpg格式的?那么如果要是gif或bmp的怎么写?
Top
63 楼inelm(木野狐)回复于 2003-12-06 22:11:59 得分 0
1. 复制到数组这一步是没有必要的, 我开始为了调试方便这样写的。 我又做了一点修改, 修改后的因为不需要复制,速度会提高很多。下面我将贴出修改后的源代码。
2. 这句话是用来找到 jpeg 图片文件的内容开始的位置。 jpeg 图片文件开始的位置有一个 SOI marker , 其值是 FF D8 . 其他的一些文件格式也有类似的标志。你用 UltraEdit 打开一个 jpeg 文件就可以看的一清二楚。 下面是我找到的其他一个文件格式的资料:
What are the format identifiers of some popular file formats?
--------------------------------------------------------------------------------
Here are a few algorithms that you can use to determine the format of a
graphics file at run-time.
GIF: The first six bytes of a GIF file will be the byte pattern of
474946383761h ("GIF87a") or 474946383961h ("GIF89a").
JFIF: The first three bytes are ffd8ffh (i.e., an SOI marker followed
by any marker). Do not check the fourth byte, as it will vary.
JPEG: The first three bytes are ffd8ffh (i.e., an SOI marker followed
by any marker). Do not check the fourth byte, as it will vary.
This works with most variants of "raw JPEG" as well.
PNG: The first eight bytes of all PNG files are 89504e470d0a1a0ah.
SPIFF: The first three bytes are ffd8ffh (i.e., an SOI marker followed
by any marker). Do not check the fourth byte, as it will vary.
Sun: The first four bytes of a Sun Rasterfile are 59a66a95h. If you have
accidentally read this identifier using the little-endian byte order
this value will will be read as 956aa659h.
TGA: The last 18 bytes of a TGA Version 2 file is the string
"TRUEVISION-XFILE.\0". If this string is not present, then the file
is assumed to be a TGA Version 1 file.
TIFF: The first four bytes of a big-endian TIFF files are 4d4d002ah and
49492a00h for little-endian TIFF files.
Top
64 楼inelm(木野狐)回复于 2003-12-06 22:23:34 得分 0
我修改后的代码:
<%
'-------------------------------------------------------------------------------------
' 函数:function ShowJpegField(field)
' 作者: inelm(Archimond【阿克蒙德】) from csdn
' Date: 2003-12-6 更新
' 功能: 取得保存 jpeg 图片的字节数组中的 SOI marker 开始位置, 并从该位置输出真正的图片信息
' 注: jpeg 格式的 SOI marker : FFD8
' bmp 格式:424D
' 参数: 图片字段
' 返回值: 无
' 调用范例:ShowJpegField(rs("picture1"))
' 注意: 调用此函数之前, 需要先申明 response.write 的 MIME 类型为 "image/jpeg"
'-------------------------------------------------------------------------------------
function ShowJpegField(field)
dim size, i, j
'要输出字段的总字节数
size = field.ActualSize
'循环找到 SOI marker 的位置
for i = 1 to size
if AscB(MidB(field, i, 1)) = &HFF and AscB(MidB(field, i + 1, 1)) = &HD8 then
exit for
end if
next
'忽略前面的无用信息, 从 SOI marker 开始输出真正的图片信息
for j = i to size
response.BinaryWrite MidB(field, j, 1)
next
end function
%>
<%
'-------- 主程序开始 ------------------------------
dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=123;Data Source=MARK")
sql = "select * from xinxi_mishuchu"
set rs = conn.execute(sql)
'声明输出类型, 清空输出缓冲区
response.buffer = true
response.clear
response.ContentType = "image/jpeg"
'调用函数输出图片
ShowJpegField(rs("picture1"))
'打完收功!
rs.close : set rs = nothing
conn.close : set conn = nothing
%>Top
65 楼nhconch(天蝎蝴蝶)回复于 2003-12-07 01:18:59 得分 0
不知道别人存进去时的算法,你怎么瞎猜也没用。Top
66 楼inelm(木野狐)回复于 2003-12-07 01:55:47 得分 0
==> 存进去时的算法,你怎么瞎猜也没用。
----------------------------------------
以上代码是我用楼主发过来的数据库调试通过的。Top
67 楼yliang82()回复于 2003-12-07 13:41:24 得分 0
不好意思,为什么在我这里还是很慢,是不是和我的服务器有关?
在你那里慢嘛?Top
68 楼yliang82()回复于 2003-12-07 14:55:14 得分 0
我又试了一遍,速度的确提高了很多,但还是有点慢。是不是这已经算快的了?Top
69 楼inelm(木野狐)回复于 2003-12-07 16:36:47 得分 0
速度还可以啊Top
70 楼inelm(木野狐)回复于 2003-12-07 16:39:22 得分 0
如果谁有更好的办法也请赐教.Top
71 楼yliang82()回复于 2003-12-07 21:02:20 得分 0
inelm(Archimond 【阿克蒙德】)
不是每条纪录都有图片吧。?
总字节数=6144的是不是就没有呀。
Top
72 楼inelm(木野狐)回复于 2003-12-07 22:21:04 得分 60
你的数据库有问题, 图片不全是 jpeg 的。 我估计是含有其他格式的图片, 要么就是图片数据被损坏了。Top
73 楼yliang82()回复于 2003-12-08 09:21:51 得分 0
好的。Top




