搜索
查看: 1330|回复: 2

miniblink 下载文件演示

[复制链接]

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2018-6-26 05:54:12 | 显示全部楼层 |阅读模式
首先请先更新  web.blink( miniblink ) 扩展库到最新版才能响应 onDownload事件。

这个 onDownload 事件本来是需要下载文件的时候触发,但是miniblink 的规则是有时候不是下载文件也会触发(例如CSS里的字体这些也会偶尔触发这个事件),根据我的测试,打开一些网页这个函数会被大量的回调,所以我们必须想办法区分哪个才是真正需要下载的文件。

miniblink 在打开一个链接失败时会触发 onRequestFinish事件,并且在参数中包含错误代码。
而下载总是会触发这个事件的错误代码,但只要出错,这个参数中的url就是空的,所以我们需要在 onDownload  事件中先把URL记下来,再在onRequestFinish中进一步确定这个网址是浏览器打不开的,然后再弹出下载。关键的代码如下:
mb.onRequestFinish = function(url,errCode, errMessage){
   
if( errCode ){
        
//这里下载mb.fileDownloadUrl
    }
}

mb.onDownload =
function(url){
    mb.fileDownloadUrl = url;
//这里记录要下载的网址
}
到这里,我们距离成功成有一点距离,
因为用上面的代码,我们还并不能完全肯定这个网址是一个文件下载的链接(他可能还真的是打不开的,或者其他打不开又不需要下载的链接)

这时候我们需要试着用head方法再次向服务器请求HTTP头,获取文件的实际类型。
但是这里又会有一些大问题,例如字体,一些服务器会返回  "application/octet-stream" 而不是正确的MIME,这时候我们就搞不清楚是怎么回事了。所以为了精确的判断,我们先提取URL的后缀名,本地检测MIME做初步的排除,代码如下:
import fsys.mime;
mb.onDownload =
function(url){
   
//先检测后缀名(考虑到有一些服务器不会返回正确的MIME,例如字体返回application/octet-stream)
    var c = fsys.mime.fromUrl(url);
   
if( string.match(c,"^<text>|<image>/" ) )return false;
   
if( string.find(c,"<javascript>|<json>|<html>|<xml>" ) )return false;
   
    mb.fileDownloadUrl = url;
}
然后我们需要在 onRequestFinish 事件里再次仔细的分析服务器返回的所有细节,代码如下:
import inet.http;
var http = inet.http()
var getDownloadFileName = function(url){   
   
if(!url) return;
    url = http.location(url);
//考虑可能有重定向的URL
    if( !http.head(url) ) return; //考虑无法连接的URL
   
   
var c = http.readHeader("Content-Type");
   
var r = http.readHeader("Accept-Ranges");
   
var filename = http.readHeaderContent()[["disposition"]][["filename"]];
   
if(!filename) return;
   
   
if( string.cmp(r,"bytes") == 0 ) return filename;
   
   
if(c){
        c = string.lower(c);
        
if( c == "application/octet-stream" ) return filename;
        
if( string.match(c,"^<text>|<image>/" ) ) return false;
        
if( string.find(c,"<javascript>|<json>|<html>|<xml>" ) )return false;
        
return filename;
    }
};

import fsys.dlg;
import inet.downBox;
mb.onRequestFinish =
function(url,errCode, errMessage){
   
if( errCode ){
        
var filename = getDownloadFileName(mb.fileDownloadUrl);
        mb.fileDownloadUrl =
null;
        
if(!filename) return;
        
        
var path = fsys.dlg.save(,"下载文件",,winform,,filename);
        
var downBox = inet.downBox(winform,"下载");
        
if( downBox.download(mb.fileDownloadUrl,path) ) {
            
        }
    }
}
完整代码发下:
import win.ui;
/*DSG{{*/
var winform = win.form(text="miniblink下载文件演示";right=1213;bottom=743)
/*}}*/

import web.blink.form;
var mb = web.blink.form(winform)

import inet.http;
var http = inet.http()
var getDownloadFileName = function(url){   
   
if(!url) return;
    url = http.location(url);
//考虑可能有重定向的URL
    if( !http.head(url) ) return; //考虑无法连接的URL
   
   
var c = http.readHeader("Content-Type");
   
var r = http.readHeader("Accept-Ranges");
   
var filename = http.readHeaderContent()[["disposition"]][["filename"]];
   
if(!filename) return;
   
   
if( string.cmp(r,"bytes") == 0 ) return filename;
   
   
if(c){
        c = string.lower(c);
        
if( c == "application/octet-stream" ) return filename;
        
if( string.match(c,"^<text>|<image>/" ) ) return false;
        
if( string.find(c,"<javascript>|<json>|<html>|<xml>" ) )return false;
        
return filename;
    }
};

import fsys.dlg;
import inet.downBox;
mb.onRequestFinish =
function(url,errCode, errMessage){
   
if( errCode ){
        url = mb.fileDownloadUrl;
        mb.fileDownloadUrl =
null;
        
var filename = getDownloadFileName(url);
      
        
if(!filename) return;
        
        
var path = fsys.dlg.save(,"下载文件",,winform,,filename);
        
var downBox = inet.downBox(winform,"下载");
        
if( downBox.download(url,path) ) {  }
    }
}

import  fsys.mime;
mb.onDownload =
function(url){
   
//先检测后缀名(考虑到有一些服务器不会返回正确的MIME,例如字体返回application/octet-stream)
    var c = fsys.mime.fromUrl(url);
   
if( string.match(c,"^<text>|<image>/" ) )return false;
   
if( string.find(c,"<javascript>|<json>|<html>|<xml>" ) )return false;
   
    mb.fileDownloadUrl = url;
}

//打开网页
mb.go("http://www.aardio.com")
winform.show();

win.loopMessage();

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
 楼主| 发表于 2018-6-26 06:32:18 | 显示全部楼层
为了节省时间,我们可以新建一个库用来扩展 web.blink 的功能。
我已经在 web.blink 扩展库里添加了 web.blink.downBox 用来创建下载对话框,这个库已经包含了上面的代码。

用起来很简单,两句就可以了:
import web.blink.downBox;
web.blink.downBox(mb);
这是 aardio 的一个好处,模块化重用代码非常方便,再多代码我们扔到一个库里,下次都可以很轻松的重用。

完整测试代码如下:
import win.ui;
/*DSG{{*/
var winform = win.form(text="miniblink下载文件演示";right=1213;bottom=743)
winform.add()
/*}}*/

import web.blink.form;
var mb = web.blink.form(winform)

import web.blink.downBox;
web.blink.downBox(mb);

//打开网页
mb.go("http://www.aardio.com")
winform.show();

win.loopMessage();


回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
 楼主| 发表于 2018-6-26 08:03:47 | 显示全部楼层
更新了一下,添加了共享会话功能,测试可用miniblink登录论坛后,再下载论坛附件成功。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-20 03:23 , Processed in 0.078125 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表