Lily.Core.FileDataProvider文件管理使用范例。
此组件主要支持进行文件管理,当前版本(1.0.0.2)支持局域网和FTP模式,可以自主扩展访问方式;
主要功能:
创建目录,删除目录,上传文件,下载文件,删除文件,返回远程路径。主要是这五个功能。
文件或目录在物理磁盘上的名称,默认都是以ID为名称的,所以不存在目录或文件的更改。
此组件不能单独使用,必须结合lily.Core实体结合使用。设计的目的是让一个实体可以对应一个或多个文件。把文件当作实体的字段。
表结构设计注意:
目录必须按ID,ParentID的结果。
文件使用目录ID进行关联。
对象层次:
目录或文件对象都继承于:Lily.Core.FileDataProvider.EntityFileBase
目录或文件对象操作类都继承于:Lily.Core.FileDataProvider.FileEntityHandler
下面列出一个代码示例:
Private f_目录 As Lily.Core.FileDataProvider.DirectoryField
<Browsable(False)> _
Public Overridable ReadOnly Property _目录() As Lily.Core.FileDataProvider.DirectoryField
Get
If f_目录 Is Nothing Then
'这是默认实体字段对象的获取方式
' f_目录 = Lily.Core.Util.OQLHelper.GetEntityField(Me, "目录", "目录", False, False, DbType.String, 50)
'这是文件对象字段实体获取方式,这里是目录。
'其实DirectoryField也是继承于EntityField对象的。
Me.f_目录 = Me.FileConnection.GetDirectoryField(Me, "目录", "目录", False, False, DbType.String, 50)
End If
Return f_目录
End Get
End Property
如果是文件则是:
Private f_文件 As Core.FileDataProvider.FileField
<Browsable(False)> _
Public Overridable ReadOnly Property _文件() As Core.FileDataProvider.FileField
Get
If f_文件 Is Nothing Then
'f_文件名称 = Lily.Core.Util.OQLHelper.GetEntityField(Me, "文件名称", "文件名称", False, False, DbType.String, 100)
Me.f_文件 = Me.FileConnection.GetFileField(Me, "文件", "文件", False, False, DbType.String, 1000, False, False, Me)
End If
Return f_文件
End Get
End Property
可以看出没有太大的区别。其中FileField与DirectoryField都是继承于实体字段EntityField。FileConnection见下面介绍
文件和目录都需要重新基类一个方法和一个属性
返回一个连接对象,组件设计之初就考虑了可以支持不同访问方式如:局域网或FTP,或其它的。所以都应该重写基类的FileConnection属性,返回一个可用可配置的连接对象。 这里有一个ConfigurationInfo.GetConnection是通过配置文件反射获取文件连接对象。对于局域网路径或FTP用户名密码等都在配置文件中。
Public Overrides Property FileConnection() As FileDataProvider.IFileConnection
Get
If MyBase.FileConnection Is Nothing Then
Return ConfigurationInfo.GetConnection()
End If
Return MyBase.FileConnection
End Get
Set(ByVal Value As FileDataProvider.IFileConnection)
MyBase.FileConnection = Value
End Set
End Property
获取对象的父路径,Lily.Core.FileDataProvider.Util.GetParentPath调用了一个存储过程,把ID,ParentID转换路径字符串。返回父目录路径或文件的目录路径部份。注意红色部份是文件实体里的代码,蓝色是目录实体里的代码。要区分一下,主要是传入的ID不一样。
Public Overrides Function GetParentPath() As String
Static path As String = String.Empty
If Me.FileConnection Is Nothing Then
Throw New Lily.Core.FileDataProvider.FileDataException("连接对象为空,不能进行文件管理。")
End If
If path Is Nothing OrElse path.Length = 0 Then
Dim t As New tb_目录管理
下面是文件的
path = Lily.Core.FileDataProvider.Util.GetParentPath(Me.FileConnection, t._ID.AttributeName, t._ParentID.AttributeName, t, Me.目录ID)
下面是目录的
path = Lily.Core.FileDataProvider.Util.GetParentPath(Me.FileConnection, t._ID.AttributeName, t._ParentID.AttributeName, t, Me.ParentID)
End If
If Not path Is Nothing OrElse path.Length > 0 Then
Return path
Else
Return String.Empty
End If
End Function
文件实体对象就创建好了。由于类的继承是单一的,这样实体就不具备权限方面的属性。可以通过以下这段代码来解决这个问题。
获取权利管理对象
ReadOnly Property Permission() As Lily.ComponentFramework.IPermission
Get
Return Lily.ComponentFramework.ComponentManager.Permission
End Get
End Property
如增加一个删除文件判断的方法。
Public Overridable Function HasDeleteFile() As Boolean
Return Me.Permission.Has(Me, "删除文件")
End Function
对于控件,还需要重写基类的GetPurviewObjectList方法。
Public Overrides Function GetPurviewObjectList() As System.Collections.ArrayList
Static ary As ArrayList
If ary Is Nothing Then
ary = New ArrayList
Else
Return ary
End If
ary.Add(New Common.tb_文件管理)
Return ary
End Function
基础了,我们来看看。文件对象的添加,删除,下载,查看。
上传文件:
dim item as new tb_文件管理
dim o as new tb_文件管理_Operate
item._文件.LocalFile="c:\1.txt"
o.Accept(Me.item)
删除文件:
Dim o As New Common.tb_文件管理_Operate
o.Delete(item)
其实删除与删除实体是一样,文件对象就是一个实体,只是在删除实体记录时,删除相应的文件记录。这中间启用了事务,保证了记录与物理文件的对应关系。但是删除最好不要嵌套,这样就不能保证关系的一致性了。因为文件删除后,不能回滚。
下载文件:
item._文件.DownFile(s.FileName)
其实s.Filename下载存放的路径。
远程路径:
Dim file As String = Me.ActiveFile.FileConnection.GetFullPath(Me.ActiveFile._文件)
FileViewerNav.Viewer(file)
这里为什么调用FileConnection对象的GetFullPath方法获取全路径呢,为什么不使用me.ActiveFile._文件.RemoteFullFileName属性。因为了RemoteFullFileName返回的路径可能是一个相对的。局域网上一个绝对的,FTP是相对的。而FileConnection的getfullPath方法返回就是一个绝对的远程路径。对于局域网就是\\xxx.xxxx.xxxx.xxx\user 这样的路径方式;FTP类似于ftp://user:pwd@xxx.xxx.xxx.xxx:21/3/4/1.txt 这样的路径。
目录操作与文件操作类似。