功能描述:
1、用户表示层(界面)用户可以根据需要一次性上传多个附件,附件的个数由用户决定。用户通过点击“增加”、“减少”按钮进行添加和删除上传控件;
2、业务逻辑层:进行文件的存储和向数据层传递附件相关数据;
3、数据访问层:向数据库添加附件相关信息。
功能的实现:
1、用户表示层的实现实际上只能用普通控件来实现而不能用服务器端控件实现,而这些控件的添加上通过JS来操作完成的;
下面是表示层index.aspx的代码 (点击以展开代码段)
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="post.aspx.vb" Inherits="post" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
<script type="text/javascript">
function insertMessage() {
if(document.getElementsByTagName("tbody").length<20) {
var oNewNode = document.getElementById("ass").firstChild.cloneNode(true);
document.getElementById("ass").appendChild(oNewNode);
} else {
alert("最多只能同时上传10个附件!");
return false;
}
}
function moveMessage() {
if(document.getElementsByTagName("tbody").length>11){
var oOldNode = document.getElementById("ass").lastChild;
oOldNode.parentNode.removeChild(oOldNode);
}
}
//若有附件,则附件的描述不能为空
function ValidateNull(){
var isNull;
var iCount;
var oElem;
isNull = true;
oElem = document.getElementsByName("attachdesc[]")
iCount = document.getElementsByName("attachdesc[]").length;
for(i=0;i<iCount;i++){
if(document.getElementsByName("attach[]")[i].value.trim()!=""){
if(document.getElementsByName("attachdesc[]")[i].value.trim()==""){
alert("附件描述不能为空!");
isNull = false;
break;
}
}
}
return isNull;
}
//trim:去除字符串首尾空格
String.prototype.trim = function() {
var reExtraSpace = /^\s*(.*?)\s*$/;
return this.replace(reExtraSpace,"$1");
}
</script>
</head>
<body>
<form id="form1" runat="server" enctype="multipart/form-data">
<div id="container">
<table class="fulltable PostTable">
<tr>
<td class="tableleftcell Cell">
<span>问题标题:</span>
</td>
<td class="Cell">
<asp:DropDownList ID="Qtype" runat="server">
<asp:ListItem>讨论</asp:ListItem>
<asp:ListItem>提问</asp:ListItem>
<asp:ListItem>灌水</asp:ListItem>
</asp:DropDownList> <asp:TextBox ID="title" runat="server" SkinID="postTitle"></asp:TextBox>
</td>
</tr>
<tr>
<td class="Cell">
附件:</td>
<td class="Cell">
上传附件:<a href="###" onclick="insertMessage()">[+]</a> <a href="###" onclick="moveMessage()">
[-]</a>
<table id="ass">
<tbody>
<tr>
<td>
描述:<input type="text" name="attachdesc[]" /> 附件:<input type="file" name="attach[]" /></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="Button1" runat="server" Text="提交我的问题" OnClientClick=" return ValidateNull();this.disabled=true;this.form.submit()" />
<asp:Label ID="lblError" runat="server"></asp:Label></td>
</tr>
</table>
</div>
</form>
</body>
</html>
index.aspx.vb的代码 (点击一展开代码段)[ 注意:获取普通页面控件值的方法 ]
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim sFilesName As String
Dim oPostedFile As HttpPostedFile
Dim sFileDesc() As String
Dim n As Integer
Dim i As Integer
‘取得上传附件的个数
n = Request.Files.Count()
‘附件的描述存放到数组中
sFileDesc = Request.Form("attachdesc[]").ToString.Split(",")
‘上传附件并向数据库中添加数据
For i = 0 To n – 1
oPostedFile = Request.Files.Item(i)
sFilesName = UpLoadMoreFile(oPostedFile, "Attachments", sFileDesc(i))
Select Case sFilesName
Case ""
Case "InValid"
lblError.Text = lblError.Text + "<font color=’red’>文件</font>: " & oPostedFile.FileName & "<font color=’red’> 不合法!</font><br>"
Case "Failure"
lblError.Text = lblError.Text + "<font color=’red’>文件</font>: " & oPostedFile.FileName & "<font color=’red’> 上传失败!</font><br>"
Case Else
lblError.Text = lblError.Text + "<font color=’red’>文件</font>: " & oPostedFile.FileName & "<font color=’red’> 上传成功!</font><br>"
End Select
Next i
End Sub ‘Button1_Click
2、业务逻辑层的文件,主要是上传文件和进行数据操作的
‘+++++++++++++++++++++++++++++++++++++++++++++++++++++++
‘名称:UpLoadMoreFile
‘说明:上传文件
‘参数:poFile : 上传文件输入域名,如:txtPicture
‘ psPath : 上传虚拟引用路径,如:Pictures
‘返回:InValid:上传文件无效
‘ Failure:上传文件失败,捕获异常
‘ 空:不上传文件
‘ 其它:上传文件成功
‘
‘ 代码来自互联网 略作修改 2007-1-7
‘+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Shared Function UpLoadMoreFile(ByVal poFile As System.Web.HttpPostedFile, ByVal psPath As String, ByVal sFileDesc As String) _
As String
Dim sPath As String
Dim sFileName As String
Dim sExt As String ‘扩展名
‘首先判断文件输入域的合法性
If Trim(poFile.FileName) = "" Then
Return "" ‘不上传文件
Else
If poFile.ContentLength = 0 Then
‘文件不合法或者文件不正确,无法上传
Return "InValid"
Else
‘根据年和月的的6位数字命名文件夹,并将附件进行归类
Dim sDir As String
sDir = Format(Now, "yyyy/MM").ToString
sPath = System.Web.HttpContext.Current.Server.MapPath(psPath)
sPath = sPath & "/" & sDir
If Not Directory.Exists(sPath) Then
IO.Directory.CreateDirectory(sPath)
End If
‘根据用户选择的文件名生成新的服务器文件名称
sFileName = poFile.FileName()
Dim nBackSlash As Integer
nBackSlash = sFileName.LastIndexOf(".")
If nBackSlash <> -1 Then
‘取文件名后缀
sExt = sFileName.Substring(nBackSlash)
‘以所经过的毫秒数为文件名
sFileName = Now.Ticks.ToString & sExt
End If
‘获取唯一文件名
sFileName = GetUniqueFileName(sPath, sFileName)
‘上传文件
Try
poFile.SaveAs(sPath & "\" & sFileName)
Return sFileName
Catch oException As Exception
Throw oException
Return "Failure"
End Try
End If
End If
End Function
‘+++++++++++++++++++++++++++++++++++++++++++++++++++++++
‘名称:GetUniqueFileName
‘说明:获取上传文件的唯一名
‘参数:poFile : 上传文件名
‘ psPath : 上传实际路径
‘返回:唯一文件名(String)
‘
‘ 代码来自互联网 出处未名 2007-1-7
‘+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Public Shared Function GetUniqueFileName(ByVal psPath As String, ByVal psFileName As String) As String
Dim sFile As String ‘文件名
Dim sExt As String ‘扩展名
Dim n As Integer = 1
Dim nLastDot As Integer
sFile = psFileName
nLastDot = sFile.LastIndexOf(".")
If nLastDot = -1 Then
sExt = ""
Else
sExt = sFile.Substring(nLastDot)
sFile = sFile.Substring(0, nLastDot)
End If
Do While File.Exists(psPath & "\" & sFile & sExt)
sFile = sFile & n
n = n + 1
Loop
Return sFile & sExt
End Function
3、数据层由于大家的数据表结构不一样所以没有列出
http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx
[回复]