ASP如何上传图片,并且可以添加图片说明

ASP如何上传图片,并且可以添加图片说明,第1张

用ASP编写网站应用程序时间长了,难免会遇到各式各样的问题,其中关于如何上传文件到服

务器恐怕是遇见最多的问题了,尤其是上传,比如你想要在自己的社区里面实现类似网易

虚拟社区 提供的“每日一星”的功能,就要提供给网友上传照片的功能。上传文件到服务

器可以使用各种免费的文件上传组件,使用起来功能虽然很强大,但是由于很多情况下,我们

只能使用免费的支持ASP的空间或者租用别人的虚拟空间,对于第一种情况,我们根本就没

有可能来使用文件上传组件;至于第二种情况,我们也要付出不少的“银子”才可以。除非你

拥有自己的虚拟主机,你就可以随便的在服务器上面安装自己所需要的组件,这种情况对于大

多数人来说是可望而不可及的。那我们就没有办法了吗?呵呵,答案是肯定的(当然是肯定的

了,要不然我也没法写出这篇文章啊)。下面就让我们一起来使用纯ASP代码来实现的

上传以及保存到数据库的功能(顺便也实现显示数据库中的到网页上的功能)。

首先我们先来熟悉一下将要使用的对象方法。我们用来获取上一个页面传递过来的数据一

般是使用Request对象。同样的,我们也可以使用Request对象来获取上传上来的文件数据,使

用的方法是RequestBinaryRead()。而我们要从数据库中读出来的数据显示到网页上面要

用到的方法是:

RequestBinaryWrite()。在我们得到了的数据,要保存到数据库中的时候,不可以直接

使用Insert语句对数据库进行 *** 作,而是要使用ADO的AppendChunk方法,同样的,读出数据库

中的数据,要使用GetChunk方法。各个方法的具体语法如下:

RequestBinaryRead语法:

variant=RequestBinaryRead(count)

参数

variant

返回值保存着从客户端读取到数据。

count

指明要从客户端读取的数据量大小,这个值小于或者等于使用方法RequestTotalBytes得到的

数据量。

RequestBinaryWrite语法:

RequestBinaryWritedata

参数

data

要写入到客户端浏览器中的数据包。

RequestTotalBytes语法:

variant=RequestTotalBytes

参数

variant

返回从客户端读取到数据量的字节数。

AppendChunk语法

将数据追加到大型文本、二进制数据Field或Parameter对象。

objectAppendChunkData

参数

objectField或Parameter对象

Data变体型,包含追加到对象中的数据。

说明

使用Field或Parameter对象的AppendChunk方法可将长二进制或字符数

据填写到对象中。在系统内存有限的情况下,可以使用AppendChunk方法对长整型值进行

部分而非全部的 *** 作。

GetChunk语法

返回大型文本或二进制数据Field对象的全部或部分内容。

variable=fieldGetChunk(Size)

返回值

返回变体型。

参数

Size长整型表达式,等于所要检索的字节或字符数。

说明

使用Field对象的GetChunk方法检索其部分或全部长二进制或字符数据。在系统内存有限

的情况下,可使用GetChunk方法处理部分而非全部的长整型值。

GetChunk调用返回的数据将赋给“变量”。如果Size大于剩余的数据,则

GetChunk仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则

GetChunk方法返回Null。

每个后续的GetChunk调用将检索从前一次GetChunk调用停止处开始的数据。但是,如果从

一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO将认为已从第一个字段

中检索出数据。如果在第一个字段上再次调用GetChunk方法,ADO将把调用解释为新的GetChu

nk *** 作并从记录的起始处开始读取。如果其他Recordset对象不是首个Recordset对象的副本,

则访问其中的字段不会破坏GetChunk *** 作。

如果Field对象的Attributes属性中的adFldLong位设置为True,则可以对该字段使用GetChun

k方法。

如果在Field对象上使用Getchunk方法时没有当前记录,将产生错误3021(无当前记录)。

接下来,我们就要来设计我们的数据库了,作为测试我们的数据库结构如下(Access200

0):

字段名称 类型 描述

id 自动编号 主键值

img OLE对象 用来保存数据

对于在MSSQLServer7中,对应的结构如下:

字段名称 类型 描述

id int(Identity) 主键值

img image 用来保存数据

现在开始正式编写我们的纯ASP代码上传部分了,首先,我们有一个提供给用户的上传界面

,可以让用户选择要上传的。代码如下

(uploadhtm):

<html>

<body>

<center>

<form name="mainForm" enctype="multipart/form-data" action="processasp" method=p

ost>

<inputtype=filename=mefile><br>

<inputtype=submitname=okvalue="OK">

</form>

</center>

</body>

</html>

注意enctype="multipart/form-data",一定要在Form中有这个属性,否则,将无法得到上传

上来的数据。接下来,我们要在processasp中对从浏览器中获取的数据进行必要的处理,因

为我们在processasp中获取到的数据不仅仅包含了我们想要的上传上来的的数据,也包

含了其他的无用的信息,我们需要剔除冗余数据,并将处理过的数据保存到数据库中,这

