-
Android官方开发文档Training系列课程中文版:分享文件之获取文件信息
2016-04-07 17:29:02之前的课程讲述了客户端APP试图与含有文件的URI一同运行,APP可以请求服务端APP的文件信息,包括文件的数据类型以及文件的大小。这些数据类型可以帮助客户端APP来判断该文件是否可以处理,文件的大小可以帮助客户端...原文地址:http://android.xsoftlab.net/training/secure-file-sharing/retrieve-info.html
之前的课程讲述了客户端APP试图与含有文件的URI一同运行,APP可以请求服务端APP的文件信息,包括文件的数据类型以及文件的大小。这些数据类型可以帮助客户端APP来判断该文件是否可以处理,文件的大小可以帮助客户端APP对该文件设置相应大小的缓冲区。
这节课演示了如何查询服务端APP返回文件的MIME类型以及大小。
获取文件的MIME类型
一个文件的数据类型指示了客户端APP应该如何处理这个文件的内容。为了获取URI对应文件的数据类型,客户端APP需要调用方法ContentResolver.getType()。这个方法返回了文件的MIME类型。默认情况下,FileProvider可以从文件的扩展名来判断文件的MIME类型。
下面这段代码演示了客户端APP如何解析服务端APP返回的URI对应文件的MIME类型:
... /* * Get the file's content URI from the incoming Intent, then * get the file's MIME type */ Uri returnUri = returnIntent.getData(); String mimeType = getContentResolver().getType(returnUri); ...
获取文件的名称与大小
FileProvider类有一个query()方法的默认实现,该方法可以返回URI相关文件的名称与大小,不过结果位于一个Cursor对象中。默认的实现会返回两列:
- 这是文件的名称,是字符串类型。这个值与File.getName()方法返回的值相等。
- 这是文件的大小,以字节形式呈现,是long类型。这个值与File.length()方法返回的值相等。
客户端APP可以通过对query()方法设置null参数的方式来获得文件的名称与大小,当然URI参数除外。举个例子,下面这段代码获取了一个文件的名称与大小,并且在单独的TextView中进行了展示:
... /* * Get the file's content URI from the incoming Intent, * then query the server app to get the file's display name * and size. */ Uri returnUri = returnIntent.getData(); Cursor returnCursor = getContentResolver().query(returnUri, null, null, null, null); /* * Get the column indexes of the data in the Cursor, * move to the first row in the Cursor, get the data, * and display it. */ int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE); returnCursor.moveToFirst(); TextView nameView = (TextView) findViewById(R.id.filename_text); TextView sizeView = (TextView) findViewById(R.id.filesize_text); nameView.setText(returnCursor.getString(nameIndex)); sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
-
根据项目需求修改配置,完整配置请参考 ueditor.config.js 或 官方文档 <vue-ueditor-wrap v-model="msg" :config="myConfig"></vue-ueditor-wrap> data () { return { msg: '<h2><img src=...
-
-
python实现ftp 上传文件功能
2019-11-28 10:31:10经过一段时间的学习,通过视频和文档资料,根据视频一步一步的编写了一个ftp服务器,实现了用户...2…文件上传:文件上传避免发生粘包现象,可以传送一个包含文件大小的报文,在服务端获取到报文后,根据报文中文件...经过一段时间的学习,通过视频和文档资料,根据视频一步一步的编写了一个ftp服务器,实现了用户验证,文件上传,文件断点续传和上传进度条的显示
1.用户验证:用户验证相对来说较为简单,发送用户账号和密码,服务端获取验证请求后,去对比库中的账号密码是否一致,一致就可以继续交互,不一致,则断开链接
2…文件上传:文件上传避免发生粘包现象,可以传送一个包含文件大小的报文,在服务端获取到报文后,根据报文中文件的大小一段一段的去接收该文件。
3.文件断点续传:在上传文件途中,可能发生异常,导致文件上传不完整,下次上传时,可以通过判断文件是否存在,大小是否一致,文件存在但是文件大小不一致时,和客户端进行交互,如果客户端要续传,服务端可以先返回一个当前文件的大小,客户端在获取到后,上传前可以先利用F.seek()设置文件打开的位置,从而实现文件的续传
4.进度条相对较为简单,在传送过程中,利用已经发送的除以文件总大小获取传送进度的百分比。利用sys.stdout.write("%s%% %s+\r"%(rate_num,rate_num*"#")) 实现进度条打印(print一样)总结
这是开始学习python后自己写的第一功能的代码,在编写代码过程中遇到了很多的小错误,找错误是一个非常锻炼自己耐心和细心的地方,过程很煎熬,但是找到之后的如释重负的感觉也很让人舒服。
这次的代码编写,结合了socket编程,socketserver,configparse,os,sys,logging,optparse(这个模块第一次使用,以前运行脚本的时候怎么在调用脚本的时候传入参数一直不知道,这个模块可以实现,一种无形装逼的感觉),算是把前面学习的东西进行了一次练习,就是个人比较懒,没有吧该实现的功能实现完,后期有时间在补充。这也算是python学习洪迈进了第一步了,后续会继续学习多线程,python的web框架等等,加油 -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。 23、EJB与JAVA BEAN的区别? Java Bean 是可... -
quickling解决方案
2017-04-12 09:34:39保证首屏及核心功能最快展现,使得展示核心功能所需要获取的数据、生成的html文档大小、资源加载量、渲染工作量最小化;提高服务端的渲染效率和并行度,保证功能不会受到慢数据模块的影响;支持page cache和用户缓存...Quickling解决方案
Quickling适用于网络高延迟、低带宽场景的解决方案。
- 保证首屏及核心功能最快展现,使得展示核心功能所需要获取的数据、生成的html文档大小、资源加载量、渲染工作量最小化;
- 提高服务端的渲染效率和并行度,保证功能不会受到慢数据模块的影响;
- 支持page cache和用户缓存控制,可以避免大量的服务器端重复计算和客户端重复渲染
背景
Quickling这个词诞生自facebook Web优化方案,它指的是页面的某一个块可以通过Ajax请求,包括这块使用到的静态资源,然后通过JSON方式返回给前端加载器,前端加载器先加载静态资源然后渲染块,这样得到一个可展示的页面局部,可以把它放到当前页的任何地方。
Quickling解决方案也使用相同的原理。得益于FIS 2.0,我们很轻松就可以搞定整个逻辑的实现。
解决方案特性
介绍Quickling是如何工作。解决方案特性:
- A 支持任意一个widget被异步请求,请求内容包括渲染好的HTML及静态资源
- B 当widget指定为异步请求时,渲染引用此widget模版时不会渲染此widget,降低后端渲染模版压力。
使用场景
使用场景一栏,主要给大家展示一些案例,来引导理解整个解决方案。
案例一
项目A中使用方案提供的最初使用前端模板实现webapp一站式效果,但是前端渲染的形式,在展示的时候后端获取数据分为两步,展现页面时只能等数据拿到以后才能进行展现,而恰巧获取数据时比较慢,导致页面出现卡顿。那么我们用Quickling解决方案如何解决这个问题呢?
答案很简单,展现页面的时候也分为两步走,第一次渲染的时候拿到比较重要那块的数据,并渲染对应的部分页面。再发起一次异步请求,请求剩下的部分页面。这样至少用户不会感觉到卡顿。是不是看着似曾相识,这个就好比纯的WebApp在渲染一个页面时,请求两次数据并渲染页面一样。但这个是后端模板层面支持的。
案例二
项目B主要服务于东南亚地区,这些国家的网络有个特点,那就是慢,有IPHONE并使用移动号的同学拿出手机访问一下某网站试试,就那种感觉。通过项目B同学的反馈以及统计数据显示,下载HTML的速度都慢的可怜。还有一个问题并发时下载资源之间抢带宽,阻塞页面的渲染。
问题
总结一下俩问题上面两个案例的问题
- html太大,导致下载太慢
- 资源抢带宽,阻塞页面渲染
那通过 Quickling解决方案 如何解决问题呢。可以通过,
- 整个页面多次渲染,第一次访问或者刷新时只渲染首屏,这样展示首屏的时候就减少了很多html。下载变快了
- 拆分逻辑,把基础功能的css内联,增强功能的css在一定条件下触发请求,js进行异步加载。这样控制后页面渲染就变快了。
总结
案例一 和 案例二 中可以看到,Quickling解决方案很好的解决了这些遇到的问题,而案例中说到的情况就是方案已知的适用场景,其他场景还有待发现。
使用方法
很多同学到这里就有疑问了,如此复杂的请求方式,一个页面可以分块请求,是不是需要在开发的时候实现很多东西,维护起来很麻烦。答案是 否定 的。整个方案依托于FIS 2.0的前端架构思想,从目录结构到静态资源管理。只需要做很小的工作就瞬间享受到 Quickling解决方案 带来的新特性。
首先得有一个后端模板是Smarty的项目,并且是使用FIS制定的目录规范以及用FIS编译。目录结构是这样的;
├── build.sh ├── config ├── fis-conf.js ├── page ├── static ├── test └── widget
每个目录放些什么,就不一一说明了,见FIS2.0文档。我们只关注 widget 和 page 。
假设有一个widget widget_A ,包括一个模板文件widget_A.tpl和一个js文件widget_A.js还有一个css文件widget_A.css。有个页面 index.tpl 要使用这个widget。
├── page │ └── index.tpl └── widget └── widget_A ├── widget_A.js ├── widget_A.css └── widget_A.tpl
网站展示时渲染 index.tpl ,widget_A是页面中的一部分。
//index.tpl {%widget name="demo:widget/widget_A/widget_A.tpl"%}
当页面被渲染时,widget_A就展现在页面上了。
<html> ... <link href="widget_A.css" rel="stylesheet" type="text/css" /> .... <div> 我是widget_A </div> .... <script src="widget_A.js" type="text/javascript"></script> </html>
上面是正常的使用方式,就像方案二中说到的,如何让渲染index.tpl时不展示widget_A呢。
{%widget name="demo:widget/widget_A/widget_A.tpl" mode="quickling" pagelet_id="widget_A"%}
OK,改造完成。 加了
mode="quickling"
和pagelet_id="widget_A"
这俩参数。 这时候渲染页面的结果是什么呢?<html> ..... <textarea class="fis_g_bigrender" style=“display:none”>BigPipe.asyncLoad({id: "widget_A"})</textarea> <div id="widget_A"></div> ..... </html>
如上代码,做了俩事情。
- 挖了个坑
<div id="widget_A"></div>
,异步请求回来的widget_A的html就放在这个坑了。 - 在textarea里面打了一个JS函数,这个思路来自bigrender,可以在页面滚动到那个部位才去拉取数据。
等页面渲染完后,开发的同学需要做什么,他只需要把textarea里面的代码根据自己的需求执行就成,比如滚轮滚那个地方,domready后。。。这个自己决定。
说到这里我想你也知道如何使用了。
使用步骤 :
- widget调用的时候设定这个widget的 渲染模式 为
quickling
,mode="quickling"
- widget调用的时候设定pagelet_id,
pagelet_id="widget_A"
- 运行时,取出class="fis_g_bigrender"中包含的代码,运行它
- 页面引入前端加载器BigPipe.js
- 项目中使用方案提供的smarty插件
相关资源 :
优点和缺点
有了使用场景而且也知道如何使用,那现在开始总结一下它到底有哪些优点,事物都是双面的当然也有缺点。这栏总结一下整个方案的优缺点。按照一贯的做法,先说优点。
优点
- 灵活 页面widget可以灵活请求
- 可维护性高 FIS用户项目都是组件化的,维护肯定是最好的
- 使用简单 只需要关注那些页面部分想后展示、具体展示的时机
- 能解决特定问题 案例一和案例二已经说明了这一点。
缺点
- 增加了请求 一个页面渲染,如果某一个widget显然模式是“quickling”,那么渲染页面就会多一次请求
- 增加了服务器负担
性能本来就是一个折中,方案有优缺点,就看具体场景需要了。
-
未经检查的用户上传材质可能导致远程代码执行
2020-12-08 19:39:47那么客户端将其获取到本地后,可能造成远程代码执行(前提是客户端处理此图像的类库存在漏洞)。 需要注意的是,此漏洞单独而言无法对客户端造成威胁,必须配合客户端的其他漏洞才能... -
EasyAndroid 包含各种工具类的集合,会不定期更新,欢迎贡献code 使用方法: 2.0.0以后,放弃了support库,请使用AndroidX ...resource2Bitmap : 根据资源ID获取一个指定大小的bitmap getBitmapFromFile ...
-
Node直出理论与实践总结
2021-01-03 17:16:22直出稍微不同的是需要考虑的是服务端最终渲染出来的文档的大小,在范围内也可将 CSS 文件内联到 HTML 中。这样的话,便优化了 CSS 的获取时间,如下图 <p><img alt="4" src=... -
JAP编程学习100例
2018-08-26 14:38:151、多种字体大小显示 2、c:out标记输出 3、获取当前时间 4、include包含语句 5、建立错误处理页面的范例程序 6、jsp:forward 7、简单计数器 8、设置页面属性 9、使用GB2312编码 10、使用Big5编码 11、c:catch的用法 ... -
JSP实例编程100例
2018-05-09 21:45:351、多种字体大小显示 2、c:out标记输出 3、获取当前时间 4、include包含语句 5、建立错误处理页面的范例程序 6、jsp:forward 7、简单计数器 8、设置页面属性 9、使用GB2312编码 10、使用Big5编码 11、c:catch的用法 ... -
vc++ 应用源码包_1
2012-09-15 14:22:12然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 ... -
vc++ 应用源码包_2
2012-09-15 14:27:40然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 ... -
vc++ 应用源码包_6
2012-09-15 14:59:46然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 ... -
vc++ 应用源码包_5
2012-09-15 14:45:16然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 ... -
vc++ 应用源码包_4
2012-09-15 14:38:35然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 ... -
vc++ 应用源码包_3
2012-09-15 14:33:15然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 ... -
Java开发实战1200例(第2卷)(完整版).(清华出版.李钟尉.陈丹丹).part1
2016-06-12 23:30:05实例302 获取网络资源的大小 474 实例303 解析网页中的内容 475 实例304 网络资源的单线程下载 476 实例305 网络资源的多线程下载 478 实例306 下载网络资源的断点继传 480 第11章 TCP套接字 483 11.1 Socket基础 ... -
Silverlight2.0功能展示Demo源码
2009-02-26 14:16:55Volume - 音量大小 Balance - 音量平衡 BufferingTime - 需要缓冲的时间的长度 CurrentState - 播放状态 IsMuted - 是否静音 Play() - 播放媒体 Pause() - 暂停媒体的播放 Stop() - 停止媒体的播放 17、Silverlight... -
DotNetTextBox V6.0.10 商业版 下载 (已知最新)
2016-10-10 22:50:06更改为: 当文件内容为空时,服务端给出"文件内容为空"的提示,并关闭上传菜单。 2)修正当插入Word文件,未选定文件而直接点击导入编辑时,没有任何提示且上传菜单仍然存在的问题。 更改为: 当未选择上传文件时,... -
-
-
-
-
-
-
-