鬼火狼烟吧 关注:231贴子:5,313

[急!]怎样用asp实现图片上传功能呢?

只看楼主收藏回复

我的毕业设计中老师让我做一个带图片上传功能的asp页面,能在后台看到提交过来的图片,请问该怎样做呢?我觉得有几点难度,1.提交过来的照片大小不能确定,不知道大小不统一的照片能否实现 2.提交过来的图片怎样保存呢?我用的是access,是存数据的能存照片么?我有很多很多的疑问,真的不知道该从哪里下手了?无论如何请您指点一下,最好是能给我做个例子!


1楼2006-02-21 11:12回复
    大小的问题,其实和传图片没关系的,<img src='<%=rs("path")%>'></img>这个地方可以按你自己的想法来设置,如果按实际图片大小显示,就按上面写就可以,如果想固定大小,比如个人资料的照片,那么就在img的属性里面加上height = 50,width = 50这样的属性即可,很简单.


    IP属地:安徽3楼2006-02-21 14:24
    回复
      仔细想了下,如今的服务器开放FSO对象权限的基本上很少了.直接抄个存入数据库并显示的例子给你,这里使用的是上面介绍的第3种方式上传,以第一种方式存储的方法,但是存储的时候有个小技巧,利用了微软的OLE技术,使得显示图片变的简单了.

      首先,你要建立一个Access数据库来作为这个例子的数据库:
      字段名称    类型    描述
      -------------------------------------------------------
       id     自动编号   主键值
       img OLE对象   用来保存图片数据 <-这里字段类型是可以选text的,但是我们选择OLE
      -------------------------------------------------------


      IP属地:安徽4楼2006-02-21 14:32
      回复
        接着来,我们要写个给用户看的上传页面upload.htm,代码很简单:

        <html>

        <body>

        <center>
           <form name="mainForm" enctype="multipart/form-data"

        action="process.asp" method=post>

            <input type=file name=mefile><br>   <input type=submit name=ok value="OK">

           </form>
        </center>
        </body>
        </html>




        这里面唯一要注意的是enctype="multipart/form-data"这个属性,这个属性表明我们的表单是多类型数据格式,而不是byte格式的.


        IP属地:安徽5楼2006-02-21 14:36
        回复
          有了上传,就要有核心处理的页面了,也就是上面的提交目标process.asp了,代码如下: 

          <% 
          response.buffer=true 
          formsize=request.totalbytes 
          formdata=request.binaryread(formsize) 
          bncrlf=chrB(13) & chrB(10) 
          divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1) 
          datastart=instrb(formdata,bncrlf & bncrlf)+4 
          dataend=instrb(datastart+1,formdata,divider)-datastart 
          mydata=midb(formdata,datastart,dataend) 
          set connGraph=server.CreateObject("ADODB.connection") 
          connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" & 
          server.MapPath("images.mdb") & ";uid=;PWD=;" 
          connGraph.Open 

          set rec=server.createobject("ADODB.recordset") 
          rec.Open "SELECT * FROM [images] where id is null",connGraph,1,3 
          rec.addnew 
          rec("img").appendchunk mydata 
          rec.update 
          rec.close 
          set rec=nothing 
          set connGraph=nothing 

          %> 



          我们用来获取上一个页面传递过来的数据一般是使用Request对象。同样的,我们也可以使用Request对象来获取上传上来的文件数据,使用的方法是Request.BinaryRead()。而我们要从数据库中读出来图片的数据显示到网页上面要用到的方法是: 

            Request.BinaryWrite()。在我们得到了图片的数据,要保存到数据库中的时候,不可以直接使用Insert语句对数据库进行操作,而是要使用ADO的AppendChunk方法,同样的,读出数据库中的图片数据,要使用GetChunk方法。各个方法的具体语法如下: 

          * Request.BinaryRead语法: 

          variant = Request.BinaryRead(count) 

          参数 

          variant 

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

          count 

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

          Request.TotalBytes得到的数据量。 

          * Request.BinaryWrite语法: 

          Request.BinaryWrite data 

          参数 

          data 

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

          * Request.TotalBytes语法: 

          variant = Request.TotalBytes 

          参数 

          variant 

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

          * AppendChunk语法 

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

          object.AppendChunk Data 

          参数 

          object Field 或 Parameter 对象 

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

          说明 

            使用 Field 或 Parameter 对象的 AppendChunk 方法可将长二进制或字符数据填写到对象中。在系统内存有限的情况下,可以使用 AppendChunk 方法对长整型值进行部分而非全部的操作。


          IP属地:安徽7楼2006-02-21 14:41
          回复
            剩下的工作就是要将数据库中的图片数据显示到网页上面了。一般在HTML中,显示图片都是使用<IMG>标签,也就是<IMG SRC="图片路径">,但是我们的图片是保存到了数据库中,“图片路径”是什么呢?呵呵,其实这个SRC属性除了指定路径外,也可以这样使用哦:
            <IMG SRC="showimg.asp?id=xxx">
            如果要象LZ的要求还要指定大小,就再添加height = 50,width =50这样的属性就可以固定大小了.

              所以,我们所要做的就是在showimg.asp中从数据库中读出来符合条件的数据,并返回到SRC属性中就可以了,具体代码如下(showimg.asp):

            <%
            set connGraph=server.CreateObject("ADODB.connection")
            connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &
            server.MapPath("images.mdb") & ";uid=;PWD=;"
            connGraph.Open

            set rec=server.createobject("ADODB.recordset")
            strsql="select img from images where id=" & trim(request("id"))
            rec.open strsql,connGraph,1,1
            Response.ContentType = "image/*"
            Response.BinaryWrite rec("img").getChunk(7500000)
            rec.close
            set rec=nothing
            set connGraph=nothing

            %>

              注意在输出到浏览器之前一定要指定Response.ContentType = "image/*",以便正常显示图片。否则<img>是不认识你的数据的.

            * GetChunk语法

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

            variable = field.GetChunk( Size )

            返回值

            返回变体型。

            参数

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

            说明

              使用 Field 对象的 GetChunk 方法检索其部分或全部长二进制或字符数据。在系统内存有限的情况下,可使用 GetChunk 方法处理部分而非全部的长整型值。

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

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

            GetChunk 方法返回 Null。

              每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO 将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用 GetChunk 方法,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。如果其他 Recordset 对象不是首个 Recordset 对象的副本,则访问其中的字段不会破坏 GetChunk 操作。如果 Field 对象的 Attributes 属性中的 adFldLong 位设置为 True,则可以对该字段使用 GetChunk 方法。如果在 Field 对象上使用 Getchunk 方法时没有当前记录,将产生错误 3021(无当前记录)


            IP属地:安徽8楼2006-02-21 14:44
            回复
              最后要注意的地方是,process.asp中作的处理没有考虑到第一页(upload.htm)中还有其他数据,比如<INPUT type=tesxt name=userid>等等,如果有这些项目,你的process.asp就要注意处理掉不必要的数据。一个好的解决办法就是最好使用不同的form来提交这些数据.


              IP属地:安徽9楼2006-02-21 14:46
              回复
                非常的感谢你!我正在调试中,过后和你联系!


                10楼2006-02-22 09:32
                回复
                  请问:不需要安装其他的插件么?我只是用的DW做的没有用别的软件,不知道可不可以做出来?因为我在网上看人家写到要用到vb插件,故问一下你!


                  11楼2006-02-22 16:12
                  回复
                    不需要的,你说的那个就是第2种上传方式,这个方法最大的好处是安全性非常高,但是,除非你的页面运行在你自己的服务器上,如果是用租来的虚拟主机,我想没有几个提供商会给你在server上注册你需要的控件的呵呵.
                    所以给你的就是单纯的ASP方式,只有一个需要注意的地方,就是文件提交的form最好和其他表单分开,把其他表单的内容放在别的form中,稍微使用一些客户端script,即可得到很好的控制.


                    IP属地:安徽12楼2006-02-23 09:15
                    回复
                      • 218.95.114.*
                      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) 

                      究竟要得到服务器收到的数据哪些部分啊。。。看的我头晕。
                      还有哦分隔符是第一行怎么我用response.binaryWrite()输出得到的数据在浏览器中不会显示换行?


                      15楼2006-07-17 10:33
                      回复
                        • 218.95.114.*
                        郁闷哦~看到我好晕!谁能给解释下,Chrb(13) & chrb(10)=回车??貌似两个都是回车,连接起来有啥用啊?,用一个不成么?还有着段datastart=instrb(formdata,bncrlf & bncrlf)+4,怎么bncrlf & bncrlf代表什么?两个回车


                        16楼2006-07-17 22:01
                        回复
                          mydata=midb(formdata,datastart,dataend)这里就是真实的图片数据呀。

                          Chrb(13)和chrb(10)是有区别的,不同OS会有不同的对待方法,第一个也就是值0x0D是回车,在windows上是把光标移动到行首, 0x0A也就是第2个是换行,把光标下移一行,但是不会到行首,所以我们正常会在一起用,起的作用是移动到下一行的行首,Unix/Linux只需要0x0A就可以达到这样的效果了.


                          IP属地:安徽17楼2006-07-19 12:23
                          回复
                            • 218.64.90.*
                            懂了,感激啊!!谢谢了~


                            18楼2006-07-19 21:05
                            回复
                              • 218.95.114.*
                              首先,你要建立一个Access数据库来作为这个例子的数据库: 
                              字段名称    类型    描述 
                              ------------------------------------------------------- 
                               id     自动编号   主键值 
                               img OLE对象   用来保存图片数据 <-这里字段类型是可以选text的,但是我们选择OLE 

                              选text出现错误...改OLE就没问题...


                              19楼2006-07-21 22:20
                              回复