里我们以access2000为例。具体代码如下(processasp):

<%

responsebuffer=true

formsize=requesttotalbytes

formdata=requestbinaryread(formsize)

bncrlf=chrB(13)&chrB(10)

divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)

datastart=instrb(formdata,bncrlf&bncrlf)+4

dataend=instrb(datastart+1,formdata,divider)-datastart

mydata=midb(formdata,datastart,dataend)

setconnGraph=serverCreateObject("ADODBconnection")

connGraphConnectionString="driver={MicrosoftAccessDriver(mdb)};DBQ="&serverMa

pPath("imagesmdb")&";uid=;PWD=;"

connGraphOpen

setrec=servercreateobject("ADODBrecordset")

recOpen"SELECTFROM[images]whereidisnull",connGraph,1,3

recaddnew

rec("img")appendchunkmydata

recupdate

recclose

setrec=nothing

setconnGraph=nothing

%>

好了,这下我们就把上传来的保存到了名为imagesmdb的数据库中了,剩下的工作就是要

将数据库中的数据显示到网页上面了。一般在HTML中,显示都是使用<IMG>标签

,也就是<IMGSRC="路径">,但是我们的是保存到了数据库中,“路径”是什么

呢?呵呵,其实这个SRC属性除了指定路径外,也可以这样使用哦:

<IMGSRC="showimgaspid=xxx">

所以,我们所要做的就是在showimgasp中从数据库中读出来符合条件的

数据,并返回到SRC属性中就可以了,具体代码如下(showimgasp):

<%

setconnGraph=serverCreateObject("ADODBconnection")

connGraphConnectionString="driver={MicrosoftAccessDriver(mdb)};DBQ="&

serverMapPath("imagesmdb")&";uid=;PWD=;"

connGraphOpen

setrec=servercreateobject("ADODBrecordset")

strsql="selectimgfromimageswhereid="&trim(request("id"))

recopenstrsql,connGraph,1,1

ResponseContentType="image/"

ResponseBinaryWriterec("img")getChunk(7500000)

recclose

setrec=nothing

setconnGraph=nothing

%>

注意在输出到浏览器之前一定要指定ResponseContentType="image/",

以便正常显示。

最后要注意的地方是,我的processasp中作的处理没有考虑到第一页(uploadhtm)中还有其

他数据,比如<INPUT type=tesxt name=userid>等等,如果有这些项目,你的processasp就

要注意处理掉不必要的数据。

想只指定文件夹路径,而不选择文件就实现文件的批量上传,不用控件是无法实现的。

服务器端不可能去扫描到你客户端的硬盘中的数据,除非你在浏览网页时安装activex控件,由这个控件来扫描你的硬盘中指定文件夹路径下的文件

你现在想实现的,就是批是把一个文件夹中的全部上传到服务器,那么又要无组件上传,就肯定不能用activex控件了。

我提供的解决办法就是:使用flash进行文件上传,像swfupload这种flash文件上传组件,只显示文件浏览一个按钮,你可以在代码中设置是只允许选择一个文件进行上传,还是选择多个文件进行批量上传。上传是无刷新的效果,还可以实时显示上传进度。

如果你觉得这种方案可以满足你的要求(实际上就只是比你的需求多了一个选择文件的步骤),swfupload的具体代码,可以QQ我17595923,我可以把我项目中用到的代码以及swfupload中文手发给你。

----

另外补充一下:楼上几位说的批量上传组件,早就有了,只不过与楼主的需求不太适合。但用flash来实现,那就是天衣无缝了,而且也已经有现成的flash上传组件,swfupload这么好的工具,我的项目中也早就用上了。其实楼主的需求,最麻烦的是客户端的文件选择,而不是服务器端的上传代码。

所以,使用swfupload这个上传组件最方便实用,只是几个js文件,几个flash文件,就实现了客户端的文件批量选择,并且还是无刷新数据上传,实时显示文件上传进度。

服务端的ASP代码,随便用一个无组件上传都OK,像无惧文件上传类、风声无组件上传类等都是很好的ASP无组件上传类。

这个你看看符合你要求不

uploadxasp

<% Dim FormData, FormSize, Divider, bCrLf

FormSize = RequestTotalBytes

FormData = RequestBinaryRead(FormSize)

bCrLf = ChrB(13) & ChrB(10)

Divider = LeftB(FormData, InStrB(FormData, bCrLf) - 1)

'将上传的文件保存到path所指定的目录下面。

'Formfield 上传表单的"file"域名 Path

' 要保存文件的服务器绝对路径,形式为:"d:\path\subpath"或"d:\path\subpath\"

'MaxSize 限制上传文件的最大长度,以KByte为单位

' SavType 服务器保存文件的方式:

'0 唯一文件名方式,如果有同名则自动改名;

'1 报错方式,如果有同名则出错;

'2 覆盖方式,如果有同名则覆盖原来的文件

Function SaveFile(FormFileField, Path, MaxSize, SavType)

Dim StreamObj,StreamObj1

