愤怒的大鸟 发表于 2015-1-16 22:43:16

ASP网页编程之避免旧事体系里发生渣滓图片的办法

结论:和PHP一样,ASP简单而易于维护,很适合小型网站应用,通过DCOM和MTS技术,ASP甚至还可以完成小规模的企业应用,但ASP的致命缺点就是不支持跨平台的系统,在大型项目开发和维护上非常困难。如今的旧事体系里越多地撑持在线上传拔出图片,以完成在对照好的效果。但是成绩也随之而来了,有的图片传上往后,发明这个图片不合错误,那只能在编纂器里把它删失落,或是,在增加地程中体系呈现成绩,而招致渣滓图片的发生。为了避免在这过程当中呈现渣滓图片和附件,很多人多研讨了很多的办法,如动网论坛里,对上传的每个文件,在数据库里都有响应的一个纪录,如许要占用一个表来寄存,而且假如在增加数据到数据库里时体系呈现非常,也一样没法制止这些渣滓的发生。经由我的一些理论,研讨出我的办法,如今奉献出来,供人人匡正。我的办法流程是如许的:当文章的增加者登录到体系内里后,由体系给它创立一个一时的事情文件夹,如“editor”这个用户的ID是5那我创建一个temp5的一时事情目次,当他增加文章的时分,上传的图片和别的附件其实不存进到真正要显现寄存的目次,而是存在这个一时的事情目次内里。同时为了便利办理,我倡议给每条旧事建一个目次来寄存这些图片,当文章提交的时分,由体系剖析内里的图片地点,把文章内里有的图片转移到这些对应的目次内里往。
  当旧事或文章修改的时分,就先把这个文件夹上面的一切图片转移到进进的时分的一时事情目次内里,同时对文章内里的图片路径举行交换,保留的时分也是和增加的时分实行统一个历程。当文章删除的时分,也绝对应地把这个目次删失落,这就能够包管了在增加、修正、删除的过程当中没有渣滓图片的发生。当用户登出的时分,体系能够将其所对应的事情目次删除,如许就能够完全地作到没有渣滓的发生。
  看到下面这些笔墨形貌大概很多多少人要头晕了,那看一下详细的完成历程吧(由于我对ASP对照熟习,以是我用ASP来完成它了,用别的的平台也是能够完成的)。起首让我先引进我本人写的一个类,用来剖析和转移图片的,具体的申明请看我的另外一篇文章:用asp主动剖析网页中的图片地点,并将其保留到当地服务器(http://www.csdn.net/develop/read_article.asp?id=15585)
  classblacksmith
  TheClass"blacksmith"isCreatedbyLinzhangChen
  Itcoulduseforcopyimagesformotherserverwhichcontainintheweb
  dim      size,baseurl,basefilename,tofolder,servername,processstr,firstoldimg,firstnewimg
  publicFunctionsaveimage(from,tofile)
  Dimgeturl,objStream,imgs,s
  Ifsize=""Then
  size=0
  EndIf
  geturl=Trim(from)
  imgs=getHTTPPage(geturl)
  s=size*512
  IfLen(imgs)>sThen
  SetobjStream=CreateObject("ADODB.Stream")
  objStream.Type=1
  objStream.Open
  objStream.Writeimgs
  objStream.SaveToFiletofile,2
  objStream.Close
  SetobjStream=Nothing
  saveimage=True
  Else
  saveimage=False
  EndIf
  EndFunction
  
  privateFunctiongetHTTPPage(url)
  OnErrorResumeNext
  Dimhttp
  Sethttp=CreateObject("MSXML2.XMLHTTP")
  http.Open"GET",url,False
  http.send
  Ifhttp.readyState4Then
  ExitFunction
  EndIf
  getHTTPPage=http.responseBody
  Sethttp=Nothing
  IfErr.Number0ThenErr.Clear
  EndFunction

privateFunctiongetimgs(str)
  getimgs=""
  SetobjRegExp1=NewRegExp
  objRegExp1.IgnoreCase=True
  objRegExp1.Global=True
  objRegExp1.Pattern="http://.+?"""
  Setmm=objRegExp1.Execute(str)
  ForEachMatch1Inmm
  getimgs=getimgs&"||"&Left(Match1.Value,Len(Match1.Value)-1)
  Next
  EndFunction
  
  Functionstr2img()
  Dimservername,objRegExp,strs,Matches,RetStr,arrimg,newimg,i,fname,states,arrnew,arrall
  ifbaseurl""then
  IfRight(baseurl,1)"/"Then
  baseurl=baseurl&"/"
  EndIf
  endif
  ifright(tofolder,1)""then
  tofolder=tofolder&""
  endif
  SetobjRegExp=NewRegExp
  objRegExp.IgnoreCase=True
  objRegExp.Global=True
  objRegExp.Pattern=""
  strs=Trim(processstr)
  SetMatches=objRegExp.Execute(strs)
  ForEachMatchInMatches
  RetStr=RetStr&getimgs(Match.Value)
  Next
  arrimg=Split(RetStr,"||")
  allimg=""
  newimg=""
  Fori=1ToUBound(arrimg)
  Ifarrimg(i)""AndInStr(allimg,arrimg(i))<1Then
  fname1=baseurl&CStr(basefilename&i&Mid(arrimg(i),InStrRev(arrimg(i),".")))
  fname=tofolder&CStr(basefilename&i&Mid(arrimg(i),InStrRev(arrimg(i),".")))
  states=saveimage(arrimg(i),fname)
  Ifstates=TrueThen
  allimg=allimg&"||"&arrimg(i)
  newimg=newimg&"||"&fname1
  EndIf
  EndIf
  Next
  arrnew=Split(newimg,"||")
  arrall=Split(allimg,"||")
  Fori=1ToUBound(arrnew)
  ifi=1then
  firstoldimg=arrall(1)
  firstnewimg=arrnew(1)
  endif
  strs=Replace(strs,arrall(i),arrnew(i))
  Next
  str2img=strs
  EndFunction
  endclass
  第一步用户登录的时分:因为有一个事情区,以是最好不要让多个用户用统一个帐号否则到时分有人登出的时分,将会形成别的人的事情丧失,这里最次要处置的是帐户登录的时分要对这个帐号锁定不同意反复登录(次要由FSO和数据库来完成,我就未几说了)。

在处置文件上传的时分,能够用稻喷鼻老农的无组件上传,把图片传到事情区中。而且把图片代码前往到编纂器中,当提交今后,将由以下代码来处置这些图片,我这里是依据旧事或文章的ID来创立文件夹的:
  sql="selecttop1formnewswhereidisnull"
  setrs=server.createobject("adodb.recordset")
  rs.opensql,conn,1,3
  rs.addnew
  rs("userid")=session("myid")由于是新加的,以是先加上一条来获得ID
  rs.update
  newID=rs("newsid")年夜部分情形下,如许能够获得ID的,但是为了保险起见,以是最好仍是再判别一下了
  rs.close
  setrs=nothing
  ifnewsID=""then
  setrs=conn.execute("selecttop1newsidfromnewswhereuserid="&session("myid")&"orderbynewsiddesc")
  newsID=rs("newsid")
  endif
  
  basefoder=server.mappath("photo")假定图片存到以后目次上面的photo内里
  setfso=Server.CreateObject("Scripting.FileSystemObject")
  FiLePaTh=basefoder&"/"&newsID
  Fso.Createfolder(FiLePaTh)
  假定将获得旧事的内容存在变量content内里上面就挪用我的谁人类blacksmith来处置剖析文章的内容,处置图片的转移了
  setbs=newblacksmith
  bs.size=1
  bs.baseurl="photo/"&newsID给图片加上目次的地点
  bs.basefilename="mynews"给图片加上前缀
  bs.servername=""
  bs.tofolder=FiLePaTh
  bs.processstr=content
  content=bs.str2img
  setbs=nothing
  接上去就是旧事内容的保留的历程了,我这里就省往了,和别的的体系应当是一样的了
  在处置旧事的修正的时分用:
  创立事情目次
  setfso=Server.CreateObject("Scripting.FileSystemObject")
  FiLePaTh=server.mappath("temp"&session("myid"))
  IfNotFSO.FolderExists(FiLePaTh)Then
  Fso.Createfolder(FiLePaTh)
  EndIf
  
  FiLePaTh=basefoder&"/"&newsID
  IfFSO.FolderExists(fp)Then
  onerrorresumenext
  fso.copyfilefp&"*.*",FiLePaTh&""把谁人目次上面的一切文件全拷到事情目次上面,避免呈现修正了不保留,以是先不删除原本的内容
  iferr.num>0thenerr.clear
  EndIf
setfso=nothing
  endif
  把原本的文件内容举行处置,改动内里的图片路径,好比说这此内容仍是保留在content内里
content=replace(trim(content,"photo/"&newsID&"/mynews","temp"&session("myid")&"/mynews")这个只是一个对照复杂的交换,信任由此引发误交换的时机应当是相称小的了
  保留的历程和增加的历程是一样的,所分歧的是,要先把本来的谁人目次内里的文件清空,我这里就未几说了。
  旧事删除的时分,要记住把这个ID绝对应的文件夹删除,在用户登出的时分,也要把它的事情目次清空。
  好了,我的全部思绪就是如许的了,说不上是甚么佳构,可是它在实践的使用中,一年上去并没有发生过任何的意常,以是我就把它贴出来了,接待人人和我交流:E_mail:clzwin@sina.com
我想详细了解ASP整站代码与PSP整站代码有什么优缺点,那个更好,更安全,更用容易维护,和管理。。。

活着的死人 发表于 2015-1-19 21:43:09

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

分手快乐 发表于 2015-1-25 19:36:19

Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点)

小女巫 发表于 2015-2-3 17:45:12

代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。

飘灵儿 发表于 2015-2-9 04:18:41

尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。

简单生活 发表于 2015-2-26 21:41:45

交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。

乐观 发表于 2015-3-8 18:12:59

ASP也是这几种脚本语言中最简单易学的开发语言。但ASP也是这几种语言中唯一的一个不能很好支持跨平台的语言。  因为ASP脚本语言非常简单,因此其代码也简单易懂,结合HTML代码,可快速地完成网站的应用程序。

不帅 发表于 2015-3-22 22:10:33

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
页: [1]
查看完整版本: ASP网页编程之避免旧事体系里发生渣滓图片的办法