给单位网站文章发布系统增加一个不完美的文件上传功能

来源:互联网 发布:剑灵力士捏脸数据图 编辑:程序博客网 时间:2024/04/30 10:24

一直觉得单位网站的文章发布系统缺少文件上传功能是个遗憾,不过因为用的是asp来建站——而我的asp知识早忘得差不多了——所以没有点行动表示。但是这几天心血来潮,试着弄了一下:

分析:如果修改数据库的话——打开数据库发现n个表,没有文档改遭了我不就摊起了,毕竟这网站不是玩具。倒是发现web maker没有对html代码进行过滤,虽然潜在危险倒也方便我修改,嘻嘻,就这样办了。

方案:用代码生成文件或图片添加码直接对页面内容进行添加。

步骤1:找出需要修改的文件(添加、修改删除)。采用表单传递数据的方法上传文件。在这两个页面内加入iframe,把文件上传组件放入另一个页面并嵌套进来。

upframewin.asp代码

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
<style type="text/css">
<!--
body {
margin-left: 0px;
margin-top: 0px;
background-color: #999999;
}
-->
</style>
<script>
function processUpFile() //上传按钮的事件
{
filepath=document.all.file1.value;
if(filepath==""){
alert("请浏览选择上传文件!");
return;
}//end if
reg=/^[a-zA-Z]/:{1}//{1}(/w|/s|/S|/W)+/.{1}/w+$/;
if(reg.test(filepath)){
document.form1.action="upload.asp?file1="+ filepath.replace(////g,"////")
document.form1.Submit.value="上传中..";
document.form1.Submit.disabled=true;
document.form1.submit();
}else{
alert("请设置正确的上传文件!");
}

}


</script>
</head>

<body>
<form name="form1" method="post" enctype="multipart/form-data" action="upload.asp">
<table width="600">
<tr>
<td>
<input type="file" name="file1" size="40" class="smallinput" maxlength="255" >
<input type="button" name="Submit" value=" 上 传 " onClick="processUpFile()">
</td>
</tr>
</table>
</form>
</body>
</html>

步骤:上传文件页面upload.asp代码

 

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
 server.scripttimeout=600
 dim upFileStatus '上传状态
 dim upFileName '生成的文件名
 dim upFileExt '上传文件的后缀
 dim maxSize '上传文件最大值
 dim formsize '表单数据大小
 dim fileSize'上传文件的大小
 dim getFileName '文件名
 maxSize=clng(10240)
 upFileStatus=false
 getFileName=request.QueryString("file1")
 formsize=Request.TotalBytes
 filesize=(formsize/1024)
 if fileSize>maxSize then
  response.Write("<script>alert('上传文件的大小超过了10M限制!');</script>")
  response.Write("<script>location.replace('upframewin.asp');</script>")
 elseif fileSize<=0 then
  response.Write("<script>alert('请设置正确的上传文件!');</script>")
  response.Write("<script>location.replace('upframewin.asp');</script>")
 else
  upFileFunc()
 end if
 
 
 
 function upFileFunc() '上传文件函数
  on error resume next
  formdata=Request.BinaryRead(formsize)
  set obs=server.CreateObject("adodb.stream")
  obs.mode=3
  obs.type=1
  obs.open
  obs.write(formdata)'读取所有上传的数据
  
  upFileExt=getFileExtName(getFileName)
  
  CLStr=ChrB(13)&ChrB(10)
  datastart=InStrB(formdata,CLStr&CLStr)+3 '确定文件的开始位置.分隔符与下一段数据描述部分由一个回车分隔,与数据描述与数据内容之间由两个回车分隔
  divstr=LeftB(formdata,clng(InStrB(formData,CLStr))-1) '求分隔符
  datasize=InStrB(datastart+1,formdata,divstr)-datastart-3 '这里有点想不明白
  formdata1=Midb(formdata,datastart,datasize) '真正的文件数据
  set obd=server.CreateObject("adodb.stream")
  obd.type=1
  obd.mode=3
  obd.open
  obs.position=datastart
  obs.copyto obd,lenb(formdata1)
  
  Randomize timer()
  upFileName=year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&Clng( Rnd()*9999)&"."&upFileExt
  on error resume next
  obd.SaveToFile Server.MapPath("uploadimages/"+ upFileName),2
  upFileStatus=true
   
  if err.number<>0 then
    response.Write("<script>alert('文件上传失败!')</script>")
    upFileStatus=false
  end if
 end function
 
 function getFileExtName(fileName)'取得后缀名
  dim pos
  pos=instrrev(filename,".")
  if pos> 0 then
  getFileExtName=mid(fileName,pos+1)
  else
  getFileExtName=""
  end if
 end function
 
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>上传文件</title>
<style type="text/css">
<!--
body {
 background-color: #999999;
 margin-left: 0px;
 margin-top: 0px;
}
.style2 {font-size: 9pt}
-->
</style>
<script>
 <!--
function getFileName(nameStr)
{
    re=/([^//]+)/.{1}/w+$/; //匹配文件名(不含/)
    re.test(nameStr) ;
 return RegExp.$1
}
//-->
</script>
</head>

<body>

<br>
<p><span class="style2">       <strong>
  <%  if upFileStatus then
  response.Write("<script>alert('文件上传成功!')</script>")
%>
  <input type="hidden"  value="<%=upFileName %>" name="hidden1">
  <input type="hidden"  value="<%=getFileName %>" name="hidden2">
  <script>
var txtcontent=parent.document.all.txtcontent;
var upFileExt="<%=upFileExt %>";
var newaddtext
if(upFileExt=="bmp"||upFileExt=="jpg"||upFileExt=="gif"||upFileExt=="png")
 newaddtext="<br><img src='uploadimages/" + document.all.hidden1.value + "' border='0'>";
else
 newaddtext="<br>附件: <img src=pic/book.gif><a href='uploadimages/" + document.all.hidden1.value + "' target=_blank>" + getFileName(document.all.hidden2.value) + "</a>";
txtcontent.value=txtcontent.value + newaddtext;
txtcontent.focus();
</script>
  <% end if %>
    </strong></span>
<script>
    location.replace("upframewin.asp");
</script>
</p>
</body>
</html>

 

失败的是一旦上传大小超过限定大小页面就会出现“无法打开”的错误,虽然进行了判定,但始终未能够捕获……由于不影响正常使用就放上去了,呵呵^_^

有达人知道的告诉我。

原创粉丝点击