23 123
发新话题
打印

[原创] 在提交记录的同时,把它的附件上传到一个FTP上( 此文章被查看:4318次,被回复:22篇!! )

本主题被作者加入到个人文集中

在提交记录的同时,把它的附件上传到一个FTP上

对于比大的项目来说,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.



© 本文为 yunshanSCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

回复 #1 yunshan 的帖子

yunshan好贴。不过我不明白把附件上传的FTP的作用是什么?由于附件非常占用数据库的空间,要经常移动,所以我想实现一个附件能够保存到FTP 服务器上,而不是保存到数据库,而且每次读取纪录时也能从FTP服务器上读取到这个附件,也就是对用户来说没有区别,但附件不在保存到数据库了。你的帖子给了我一个思路,这段时间正在研究这个实现,在IBM网站上看到一个处理方法到还没有仔细研究,而且是perl写的,看这几天有没有时间研究下这个问题。如果yunshan和坛子了其他高手有什么好的想法也麻烦大家分享一下。



© 本文为 killer215SCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员

TOP

yunshan太强悍!这个正好需要!
谁比我还快?加了精华?



© 本文为 听雨屋檐人SCMLife 共同所有,未经同意,请勿转载 ©如该文侵犯了您的版权,请联系管理员
clearcase+clearquest个人博客:听雨屋檐人的博客
听雨屋檐人的淘宝小店!:听雨屋檐人的淘宝小店,欢迎光临

TOP

真遗憾,一点都看不懂啊,能不能给点简单易懂的啊

© 本文为 tianting004 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #2 killer215 的帖子

这个上传到FTP上,其实就是相当于一个备份,而CQ每次读取仍然是本地的数据。

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #5 yunshan 的帖子

yunshan
实践了以后
感觉很实用
但是如果有多个附件的字段
它只会上传第一个附件 后面的不上传
还有有没有方法只上传指定字段的附件呀??

© 本文为 ljs53 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #6 ljs53 的帖子

如果有多个attachment字段,其实也很简单,只要把其中的for循环改一下就可以了,
Set oAttachFields = AttachmentFields
for each oAttachField in oAttachFields
  Set oAttachments = oAttachField.Attachments
  For Each oAttachment In oAttachments
     do something....
  Next
Next

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

Set oAttachField = oAttachFields.Item(0)
我是更改了这里!来取其他附件!呵呵!
一用循环我的服务器就被干坏了!不知道为啥!寒

© 本文为 听雨屋檐人 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员
clearcase+clearquest个人博客:听雨屋檐人的博客
听雨屋檐人的淘宝小店!:听雨屋檐人的淘宝小店,欢迎光临

TOP

' 先在本地调试一下,这个问题应该不大
     ' Show the number of attachment fields
     ' 我想不至于死循环的
     oAttachNum = oAttachFields.Count
     MsgBox "Number of attachment fields: " & oAttachNum

© 本文为 yunshan 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

回复 #7 yunshan 的帖子

这段代码有问题
会报错

© 本文为 ljs53 所有,未经同意,请勿转载
©如该文侵犯了您的版权,请联系管理员

TOP

 23 123
发新话题