对于比大的
项目来说,CQ不仅
管理了所有的defect信息,可能也
管理了很多其他信息,如
需求等。
而所有的这些信息中,有很多信息都包含有附件,如defect中会有screenshot(defect的抓图),
而需求中又可能会有需求
文档文件信息。其中的一些都是很重要的,所以需要动态的把这些
文件
保存的一个别的位置,如一个FTP上(保存到本地某个
目录相对比较简单,在此不作介绍)。
以下就是对这个问题的一个
解决方案。
问题描述:在Submit一个defect时,把这个defect的附件全部上传到一个FTP
服务器上。
--------------------------------------------------------------------------------------------------------------------
问题分解:首先通过CQ的API取得当前record的所有attachment,然后把它们保存到本地的一个临
时目录中(在此为C:\temp),其次就是把这些文件上传到目标FTP上(需要一个有写
权限的
FTP帐号),最后,
删除本地临时目录中的临时文件。
--------------------------------------------------------------------------------------------------------------------
问题解决:在这个解决方案中,因为涉及到对FTP的操作,所以引入了一个比较有用的组件ChilkatFtp,
这个组件需要
下载安装,使用起来简单,方便,是目前比较好的一个FTP组件,提供免费
下载,
地址为:
http://www.chilkatsoft.com/downloads.asp,然后下载Chilkat's (Free) FTP ActiveX,
下载后直接安装, 然后就可以使用。
提示:当提交bug时,script首先会在CQAttach目录下以这个defect的ID为名,create一个文件夹,
如pro000001,然后把这个object的附件上传到这个下面。
--------------------------------------------------------------------------------------------------------------------
'---------------------------------------------------------------------------------------------------------------'
' Script Name: Upload_File_To_FTP_AT_Submitting.vbs '
' Author: yunshan '
' Date: 2007-2-7 '
' Description:
Add this script to the commit hook of the Submit in ClearQuest, if there '
' have attachments with the current object, these attachment will be upload the FTP '
'
server when submit it. You just need change the config info to meet your need. '
' Enjoy it and Happy new year! '
'---------------------------------------------------------------------------------------------------------------'
Const OTEMP = "C:\temp\" ' This is the local cache folder
Const OREMOTE = "CQAttach\" ' This is the destination folder on the FTP under the root
Const USERNAME = "loginname" ' This is the user name for login to the server
Const PASSWORD = "password" ' This is the password
Const HOSTNAME = "127.0.0.1" ' This is the FTP Address
Dim session
Dim fso
Dim ftp
Dim oID
Dim oFileName
Set session = GetSession
Set fso = CreateObject("Scripting.FileSystemObject")
Set ftp = CreateObject("ChilkatFTP.ChilkatFTP")
' if the cache folder not exist, then create it
If Not fso.FolderExists(OTEMP) Then
fso.CreateFolder(OTEMP)
End If
' Connect to the FTP server
ftp.Username = USERNAME
ftp.Password = PASSWORD
ftp.Hostname = HOSTNAME
OK =
ftp.Connect
If OK <> 1 Then
WScript.Echo
ftp.LastErrorText
End If
' Switch to the destination folder on the remote FTP server
ftp.ChangeRemoteDir OREMOTE
oID = GetfieldValue("id").GetValue
ftp.CreateRemoteDir oID
ftp.ChangeRemoteDir oID
' get all the attachments of the current entity
' and put them on the FTP when submit the defect
Set oAttachFields = AttachmentFields
Set oAttachField = oAttachFields.Item(0)
Set oAttachments = oAttachField.Attachments
For Each oAttachment In oAttachments
oFileName = OTEMP & fso.GetFileName(oAttachment.FileName)
' oAttachment.Load oFileName
fso.CopyFile oAttachment.FileName, OTEMP
OK =
ftp.PutFile(oFileName, fso.GetFileName(oAttachment.FileName))
If OK <> 1 Then
WScript.Echo
ftp.LastErrorText
End If
Next
' Shutdown the connection
ftp.Disconnect
' Clear all the contents in the local temp folder
fso.DeleteFile OTEMP & "*.*"
' Release all the objects
Set oAttachments = Nothing
Set oAttachField = Nothing
Set oAttachFields = Nothing
Set ftp = Nothing
Set fso = Nothing
Set session = Nothing
------------------------------------------------------------------------------------------------------------------------------
以下为这个FTP组件的属性和method的说明
------------------------------------------------------------------------------------------------------------------------------
[size=+2]Properties
Hostname As String
The FTP server hostname.
IsConnected As Long (read-only)
Returns true if currently connected and logged into an FTP server, otherwise returns false.
LastErrorHtml As String (read-only)
Error information in HTML format for the last method called.
LastErrorText As String (read-only)
Error information in plain-text format for the last method called.
LastErrorXml As String (read-only)
Error information in XML format for the last method called.
ListPattern As String
A wildcard pattern, defaulting to "*" that determines the files and directories included in the following properties and methods: NumFilesAndDirs, GetCreateTime, GetFilename, GetIsDirectory, GetLastAccessTime, GetModifiedTime, GetSize.
NumFilesAndDirs As Long (read-only)
The number of files and sub-directories in the current remote directory that match the ListPattern. (The ListPattern defaults to "*", so unless changed, this is the total number of files and sub-directories.)
Passive As Long
Set to true for FTP to operate in passive mode, otherwise set to false for non-passive (the default).
Password As String
Password for logging into the FTP server.
Port As Long
Port number. Automatically defaults to the default port for the FTP service.
Proxy As String
The name of a proxy server when accessing FTP via a proxy .
UseIEProxy As Long
Set this property to true to use the FTP proxy configured for Internet Explorer.
Username As String
Username for logging into the FTP server. Defaults to "anonymous".
Version As String (read-only)
Version of the component, such as "1.0.0"
[size=+2]Methods
ChangeRemoteDir(relativeDirPath As String) As Long
Changes the current remote directory.
Connect() As Long
Connects and logs in to the FTP server using the username/password provided in the component properties.
CreateRemoteDir(dir As String) As Long
Creates a directory on the FTP server. Returns true for success, false for failure. If the directory already exists, a new one is not created and false is returned.
DeleteMatching(remotePattern As String) As Long
Deletes all the files in the current remote FTP directory matching the pattern. Returns the number of files deleted, or -1 for failure. The pattern is a string such as "*.txt", where any number of "*" or "?" wildcard characters can be used. "*" matches 0 or more of any character, and "?" matches exactly 1 of any character.
DeleteRemoteFile(filename As String) As Long
Deletes a file on the FTP server.
Disconnect()
Disconnects from the FTP server, ending the current session.
GetCreateTime(index As Long) As Date
Returns the create time for the Nth file or sub-directory in the current remote directory. The first file/dir is at index 0, and the last one is at index (NumFilesAndDirs-1)
GetCurrentDirListing(pattern As String) As String
Returns (in XML format) the files and directories in the current directory matching the pattern. Passing "*.*" will return all the files and directories.
GetCurrentRemoteDir() As String
Returns the current remote directory.
GetFile(remoteFilename As String, localFilename As String) As Long
Copies a file from the FTP server to the local filesystem. Returns true for success and false for failure.
GetFilename(index As Long) As String
Returns the filename for the Nth file or sub-directory in the current remote directory. The first file/dir is at index 0, and the last one is at index (NumFilesAndDirs-1)
GetIsDirectory(index As Long) As Long
Returns1 for a sub-directory and 0 for a file, for the Nth entry in the current remote directory. The first file/dir is at index 0, and the last one is at index (NumFilesAndDirs-1)
GetLastAccessTime(index As Long) As Date
Returns the last access time for the Nth file or sub-directory in the current remote directory. The first file/dir is at index 0, and the last one is at index (NumFilesAndDirs-1)
GetLastModifiedTime(index As Long) As Date
Returns the last modified time for the Nth file or sub-directory in the current remote directory. The first file/dir is at index 0, and the last one is at index (NumFilesAndDirs-1)
GetRemoteFileBinaryData(remoteFilename As String) As Variant
Returns the contents of a remote file. A null is returned on failure.
GetRemoteFileTextData(remoteFilename As String) As String
Returns the contents of a remote file. A null is returned on failure.
GetSize(index As Long) As Long
Returns the size of the Nth remote file in the current directory.
MGetFiles(remotePattern As String, localDir As String) As Long
Copies all the files in the current remote FTP directory to a local directory. To copy all the files in a remote directory, set remotePattern to "*.*" The pattern can contain any number of "*" or "?" characters where "*" matches 0 or more of any character, and "?" matches any single character. The return value is the number of files transferred, and on error, a value of -1 is returned. Detailed information about the transfer can be obtained from the XML log.
MPutFiles(pattern As String) As Long
Copies all the files matching pattern on the local computer to the current remote FTP directory. The pattern parameter can include directory information, such as "C:/my_dir/*.txt" or it can simply be a pattern such as "*.*" that matches the files in the application's current directory. Subdirectories are not recursed. The return value is the number of files copied, with a value of -1 returned for errors. Detailed information about the transfer can be obtained from the XML log.
PutFile(localFilename As String, remoteFilename As String) As Long
Copies a local file to the current directory on the FTP server.
PutFileFromBinaryData(remoteFilename As String, binaryData As Variant) As Long
Creates a file on the remote server containing the data passed in a byte array. Returns true for success, false for failure.
PutFileFromTextData(remoteFilename As String, textData As String) As Long
Creates a file on the remote server containing the data passed in a string. Returns true for success, false for failure.
RemoveRemoteDir(dir As String) As Long
Removes a directory from the FTP server.
RenameRemoteFile(existingFilename As String, newFilename As String) As Long
Renames a file on the FTP server.
SaveLastError(filename As String)
Saves the last error information to an XML formatted file.