`
帅子
  • 浏览: 79432 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Air客户端与服务器文件同步基本框架FileSync

    博客分类:
  • Air
阅读更多
/**
* AUTHOR: 李同刚 于 二零一一年四月
* 文件同步操作封装,自动处理上传和下载数据发生的异常:
* - 网络原因 或 服务器停止造成数据不完整
* - 把服务端返回的错误信息当数据下载
* 调用示例:
* FileSync.download('http://localhost/big.zip','mydocument/foo.zip',
* function(event, msg){ //下载失败的回调函数 event参数表示事件对象 msg参数表示错误信息
* alert(msg+ " | " + event.target)
* return true // 返回true保留不合法数据 false 删除数据
* },
* function(file){ //下载成功的回调函数 file参数为下载的文件对象File
* alert("success: " + file.nativePath)
* }
* )
*/


var FileSync = {}

/**
* 自定义事件类型
*/
FileSync.__events__ = {

BadDataErrorEvent : function(target, text){
this.text = text ? text : '下载的数据不完整'
this.target = target
},

IOError : function(target, text){
this.text = text ? text : '文件被占用,无法操作'
this.target = target
}
}
FileSync.BadDataErrorEvent = FileSync.__events__.BadDataErrorEvent
FileSync.BadDataErrorEvent.prototype = new air.ErrorEvent('BadData',false,false,null,10000)
FileSync.IOError = FileSync.__events__.IOError

/**
* 下载数据
* @param {Object} url
* @param {Object} localFilePath
* @param {Object} exceptionCallback
* @param {Object} successCallback
*/
FileSync.__download__ = {

main : function(url,localFilePath,exceptionCallback,successCallback){
var file = air.File.documentsDirectory
var filePath = localFilePath.substring(0, localFilePath.lastIndexOf("/")+1)
var fileName = localFilePath.substring(localFilePath.lastIndexOf("/")+1)
var path = file.resolvePath(filePath);
if(!path.exists)
path.createDirectory();
FileSync.__download__.baseDown(url, filePath, fileName ,exceptionCallback,successCallback)
},

baseDown : function(url, filePath, fileName ,exceptionCallback,successCallback){
var stream = new air.URLStream();
    FileSync.__download__.addListener(stream,filePath, fileName,exceptionCallback,successCallback)
    var request = new air.URLRequest(url)
   try{
        stream.load(request)
    } catch (error) {
            if(stream.connected)
                stream.close()
        air.trace("Unable to load requested document.")
    }
},

addListener : function(stream, filePath , fileName ,exceptionCallback,successCallback){

var currentPosition = 0, downloadCompleteFlag = false, isExceptionComplete = false, bytesTotal
var temFileName = fileName + '.tem'
var file = air.File.documentsDirectory.resolvePath(filePath + temFileName)
var fileStream = new air.FileStream()
fileStream.open(file, air.FileMode.WRITE)

var processExceptionComplete = function (event, errorText) {
try {
isExceptionComplete = true
downloadCompleteFlag = true
fileStream.close()
if (stream.connected)
stream.close()
// 处理异常下载的数据
var temFile = air.File.documentsDirectory.resolvePath(filePath + temFileName)
if (exceptionCallback && typeof(exceptionCallback) == 'function') {
var retn = exceptionCallback(event, errorText ? errorText : event.text)
if (!retn && temFile.exists)
temFile.deleteFile()
}
}catch(error){
air.trace("processExceptionComplete ERROR: " + error)
}
air.trace("processExceptionComplete: " + event)
}

var openHandler = function(event) {
    air.trace("openHandler: " + event)
}

var httpStatusHandler = function (event) {
    air.trace("httpStatusHandler: " + event)
var ok = 200
if(event.status != 200 && (!isExceptionComplete))
processExceptionComplete(event, 'HTTP状态异常[HttpStatus: ' + event.status + ']')
}

var progressHandler = function (event) {
air.trace("progressHandler: " + event)
bytesTotal = event.bytesTotal
var bytes = new air.ByteArray()
            var thisStart = currentPosition
            currentPosition += stream.bytesAvailable
            try{
                stream.readBytes(bytes, thisStart)
                fileStream.writeBytes(bytes, thisStart)
            }catch(e){
if(!isExceptionComplete)
                processExceptionComplete(event, 'ProgressEvent事件异常,内存溢出')
air.trace("progressHandler exception: " + e)
            }

}

var ioErrorHandler = function (event) {
if(!isExceptionComplete)
processExceptionComplete(event, 'IOErrorEvent事件异常')
    air.trace("ioErrorHandler: " + event)
}

stream.addEventListener(air.ProgressEvent.PROGRESS, progressHandler);
    stream.addEventListener(air.Event.OPEN, openHandler)
    stream.addEventListener(air.HTTPStatusEvent.HTTP_STATUS, httpStatusHandler)
stream.addEventListener(air.IOErrorEvent.IO_ERROR, ioErrorHandler);
stream.addEventListener(air.Event.COMPLETE, function(event){
air.trace("completeHandler: " + event)
if (!isExceptionComplete) {
// 校验数据
var temFile = air.File.documentsDirectory.resolvePath(filePath + temFileName)
if (!temFile) {
processExceptionComplete(new FileSync.BadDataErrorEvent(temFile.nativePath, '文件不存在'))
return
}
if (temFile.size != bytesTotal) {
processExceptionComplete(new FileSync.BadDataErrorEvent(temFile, '文件字节数小于服务器数据['+temFile.size+'<'+bytesTotal+']'))
return
}
// 数据合法
fileStream.close()
if (stream.connected)
stream.close()
var file = air.File.documentsDirectory.resolvePath(filePath + fileName)
try{
    temFile.copyTo(file, true);
}catch (error){
if(error.constructor == window.runtime.flash.errors.IOError){
processExceptionComplete(new FileSync.IOError(temFile, '目标文件被占用['+filePath + fileName+']'))
return
}
}
if(successCallback && typeof(successCallback) == 'function')
successCallback(file)
}
})
}
}
/** 公开调用函数 **/
FileSync.download = FileSync.__download__.main

FileSync.upload = function(){

}
0
3
分享到:
评论

相关推荐

    文件同步FileSync

    FileSync,作为我们讨论的核心,很显然是一款专注于文件同步的工具或服务。它旨在确保多个设备或位置之间的文件保持一致,无论是在同一网络内还是跨网络进行操作。 文件同步的基本原理是通过比较源文件和目标文件的...

    FileSync-for Eclipse插件.rar

    - 文件和目录的双向同步:FileSync允许用户在本地工作空间和远程服务器之间进行文件和目录的同步,确保代码的一致性。 - 自定义同步规则:用户可以根据需求设定不同的同步策略,比如只同步特定的文件类型或忽略...

    eclipse插件FileSync

    1. **实时同步**:FileSync允许用户设置本地工作空间与指定远程服务器之间的文件同步。一旦工作空间中的文件发生更改,插件会自动或手动将这些更改同步到服务器,反之亦然。这在团队协作中特别有用,确保所有成员都...

    文件同步插件FileSync_1.3.10.202006062100.jar

    FileSync插件

    专业文件同步备份器filesync

    可以快速的备份目录中的所有文件和文件夹,并可以快速对两个目录的文件保持同步,使其完全一致,是您备份重要文件的理想助手。   可以设置备份的目录列表,并可以有选择备份其中的一条或几条设置。   同步过程软件...

    eclipse插件FileSync.zip

    《Eclipse插件FileSync:轻松实现文件同步》 在编程世界里,开发环境的配置往往对工作效率有着重大影响。Eclipse作为一款广受欢迎的Java集成开发环境(IDE),其丰富的插件库为开发者提供了无尽的可能性。其中,...

    filesync:用于分布式系统类的 Java 客户端-服务器文件同步程序

    概括这个文件同步包是墨尔本大学分布式系统课程的一个项目,是一个使用预先指定的消息传递协议的多线程客户端-服务器程序的例子。 它处理客户端和服务器之间的文件同步,可以通过客户端或服务器推送来执行(但客户端...

    FileSync:FileSync是一个基于Java Socket的应用程序,用于使多个客户端上的文件保持同步。 它包含一个服务器和一个客户端应用程序。 多个客户端可以连接到服务器,并且此应用程序将自动同步其存储库

    文件同步FileSync是一个基于Java Socket的应用程序,用于使多个客户端上的文件保持同步。 它包含一个服务器和一个客户端应用程序。 多个客户端可以与服务器连接,并且此应用程序将自动同步其存储库。 该应用程序当前...

    客户端和服务端时间同步

    客户端和服务端时间同步,实现了时间同步问题

    Moleskinsoft File Sync文件同步备份复制拷贝

    "Moleskinsoft File Sync"是一款专门用于文件同步和备份的实用工具,主要功能是帮助用户在不同的设备或存储位置之间保持文件和文件夹的一致性。尽管它的界面为英文,但其直观的设计使得即便是对英文不太熟悉的用户也...

    NTP服务器的配置以及客户端自动同步

    NTP 服务器的远程主机的IP或注册名称、参考的上一层NTP服务器的地址、优先级、远程主机的时间源类型、距离上一次同步的秒数、距离下一次同步的秒数、已经向上层NTP服务器更新的次数、网络传输的延迟、远程服务器与...

    Java文件同步开源项目Sync

    通过深入理解和使用Java文件同步开源项目Sync,开发者可以构建自己的文件同步解决方案,满足特定业务场景的需求,例如实现自动备份、多服务器之间的数据同步,或是优化现有文件管理系统。无论是个人开发者还是企业,...

    FileSync 文件监控同步工具

    FileSync是一款实用的文件监控同步工具,它主要针对的是IT专业人士,尤其是那些需要实时跟踪和同步文件变化的开发者或系统管理员。这款工具具有多任务处理能力,可以同时对多个文件夹进行监控,确保用户能及时捕获到...

    file_sync_linuxfilesync_filesync_文件同步_linux_properly61r_

    2. **元数据交换**:客户端通过JSON格式发送要同步的文件元数据到服务器端。 3. **文件差异分析**:服务器端分析元数据,确定需要同步的文件及其变更。 4. **数据传输**:根据差异分析结果,传输需要更新的文件内容...

    FileSync插件

    2. **远程同步**:通过FTP、SFTP或WebDAV等协议,FileSync可以与远程服务器进行文件同步,这对于团队协作和部署项目到远程服务器特别方便。 3. **增量同步**:FileSync能够智能检测文件的变化,仅同步修改过的部分...

    FileSync:FileSync 提供文件同步功能

    filesync(文件同步插件) FileSync 提供文件同步功能。 保存文件后,可以将其同步到另一个文件夹。 如果您也有netrw插件,您还可以与netrw可以保存的任何内容同步。 这意味着ftp 、 ssh 、 scp和netrw支持的任何...

    filesync-v1.0.0.tar.gz

    filesync运行后,将会对在配置文件中配置的源目录以及目录下的所有文件进行监控,一旦检测到有事件发生,立即对该事件进行记录,在确认事件已经完成后,根据配置文件中的同步规则生成任务,并将生成好的任务发送到目标...

    File Sync-文件对比工具-绿色版

    《FileSync:高效实用的文件对比与同步工具》 在日常工作中,我们经常需要处理大量的文件,有时需要确保文件之间的同步,或者找出不同版本间的差异。File Sync,一款绿色小巧的文件对比工具,恰恰能帮助我们解决...

    LOG FILE SYNC概述

    【LOG FILE SYNC】是Oracle数据库中常见的等待事件,主要涉及事务提交、回滚、DDL操作以及数据字典的修改。当事务执行完一系列操作后,需要将redo日志记录写入磁盘,以保证数据的一致性和持久性,此时就会发生LOG ...

    使用FileSync来调试JSP

    通过设置FileSync的配置,我们可以实现本地代码与远程服务器之间的自动同步。这大大提高了开发效率,减少了调试时间。 在开始使用FileSync之前,确保你已经安装了Java运行环境,因为FileSync依赖于Java。接下来,你...

Global site tag (gtag.js) - Google Analytics