Set StreamObj = ServerCreateObject("ADODBStream")

Set StreamObj1 = ServerCreateObject("ADODBStream")

StreamObjMode = 3

StreamObj1Mode = 3

StreamObjType = 1

StreamObj1Type = 1

SaveFile = ""

StartPos = LenB(Divider) + 2

FormFileField = Chr(34) & FormFileField & Chr(34)

If Right(Path,1) <> "\" Then

Path = Path & "\"

End If

Do While StartPos > 0

strlen = InStrB(StartPos, FormData, bCrLf) - StartPos

SearchStr = MidB(FormData, StartPos, strlen)

If InStr(bin2str(SearchStr), FormFileField) > 0 Then

FileName = bin2str(GetFileName(SearchStr,path,SavType))

If FileName <> "" Then

FileStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4

FileLen = InStrB(StartPos, FormData, Divider) - 2 - FileStart

If FileLen <= MaxSize1024 Then

FileContent = MidB(FormData, FileStart, FileLen)

StreamObjOpen

StreamObj1Open

StreamObjWrite FormData

StreamObjPosition=FileStart-1

StreamObjCopyTo StreamObj1,FileLen

If SavType =0 Then

SavType = 1

End If

StreamObj1SaveToFile Path & FileName, SavType

StreamObjClose

StreamObj1Close

If SaveFile <> "" Then

SaveFile = SaveFile & "," & FileName

Else

SaveFile = FileName

End If

Else

If SaveFile <> "" Then

SaveFile = SaveFile & ",TooBig"

Else

SaveFile = "TooBig"

End If

End If

End If

End If

If InStrB(StartPos, FormData, Divider) < 1 Then

Exit Do

End If

StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2

Loop

End Function

'获取表单值

Function GetFormVal(FormName)

GetFormVal = ""

StartPos = LenB(Divider) + 2

FormName = Chr(34) & FormName & Chr(34)

Do While StartPos > 0

strlen = InStrB(StartPos, FormData, bCrLf) - StartPos

SearchStr = MidB(FormData, StartPos, strlen)

If InStr(bin2str(SearchStr), FormName) > 0 Then

ValStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4

ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart

ValContent = MidB(FormData, ValStart, ValLen)

If GetFormVal <> "" Then

GetFormVal = GetFormVal & "," & bin2str(ValContent)

Else

GetFormVal = bin2str(ValContent)

End If

End If

If InStrB(StartPos, FormData, Divider) < 1 Then

Exit Do

End If

StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2

Loop

End Function

Function bin2str(binstr)

Dim varlen, clow, ccc, skipflag

skipflag = 0

ccc = ""

varlen = LenB(binstr)

For i = 1 To varlen

If skipflag = 0 Then

clow = MidB(binstr, i, 1)

If AscB(clow) > 127 Then

ccc = ccc & Chr(AscW(MidB(binstr, i + 1, 1) & clow))

skipflag = 1

Else

ccc = ccc & Chr(AscB(clow))

End If

Else

skipflag = 0

End If

Next

bin2str = ccc

End Function

Function str2bin(str)

For i = 1 To Len(str)

str2bin = str2bin & ChrB(Asc(Mid(str, i, 1)))

Next

End Function

Function GetFileName(str,path,savtype)

Set fs = ServerCreateObject("ScriptingFileSystemObject")

str = RightB(str,LenB(str)-InstrB(str,str2bin("filename="))-9)

GetFileName = ""

FileName = ""

For i = LenB(str) To 1 Step -1

If MidB(str, i, 1) = ChrB(Asc("\")) Then

FileName = MidB(str, i + 1, LenB(str) - i - 1)

Exit For

End If

Next

If savtype = 0 and fsFileExists(path & bin2str(FileName)) = True Then

hFileName = FileName

rFileName = ""

For i = LenB(FileName) To 1 Step -1

If MidB(FileName, i, 1) = ChrB(Asc("")) Then

hFileName = LeftB(FileName, i-1)

rFileName = RightB(FileName, LenB(FileName)-i+1)

Exit For

End If

Next

For i = 0 to 9999

hFileName = hFileName & str2bin(i)

If fsFileExists(path & bin2str(hFileName) & i & bin2str(rFileName)) = False Then

FileName = hFileName & str2bin(i) & rFileName

Exit For

End If

Next

End If

Set fs = Nothing

GetFileName = FileName

End Function

%>

其实很简单的啊!!不用想的那么复杂!!

注(上传时是需要组件的,无惧上传组件不错!)

首先,在你需要上传的页面,引用上传组件!

然后你再建一个处理页面(也就是把名称,大小什么的,存入数据库的页面,建议不要直接往数据库里存,那样数据库会非常庞大!只要把上传以后的路径存到数据库里就行)

最后就是显示了!!

给你简要的说下,有不明白的地方加我QQ

以上就是关于ASP如何上传图片,并且可以添加图片说明全部的内容,包括:ASP如何上传图片,并且可以添加图片说明、asp 批量上传一个文件夹里的所有图片、ASP中怎么实现图片上传到文件夹等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10639811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存