精华内容
下载资源
问答
  • office文档全文检索以及在线预览

    万次阅读 2017-08-18 10:27:36
    office文档(word pdf excel txt ) 的lucene 全文检索以及在线预览
     文档(word pdf excel txt ) lucene 全文检索以及在线预览



     最近一个项目需要对常规文档的内容进行全文检索,查找出来后可以点击在线浏览。   
     
    1、在全文检索方面:可以按相关度、文档时间和浏览量排序。效果如下图:
          


    2、在线浏览方面。在线浏览可是一个大难题,而且要支持在手机设备里浏览,需要自动适应屏幕大小,并且还要可以分页。
        
        方案选择:  
       (1)office文档转html,首先引入com组件中office库,然后在程序集扩展中引入word,excel,ppt的dll。
              这个方案依赖windows平台和服务,做不到跨平台,而且com组件服务经常会出现问题,需要人工kill进程。
              效果上也做不到分页。
        (2)office文档转PDF,PDF转swf,使用flexpaper+swftools实现在线浏览。
                这个方案可以使用openoffice 把文档转换成pdf,然后使用swftools把pdf转换成swf.这个方案有不少问题:第一是文件达到几十页时加载很慢,效率不好。第二是依赖flash,手机上浏览不了。

         最后选择了一种方案:所有不同格式的文档先转换成pdf,然后再由pdf转换成html5来显示。这个方案还可以做得到全部过程都是在java中实现,不需要windows 和 openoffices的服务,纯java实现,即可靠又高效。效果如图:

     (1)预览word,有一百多页。


    (2)excel预览



    (3)在手机里预览效果















          
    展开全文
  • 支付宝小程序、百度小程序、微信小程序、今日头条小程序四大小程序对比分析,BAT小程序技术分析

    一、总述

    在如今群雄环伺的小程序赛道上,BAT早已完成了小程序的布局,今日头条也不甘示弱,成为继微信、支付宝、百度之后,第四个推出小程序应用的公司,四家小程序可谓是各有各的特色。小程序出现,让移动应用时代向轻应用时代迈进了一步。
    今日头条进军小程序是为什么呢?今日头条是跟风开发小程序的吗?跟风也只是其中一个原因,由于小程序应用体量更轻、对配置要求低、使用路径短、场景和流量更为贴合。不少人认为小程序就是未来接入移动互联服务的最佳入口。而且好多商家利用小程序无需下载APP,获取更加方便,传播更为广泛的特点,在自己的小程序商城中获得了巨大的收益。本文将对于四种小程序在发展现状、自身特色、应用场景以及技术方面进行对比分析。今日头条小程序,由于还未推出小程序平台和相关技术文档,所以涉及到技术方面的分析较少。

    小程序共性:

    1、小程序应用体量更轻、对配置要求低、使用路径短、场景和流量更为贴合;
    
    2、提供了丰富的 API 、组件;
    
    3、每个页面有独立的作用域,并提供模块化;
    
    4、框架本身并非运行在浏览器中,所以 JavaScript 在 Web 中的一些能力都无法使用,如 document , window等;
    
    5、生命周期函数: 
    
    1)在app.js文件中定义的生命周期方法
    
    onLaunch()--监听小程序初始化 小程序初始化完成(全局只触发一次) 
    onShow()--监听小程序显示 小程序启动,或从后台进入前台显示 
    onHide()--监听小程序隐藏 小程序从前台进入后台 
    onError()--错误监听函数 当小程序发生脚本错误,或者 api 调用失败时,会触发onError并带上错误信息
    
    2)在page页面中定义的生命周期方法
    
    onLoad()--监听页面加载 
    onShow()--监听页面显示 
    onReady()--监听页面初次渲染完成
    onUnload()--监听页面卸载(销毁) 
    onHide()--监听页面隐藏
    
    6、在小程序中所有页面的路由全部由框架进行管理。框架以栈的形式维护了当前的所有页面;
    
    7、一套代码运行于Android、iOS系统,而且三种小程序相似度很大,学习成本极低,只是赋予了不同的平台特色。可以先开发微信小程序,再在此基础上修改后开发支付宝小程序。
    

    1.全封闭的微信小程序。作为小程序的“鼻祖”微信小程序已经拥有了 2.9 亿日活跃用户,微信小程序数量突破百万,第三方平台数超过 2300 家。微信小程序的开发者数量达到 150 万,微信小程序是全封闭式的,用户只能在微信生态里完成产品闭环。微信小程序的封闭性,使得开发者的小程序的运行范围只能在微信生态体系内,虽然在一定程度上对小程序有规范作用,易于管理,但是其应用范围依然是在一定的界限内。
    2.半封闭的支付宝小程序。支付宝小程序通过“718+X”的业务逻辑来打通线上线下,即 7 大入口、1 个闭环、8 大能力再加 X 场景,支付宝小程序目前已重点开放支付收单,会员服务,芝麻信用等8项能力,由于产品闭环需要在阿里的生态下完成,其本身是半开放半封闭的模式,目前支付宝小程序数量共计超过 2 万,日活达 1.2 亿,用户数达 3 亿,小程序平均7 日留存率为 29%。
    3.开放的百度小程序。百度于7月份正式推出了小程序,不同于微信和支付宝的封闭模式,百度小程序的主题为开放+AI,百度把“搜索 + 信息流”全域流量都接入小程序开放给开发者,同时通过百度自身的技术优势,给小程序AI赋能。

    2018上半年微信小程序数量突破百万,日活高达2.8亿。百度智能小程序达到1.37亿日活量,支付宝达到1.58亿日活量。相比阿里、百度,腾讯借助微信特殊的社交和内容生态,确实提前抢夺了小程序应用的用户红利,尤其是社交裂变所产生的传播效应,似乎已经成为目前小程序专属的玩法。但是说到底,小程序连接流量和场景、内容,而BAT三者的流量本身具有天然的属性差异,这也决定了小程序的刺激因素远不止社交,百度、阿里所具有搜索、电商的互联网基因,使得其小程序的运营规则也各不相同。这也是为什么小程序不能成为腾讯独角戏,百度高调进入这一赛道的原因。从这个角度来看,百度智能小程序的核心竞争力在于搜索,支付宝小程序的核心在于支付,微信小程序的核心在于社交,这就决定了各种小程序的使用场景,每个平台都是结合其庞大入口之上的内容生态和技术应用来发展自身小程序的。

    二、详细分析

    一、微信小程序 (2017年1月9日正式上线

    强社交属性和高频次流量是微信的强力优势。微信的用户群分布广泛,停留时间长,打开频次高,这些特点使其成为各类资讯、娱乐化内容和休闲游戏生长的肥沃土壤。
    微信小程序支持个人申请、企业注册,驻门槛更低。微信的社交属性带来了巨大流量与十亿月活。但在利用社交关系快速取得大量用户之后,留存和回访率又成了小程序最大的“短板”。
    阿拉丁公布数据显示,微信小程序已超100万个,开发商更是如蒲公英般,遍地开花。所以微信小程序无疑成为中小企业和零售商最好的选择。截止2018年6月底,微信小程序的数量已经突破百万,小程序的日活页大幅增长到了 2.7 亿,相对于1月初微信官方公布的数据58万个小程序几乎翻了一倍。按照此趋势,到2018年年底,小程序将增长到200万之巨。

    二、支付宝小程序 (2017年9月20日正式上线

    支付宝小程序主打营销、信用、风控、金融等差异化能力与优势。致力于走全方位赋能商业的路径,目前主要面向企业级开发者。仅支持企业注册,不支持个人申请。
    支付宝本身就具有极强的工具属性,也非常符合符合张小龙口中“即用即走”的标准。蚂蚁金服在今年接连开放出诸多能力,小程序背靠支付宝大数据支持,支付简单化。支付宝的一个特色的模块就是信用市场,小程序应用标准通过支付宝用户的芝麻信用分,为商家提供消费者消费能力的基础信息,同样通过支付宝的信用,为消费者省去很多类似押金的步骤。
    为了降低开发门槛,支付宝与微信有着近似的小程序开发框架与产品体验;但在应用场景与发展方向上,支付宝小程序在未来方向并不在不会涉及社交、内容等。在支付宝小程序上实现服务台能力,着重于联动蚂蚁金服保险、安全等能力在出行、水电燃、医疗等领域实现异地归还、助力商家营销等。
    由支付宝小程序行业明细来看,目前支付宝政务服务已经覆盖社会保障、交通、警务、民政、旅游类、税务、气象环保等7大类56项服务。结合支付宝本身、或者其他小程序提供的服务结合,就展示出一套结合门店+生活+小程序+服务+整体卡包小程序生态模式。

    三、智能小程序 (2018年7月4日正式上线

    百度天然就是用户各类需求的入口,智能小程序与搜索结果自然融合更直观,可以让用户直接使用。反观微信、支付宝小程序,都需要用户在众多小程序中进行筛选,从而间接导致了许多同质的小程序被淹没。
    百度强调的是开放生态,主打AI和流量的王牌。百度智能小程序具有入口自然,流量质量高等优势,支持企业、政府、媒体和其他组织申请。百度职能小程序的生态体系对于开发者是十分友好的,开放的110多项AI技术可以让开发者轻松获得AI能力。智能小程序是开放的生态,不仅可以运行于百度的平台,更可以运行于外部App上,开发者一次开发就可以实现多端运行,这和微信小程的封闭生态有着本质的区别。
    “体验、流量、智能、开放”是百度智能小程序的四大核心理念。
    目前,携程、苏宁易购、唯品会、同程、春雨医生、爱奇艺、优信二手车、查违章等在内的近百家企业成为首批加入智能小程序生态的合作伙伴,并将陆续推出各自的智能小程序。百度APP中进入爱奇艺小程序观看视频,一律没有视频广告。

    从目前趋势来看微信还是占领领先地位的。但是,多种小程序之间不可唯流量论,小程序是基于商业和服务去开发的,最终还是要回归商业本质。毕竟小程序天然是一个寄生体,是寄生在微信、支付宝等平台用于服务用户、拓展渠道、探索更多应用场景的重要载体。这意味着,小程序必须与平台的属性特点相契合。小程序承载的是移动互联网时代,便捷生活发展的方向。

    四、今日头条小程序

    目前开放的小程序入口,只针对 Android 手机,且暂时只对部分公司开放。
    5大特点:

    	1.可通过搜索关键词进入小程序;
        2.可在不同页面转发到微头条;
        3.微信小程序在同意授权之后,只能通过删除小程序来取消这些信息的授权。今日头条区别于微信,支持随时进行授权设置和权限修改,目前授权主要有头像、昵称和定位等信息。
        4.可使用支付宝支付;
        5.小程序页面可独立于今日头条,与其他小程序无异。
    

    预测未来今日头条小程序发展方向会以内容电商变现和支付领域变现为主。以「猫眼电影」为例,如果用户在今日头条里写了一篇影评,以前并没有很好的转化方式,现在如果在这篇内容里接入「猫眼电影」小程序,用户看完文章后即可跳转到该电影的购买页面,完成购买。

    三、技术特点

    从技术文档上看,三种小程序的组件都包含视图容器、基础内容、表单组件、导航、媒体组件、地图、画布、开放能力八种类型。API大致分为网络、媒体、文件、数据缓存、位置、设备、界面、开放接口、更新、Worker、数据上报、基础、定时器、地图、WXML、画布、系统、第三方平台、转发、路由、调试。不同平台的提供其小程序的API会因平台性质的不同而有所差异。(三种小程序都有输入框bug,即input聚焦时的抖动)

    一、微信小程序

    微信支付支持人脸识别,小程序之间的跳转,微信运动(30天之内的步数)。获取用户收货地址,可以调起用户编辑收货地址原生界面,并在编辑完成后返回用户选择的地址。同一个公众号下关联的10个同主体小程序和3个非同主体小程序之间,可以调用接口直接相互跳转。小程序之间跳转的功能,使得独立的微信小程序不再是孤岛。

    二、支付宝小程序

    支付宝小程序的核心竞争力在于支付,小程序提供了跳转支付宝卡包、芝麻认证、信用借还等开放接口。这也将成为小程序开发者选择支付宝小程序的主要原因。
    相对于微信小程序,支付宝小程序在底层采用不同的技术选型,在组件上采用了此前成熟的Ant Design 设计,在开放API上则面向自身特色能力来封装,在框架方面采用开源的React/webpack等技术为基础,结合了支付宝自身的多年技术沉淀来实现。
    但是从目录结构上来看与微信小程序基本一致,几乎没有什么太大的学习成本。甚至连最大页面跳转深度为5这样的细节规则都与微信小程序同出一辙。目前能到看到的最大区别也只是一些命名规范上的区别,比如将“wx”换掉。如果你连这些都不想做,还可以到支付宝小程序的社区来下载一款“微信小程序转支付宝小程序命令行工具”,批量帮你进行处理。
    支付宝小程序创建时的五大坑https://blog.csdn.net/rolan1993/article/details/78060779

    微信小程序转支付宝小程序方法:
    npm install wx-alipay -g
    wxToalipay --src={{小程序源码目录}} --dest={{支付宝小程序目录,可缺省}}
    点击回车后就可将微信小程序转换为支付宝小程序,

    注:需要注意的是在转换完成后,由于不完善之处,仍有很多地方需要我们自己去进行修改

    例如:组件化的使用。需要转换为支付宝的小程序api
    选择器和css3的保持一致。一般有class=”test”类选择器和id=”test”的id选择器。
    在支付宝小程序的样式中特殊的地方就是:

    ※ .a- 或者 .am-为前缀的选择器已经被系统占用所以不要使用;

    ※ 不能使用属性选择器,例如,以下写法不被支持: //这种选择器不被支持 input[name=“title”]{
    color: test; }

    三、智能小程序

    接入AI能力,为开发者提供身份证的文字识别,自动化、智能化的文本审核,语音合成(将文本转换为可以播放的mp3文件),11种类型的图像审核,通用物体及场景识别的图像识别功能。
    为开发者提供对接百度搜索生态的能力,为智能小程序导入搜索流量。当用户在百度 App(10.9.5或以上版本)中搜索对应的智能小程序的相关内容时,小程序的相关页面会通过检索,出现在搜索结果页中。开发者只需要进行简单的配置工作,就可以使自己开发的智能小程序被百度搜索收录、分发。

    四、今日头条小程序
    *今日头条小程序平台和官方文档还未发布。

    四、具体对比分析

    (一)单个页面文件结构

    小程序 HTML(结构) JavaScript(逻辑) CSS(样式表) JSON(配置)
    微信小程序 wxml js wxss json
    支付宝小程序 axml js acss json
    支付宝小程序 swan js css json

    ACSS 表示的是原子化 CSS(Atomic CSS),是 Yahoo 提出来的一种独特的 CSS 代码组织方式。ACSS 的独特性在于它挑战了传统意义上编写 CSS 的最佳实践–关注点分离原则。ACSS 认为关注点分离原则会导致冗余、繁琐和难以维护的 CSS 代码。

    ACS 的原则是把 CSS 样式打散成尽可能小的部分,每个 CSS 类只对应一条样式规则,从而达到最大化的可复用性。ACSS 的好处在于所生成的 CSS 文件只包含必须的内容,而且冗余很少,可以减少 CSS 文件的尺寸,提高性能。另外 CSS 类所对应的样式规则是不变的,这使得在不同的项目和组件之间共享 CSS 变得很容易。

    (二)小程序入口

    1.微信小程序

    微信内入口:发现、搜索栏、群聊、公众号文章、二维码等

    2.智能小程序

    百度APP入口:个人中心、搜索、信息流、百家号文章页、二维码等
    百度系APP:百度贴吧、百度地图、百度网盘等
    合作伙伴APP:58、哔哩哔哩等
    平台入口:DUER OS、Apollo等

    3.支付宝小程序

    支付宝客户端:支付宝首页、应用中心、消息中心、小程序市场、生活号、口碑店铺页、卡券包

    3.今日头条小程序

    今日头条APP入口:搜索关键词

    三大巨头小程序入口的设置,可以看出巨头们对于小程序投入的力度。相对来说,微信非常看重小程序这一块,而支付宝和百度则是把它看作是辅助功能的存在,各有各的好处,各有各的出发点,只要是便于用户使用,都会有市场。而今日头条小程序还处于发展初期,各方面还未完善。

    (三)小程序分享方式

    1.微信小程序

    只支持微信好友和微信群的分享,不支持朋友圈分享

    2.支付宝小程序

    支持分享到支付宝动态、支付宝好友、微信、QQ、钉钉、新浪微博,支持生成
    二维码、吱口令

    3.智能小程序

    支持转发到百度APP的动态、微信、朋友圈分享

    4.今日头条小程序

    今日头条小程序仅支持分享到微头条

    (四)小程序单位 UI屏幕适配

    1.微信小程序
    rpx: 1px=2rp,屏幕宽度750rpx

    2.支付宝小程序
    rpx: 1px=2rp,屏幕宽度750rpx

    3.智能小程序
    rem: 1px=0.1rem,屏幕宽度3.75rem

    (五)直播

    1.微信小程序
    暂只针对国内主体如下类目的小程序开放,需要先通过类目审核,再在小程序管理后台,“设置”-“接口设置”中自助开通该组件权限。并且,仅限于企业小程序。

    一级类目 二级类目
    社交 直播
    教育 在线教育
    医疗 互联网医院,公立医院
    政务民生 所有二级类目
    金融 基金、信托、保险、银行、证券/期货、非金融机构自营小额贷款、征信业务、消费金融

    2.支付宝小程序
    暂不支持

    3.智能小程序
    限制较少,灵活完备

    (六)真机调试

    1.微信小程序

    微信公众平台上将微信账号绑定为开发者,保证手机和开发者工具的微信账号都有当前小程序的开发者权限。在微信开发者工具上生成真机调试或预览二维码,用手机微信>扫一扫,即可预览。

    2.支付宝小程序

    支付宝扫一扫

    3.智能小程序

    可以选择使用开发者工具和控制台两种方式,进行真机调试。

    1)现在官网的专用的真机调试安装包,安装针对智能小程序调试的百度 App。
    2)手机设置中,设置>关于手机>版本号 2)手机设置中,设置>关于手机>版本号
    连续点击五次进入开发者模式,开启 开发者模式>USB调试(类似于安卓APP的开发)。
    3)返回手机桌面,可以看到百度
    App显示为智能小程序,进入APP首页下拉进入智能小程序。

    (七)支付

    1.微信小程序

    仅限于微信支付(支持人脸识别验证身份)

    2.智能小程序

    百度收银台,聚合了主流的百度钱包、微信、支付宝、网银等多种支付方式,方便开发者一站式快速接入多种支付渠道。

    3.支付宝小程序

    直接接入支付宝,其安全性更受用户信赖。

    4.今日头条小程序

    可使用支付宝支付

    三种小程序接入支付的计费方式都是按单笔计算。

    (八)小程序审核(仅个人经验)

    1.微信小程序
    审核迅速,对页面内容和功能要求不高,一般两个小时左右过审
    2.支付宝小程序
    支付宝审核十分严格,会对程序进行严格的功能测试和性能测试
    5.智能小程序
    一般需要半个工作日左右

    (九)数据绑定 (简单绑定 条件渲染 列表渲染)

    1.微信小程序:

    src="{{userInfo.avatarUrl}}"
    
    wx:if="{{isShow}}" 
    
    <view wx:for="{{array}}">
      {{index}}: {{item.message}}
    </view>
    

    2.支付宝小程序

    src="{{userInfo.avatarUrl}}"
    
    a:if="{{isShow}}"
    

    3.智能小程序:

    src="{{userInfo.avatarUrl}}"
    
    s-if="isShow" 
    
    <view s-for="p in persons">
    	{{p.name}}
    </view>
    

    (十)事件绑定

    1.微信小程序:

    <view bindtap="add"> {{count}} </view>
    

    2.支付宝小程序

    <view onTap="add"> {{count}} </view>
    

    3.智能小程序:

    <view bind:tap="add">{{count}}</view>
    

    关于小程序的一些整理。有些内容可能不准确,望指正!!!

    展开全文
  • 有图形化的界面,支持在整个程序中直接打开相应的文档或者文件 提示 类似的工具诸如DocFetcher,Mendeley里面全文检索功能等。可以试下用DocFetcher来了解相关的功能。 可以基于Lucene这个文本索引的库来做;可以...

    需求

    1. 借助第三方工具对本地的文档(包含但不局限于txt、PDF、word、excel、PowerPoint)中的文本内容进行全文检索
    2. 支持用户输入文本进行查询,查询出来的文本,应该在界面中给予高亮
    3. 有图形化的界面,支持在整个程序中直接打开相应的文档或者文件

    提示

    类似的工具诸如DocFetcher,Mendeley里面全文检索功能等。可以试下用DocFetcher来了解相关的功能。

    可以基于Lucene这个文本索引的库来做;可以通过一个叫做lukeall软件来查看lucene索引中的文档内容。

    实现

    1、解析不同文件类型的工具类

    import java.io.File;
    import java.io.FileInputStream;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    /**  
    *excel文件解析工具类
    */
    public class ExcelParse {
    	public static String parseFile(String filePath){
    		StringBuffer sb=new StringBuffer();
    		try {
                File excel = new File(filePath);
                if (excel.isFile() && excel.exists()) {   //判断文件是否存在
                    String[] split = excel.getName().split("\\.");  //.是特殊字符,需要转义!!!!!
                    Workbook wb;
                    //根据文件后缀(xls/xlsx)进行判断
                    if ( "xls".equals(split[1])){
                        FileInputStream fis = new FileInputStream(excel);   //文件流对象
                        wb = new HSSFWorkbook(fis);
                    }else if ("xlsx".equals(split[1])){
                        wb = new XSSFWorkbook(excel);
                    }else {
                        System.out.println("文件类型错误!");
                        return null;
                    }
                    //开始解析
                    Sheet sheet = wb.getSheetAt(0);     //读取sheet 0
                    int firstRowIndex = sheet.getFirstRowNum();   //第一行是列名
                    int lastRowIndex = sheet.getLastRowNum();
                    //System.out.println("firstRowIndex: "+firstRowIndex);
                    //System.out.println("lastRowIndex: "+lastRowIndex);
                    for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) {   //遍历行 按行输出
                        //System.out.println("rIndex: " + rIndex);
                        Row row = sheet.getRow(rIndex);
                        if (row != null) {
                            int firstCellIndex = row.getFirstCellNum();
                            int lastCellIndex = row.getLastCellNum();
                            for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) {   //遍历列
                                Cell cell = row.getCell(cIndex);
                                if (cell != null) {
                                    sb.append(cell.toString()+"\n");
                                }
                            }
                        }
                    }
                } else {
                    System.out.println("找不到指定的文件");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    		return sb.toString();
    	}
    }
    
    import java.io.File;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.text.PDFTextStripper;
    /**  
    * pdf文件解析工具类
    */
    public class PDFParse {
    	 public static  String parsePDF(String path){
        	String result = "";
        	try{
            	PDDocument document = PDDocument.load(new File(path));
                PDFTextStripper stripper = new PDFTextStripper();
                stripper.setSortByPosition(true);
                for (int p = 1; p <= document.getNumberOfPages(); ++p)
                {
                    stripper.setStartPage(p);
                    stripper.setEndPage(p);
                    String text = stripper.getText(document);
                    result += text;
                }   		
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        	return result;    	
        }
    	 
    	 public static void main(String[] args) {
    		String s =parsePDF("E:\\ftp上传\\ftpTest\\数据库基础知识.pdf");
    		System.out.println(s);
    	 }
    }
    
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.hslf.extractor.PowerPointExtractor;
    import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
    import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
    import org.apache.xmlbeans.XmlException;
    /**  
    * ppt文件解析工具类
    */
    public class PPTParse {
    
    	//直接抽取幻灯片的全部内容
        public static String pptParse(String filePath) throws IOException, XmlException, OpenXML4JException{
        	String content="";
        	if(filePath.toLowerCase().endsWith("ppt")){
        		File file = new File(filePath);
            	FileInputStream fin=new FileInputStream(file);
                PowerPointExtractor extractor=new PowerPointExtractor(fin);
                content=extractor.getText();
        	}else if (filePath.toLowerCase().endsWith("pptx")) {
    			content=new XSLFPowerPointExtractor(POIXMLDocument.openPackage(filePath)).getText();
    		}
            return content;
        }
    }
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.POIXMLTextExtractor;
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.extractor.WordExtractor;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    /**  
    *word文件解析工具类
    */
    public class WordParse {
    	//方式一:返回字符串集合
    	public static List<String> readWord(String filePath) throws Exception{
    		List<String> linList = new ArrayList<String>();
    		String buffer = "";
    		try {
    			if (filePath.endsWith(".doc")) {
    				InputStream is = new FileInputStream(new File(filePath));
    				WordExtractor ex = new WordExtractor(is);
    				buffer = ex.getText();
    				ex.close();
    				if(buffer.length() > 0){
    					//使用回车换行符分割字符串
    					String [] arry = buffer.split("\\r\\n");
    					for (String string : arry) {
    						linList.add(string.trim());
    					}
    				}
    			} else if (filePath.endsWith(".docx")) {
    				OPCPackage opcPackage = POIXMLDocument.openPackage(filePath);
    				POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
    				buffer = extractor.getText();
    				extractor.close();
    				if(buffer.length() > 0){
    					//使用换行符分割字符串
    					String [] arry = buffer.split("\\n");
    					for (String string : arry) {
    						linList.add(string.trim());
    					}
    				}
    			} else {
    				return null;
    			}
    			
    			return linList;
    		} catch (Exception e) {
    			System.out.print("error---->"+filePath);
    			e.printStackTrace();
    			return null;
    		}
    	}
    	//方式二:返回字符串
    	public static String parseFile(String filePath) {
    		File docFile= new File(filePath);
            String fileName = docFile.getName();
            String docContent = null;
            FileInputStream fis = null;
            try {
                 fis = new FileInputStream(docFile);
                if (fileName.toLowerCase().endsWith("doc")) {
                    HWPFDocument doc = new HWPFDocument(fis);
                    docContent = doc.getDocumentText();
                } else if (fileName.toLowerCase().endsWith("docx")) {
                    XWPFDocument xdoc = new XWPFDocument(fis);
                    XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
                    docContent = extractor.getText();
                } else {
                }
            } catch (Exception e) {
            	e.printStackTrace();
            }
            return docContent;     //返回文本内容
        }
    }
    

    注意:解析word时,如果是直接导入jar包的方式,可能会出现XWPFWordExtractor报错信息。需要另外用到依赖包xmlbeans-2.6.0.jar。maven配置方式会直接关联。

    2、创建、查询lucene索引

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import org.apache.commons.io.FileUtils;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.LongPoint;
    import org.apache.lucene.document.StoredField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.search.ScoreDoc;
    import org.apache.lucene.search.TermQuery;
    import org.apache.lucene.search.TopDocs;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    import com.example.tool.ExcelParse;
    import com.example.tool.PDFParse;
    import com.example.tool.PPTParse;
    import com.example.tool.WordParse;
    public class LuceneIndex {
    	static IndexWriterConfig config =null;
    	static IndexWriter indexWriter =null;
    	 private static boolean deleteDir(File dir) {
    	        if (dir.isDirectory()) {
    	            String[] children = dir.list();
    	            //递归删除目录中的子目录下
    	            for (int i=0; i<children.length; i++) {
    	                boolean success = deleteDir(new File(dir, children[i]));
    	                if (!success) {
    	                    return false;
    	                }
    	            }
    	        }
    	        // 目录此时为空,可以删除
    	        return dir.delete();
    	    }
    	 
    	 /**
    	 * 查询字符编码
    	 */
    	public static String codeStringPlus(String fileName) throws Exception {
    		BufferedInputStream bin = null;
    		String code = null;
    		try {
    			bin = new BufferedInputStream(new FileInputStream(fileName));
    			int p = (bin.read() << 8) + bin.read();
    			switch (p) {
    			case 0xefbb:
    				code = "UTF-8";
    				break;
    			case 0xd0cf:
    				code="gb2312";
    				break;
    			case 0xfffe:
    				code = "Unicode";
    				break;
    			case 0xfeff:
    				code = "UTF-16BE";
    				break;
    			default:
    				code = "GBK";
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			bin.close();
    		}
    		return code;
    	}
    	
    	//递归处理目录
    	public static void traverseFolder(File file) throws Exception{
    		File[] files = file.listFiles();
            for (File file1:files){
                //判断当前文件是否为文件夹
                if (file1.isDirectory()){
                    traverseFolder(file1);
                }else{
                	inputStored(indexWriter, file1);
                }
            }
    	}
    	//创建索引
    	public static void createIndex(String dirPath) throws Exception {
          //1、创建一个Directory对象,指定索引库保存的位置。
          //把索引库保存在内存中(保存在内存中,程序关闭就丢失了)
          //Directory directory = new RAMDirectory();
    		String path="E:\\logs\\index";
    		File file = new File(path);
    		if (file.exists()) {
    			deleteDir(file);//每次创建索引库前,先删除之前创建的索引库中的内容
    		}
          //把索引库保存在磁盘
          Directory directory = FSDirectory.open(file.toPath());
          // 2、基于Directory对象创建一个IndexWeiter对象
          //标准分析器
          //IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig());
          config = new IndexWriterConfig(new IKAnalyzer());
          indexWriter = new IndexWriter(directory, config);
          //  3、读取磁盘上的文件,对应每个文件创建一个文档对象。
          File dir = new File(dirPath);
          if (dir.isDirectory()) {
        	  traverseFolder(dir);
          }else{
        	  inputStored(indexWriter, dir);
          }
          //6、关闭indexWriter对象
          indexWriter.close();
       }
    
    	private static void inputStored(IndexWriter indexWriter, File f) throws IOException, Exception {
    		//先取文件名
    		  String fileName = f.getName();
    		  //文件路径
    		  String filePath = f.getPath();
    		  //文件内容
    		  String fileContent="";
    		  if (filePath.toLowerCase().endsWith("ppt") || filePath.toLowerCase().endsWith("pptx")) {
    			  fileContent=PPTParse.pptParse(filePath);
    		  }else if (filePath.toLowerCase().endsWith("xls") || filePath.toLowerCase().endsWith("xlsx")) {
    			fileContent=ExcelParse.parseFile(filePath);
    		 }else if (filePath.toLowerCase().endsWith("pdf")) {
    			fileContent=PDFParse.parsePDF(filePath);
    		 }else if (filePath.toLowerCase().endsWith("doc") || filePath.toLowerCase().endsWith("docx")) {
    			fileContent=WordParse.parseFile(filePath);
    		 }else{
    			 fileContent = FileUtils.readFileToString(f,codeStringPlus(filePath));
    		 }
    		  //文件大小
    		  long fileSize = f.length();
    		  //创建Field域
    		  //参数1:域的名称,参数2:域的内容,参数3:是否存储
    		  Field fieldName = new TextField("name", fileName, Field.Store.YES);
    		  Field fieldPath = new StoredField("path",filePath);
    		  Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
    		  Field fieldSizeValue = new LongPoint("size", fileSize);
    		  Field fieldSizeStore = new StoredField("size", fileSize);
    		  //创建文档对象
    		  Document document = new Document();
    		  //4、向文档对象中添加域
    		  document.add(fieldName);
    		  document.add(fieldPath);
    		  document.add(fieldContent);
    		  //document.add(fieldSize);
    		  document.add(fieldSizeValue);
    		  document.add(fieldSizeStore);
    		  //5、把文档对象写入索引库
    		  indexWriter.addDocument(document);
    	}
    	
    
    	/**
         * 查询索引
         * @throws Exception
         */
        public static Map<String,String> searchIndex(String content) throws Exception {
            //1、创建一个Director对象,指定索引库的位置
            Directory directory = FSDirectory.open(new File("E:\\logs\\index").toPath());
            //2、创建一个IndexReader对象
            IndexReader indexReader = DirectoryReader.open(directory);
            //3、创建一个IndexSearcher对象,构造方法中的参数indexReader对象
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            //4、创建一个Query对象,TermQuery  //Term(关键词)包含两部分  关键词所包含的域和关键词本身
            Query query = new TermQuery(new Term("content",content));  //查询content域的包含spring关键词的
            //5、执行查询,得到一个TopDocs对象
            //参数1:查询对象  参数2:查询结果返回的最大记录数
            TopDocs topDocs = indexSearcher.search(query, 10);
            //6、取查询结果的总记录数
            System.out.println("查询总记录数:" + topDocs.totalHits);
            //7、取文档列表
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            Map<String,String> map=new HashMap<String,String>();
            //8、打印文档中的内容
            for (ScoreDoc doc:scoreDocs) {
                //取文档id
                int docId = doc.doc;
                //根据id取文档对象
                Document document = indexSearcher.doc(docId);
                //System.out.println(document.get("name"));
                //System.out.println(document.get("path"));
                //System.out.println(document.get("content"));
                //将文件名作为key,文件内容作为value
                map.put(document.get("name"),document.get("content"));
            }
            //9、关闭IndexReader对象
            indexReader.close();
            return map;
        }
    }
    

    3、窗体类

    public class LuceneJFrame extends JFrame implements ActionListener{
    	JPanel topPane;
    	JScrollPane jp;
    	JLabel lab1;
    	JLabel lab2;
    	JTextField field1;
    	JTextField field2;
    	JButton jButton1;
    	JButton jButton2;
    	static JTextArea tArea;
    	JFileChooser jfc;// 文件选择器 
    	JMenuBar mb;
    	static FgMenu mFile=new FgMenu("文件(F)",KeyEvent.VK_F);//"文件"菜单
    	static JMenuItem miNew=new JMenuItem("新建(N)",KeyEvent.VK_N),
    	miOpen=new JMenuItem("打开(O)...",KeyEvent.VK_O),
    	miSave=new JMenuItem("保存(S)",KeyEvent.VK_S),
    	miFont=new JMenuItem("字体与颜色(F)...",KeyEvent.VK_F),
    	miQuit=new JMenuItem("退出(X)",KeyEvent.VK_X);
    	public LuceneJFrame(String title){
    		super(title);
    		setSize(800, 600);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);//传入参数null 即可让JFrame 位于屏幕中央, 这个函数若传入一个Component ,则JFrame位于该组件的中央
    		topPane = new JPanel();//上面板
    		topPane.setBounds(0,0,800,120);
    		tArea=new JTextArea();//文本域
    		jp=new JScrollPane(tArea);
    		jp.setBounds(0,120,800,440);
    		Font font=new Font("宋体",Font.BOLD,16);
    		tArea.setFont(font);
    		topPane.setLayout(null);//取消JPanel的布局(避免JPanel的setLayout布局与setBounds方法相冲突)
    		this.add(topPane);
    		this.add(jp);
    		this.setLayout(null);
    		luceneIn();
    		dealEvent();
    		addMenus();
    		this.setVisible(true);
    	}
    	
    	public void addMenus(){
    		mb=new JMenuBar();//菜单栏
    		setJMenuBar(mb);
    		mFile.add(miNew);//新建
    		mFile.add(miOpen);//打开
    		mFile.add(miSave);//保存
    		mFile.addSeparator();//分割条
    		mFile.add(miFont);//字体与颜色菜单
    		mFile.addSeparator();//分割条
    		mFile.add(miQuit);//退出		
    		mb.add(mFile); //将"文件"菜单添加到菜单栏上
    	}
    	
    	public void dealEvent(){
    		jButton2.addActionListener(this);
    		jButton1.addActionListener(this);
    		miFont.addActionListener(this);
    		miNew.addActionListener(this);
    		miOpen.addActionListener(this);
    		miSave.addActionListener(this);
    		miQuit.addActionListener(this);
    	}
    	
    	public void luceneIn(){
    		lab2=new JLabel("文件目录:");
    		lab2.setBounds(20,38,70,30);
    		field2=new JTextField(30);
    		field2.setBounds(90, 38, 120, 30);
    		jButton2=new JButton("...");
    		jButton2.setBounds(220,38,60,30);
    		lab1 = new JLabel("检索关键字:");
    		lab1.setBounds(310, 35, 90, 40);
    		field1=new JTextField("请输入检索关键字:",30);
    		field1.setBounds(400, 38, 200,30);
    		jButton1=new JButton("检索");
    		jButton1.setBounds(610,38,80,30);
    		topPane.add(lab1);
    		topPane.add(lab2);
    		topPane.add(field1);
    		topPane.add(field2);
    		topPane.add(jButton1);
    		topPane.add(jButton2);
    		jfc = new JFileChooser();
    		jfc.setCurrentDirectory(new File("d://"));// 文件选择器的初始目录定为d盘
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if (e.getActionCommand()=="...") {
    			jfc.setFileSelectionMode(1);// 设定只能选择到文件夹 
    			int state = jfc.showOpenDialog(null);// 此句是打开文件选择器界面的触发语句  
                if (state == 1) {  
                    return;
                } else {  
                    File f = jfc.getSelectedFile();// f为选择到的目录
                    field2.setText(f.getAbsolutePath());
                    try {
    					LuceneIndex.createIndex(f.getAbsolutePath());//打开目录时,开始创建lucene索引
    				} catch (Exception e1) {
    					e1.printStackTrace();
    					JOptionPane.showMessageDialog(null,"构建索引库异常!");
    				}
                }  
    		}else if (e.getActionCommand()=="检索") {
    			tArea.setText("");
    			String searchName= field1.getText();
    			try {
    				 Map<String, String> respContents= LuceneIndex.searchIndex(searchName);//查询索引
    				if (respContents.isEmpty()) {
    					tArea.setText("未检索到文本内容");
    				}else{
    					StringBuilder sb=new StringBuilder();
    					 Set<Map.Entry<String, String>> entryseSet=respContents.entrySet();
    					 sb.append("检索到的文件总数:"+respContents.size()+"\n");
    					 sb.append("-------------------------------------分隔符-------------------------------------------\n\n");
    					 for (Map.Entry<String, String> entry:entryseSet) {
    						sb.append("所属文件:"+entry.getKey()+"\n"+"文件内容:\n"+entry.getValue()+"\n");
    						sb.append("-------------------------------------分隔符-------------------------------------------\n\n");
    					}
    					tArea.setText(sb.toString());
    					Highlighter highLighter = tArea.getHighlighter();
    					String text=tArea.getText();
    					DefaultHighlighter.DefaultHighlightPainter p = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
    					int pos = 0;
    			        while ((pos = text.indexOf(searchName, pos)) >= 0){
    			            try {
    			                highLighter.addHighlight(pos, pos + searchName.length(), p);
    			                pos += searchName.length();
    			            }catch (BadLocationException e2) {
    			                e2.printStackTrace();
    			            }
    			        }
    				}
    			} catch (Exception e1) {
    				e1.printStackTrace();
    				JOptionPane.showMessageDialog(null,"检索异常!");
    			}
    		}else if (e.getActionCommand()=="字体与颜色(F)...") {
    			TestJComboBox frm=new TestJComboBox("字体选择");
    			frm.setVisible(true);
    		}else if (e.getActionCommand()=="新建(N)") {
    			tArea.setText("");
    		}else if (e.getActionCommand()=="退出(X)") {
    			if (tArea.getText().length()>0) {
    				int result = JOptionPane.showConfirmDialog(null, "是否保存当前编辑过的文件?", "是", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
    				if (result==JOptionPane.YES_OPTION) {
    					FileDialog fd = new FileDialog(this,"保存", FileDialog.SAVE);
    					writeTxtFile(fd);
    				}
    			}
    			this.dispose();
    		}else if(e.getActionCommand()=="打开(O)..."){
    			FileDialog open = new FileDialog(this, "打开文件", FileDialog.LOAD); 
    			open.setVisible(true); 
    			String filePath = open.getDirectory() + open.getFile();
    			if (filePath != null) {
    				String fileContent="";
    				 if (filePath.toLowerCase().endsWith("ppt") || filePath.toLowerCase().endsWith("pptx")) {
    					  try {
    						fileContent=PPTParse.pptParse(filePath);
    					} catch (Exception e1) {
    						e1.printStackTrace();
    					}
    				  }else if (filePath.toLowerCase().endsWith("xls") || filePath.toLowerCase().endsWith("xlsx")) {
    					fileContent=ExcelParse.parseFile(filePath);
    				 }else if (filePath.toLowerCase().endsWith("pdf")) {
    					fileContent=PDFParse.parsePDF(filePath);
    				 }else if (filePath.toLowerCase().endsWith("doc") || filePath.toLowerCase().endsWith("docx")) {
    					fileContent=WordParse.parseFile(filePath);
    				 }else{
    					 fileContent= readTxtFile(filePath);
    				 }
    				tArea.setText(fileContent);
    			} 
    		}else if(e.getActionCommand()=="保存(S)"){
    			FileDialog fd = new FileDialog(this,"保存", FileDialog.SAVE);
    			writeTxtFile(fd);
    		}
    	}
    	
    	public void writeTxtFile(FileDialog fd){
    		fd.setVisible(true);
    		try {
    			FileOutputStream out = new FileOutputStream(fd.getDirectory() + fd.getFile()+".txt");
    	        Object jtext;
    	        String str =tArea.getText();
    	        out.write(str.getBytes());
    	        out.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public String readTxtFile(String filePath){
            try {
                    String encoding="UTF-8";
                    StringBuffer sBuffer=new StringBuffer();
                    File file=new File(filePath);
                    if(file.isFile() && file.exists()){ //判断文件是否存在
                        InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file),encoding);//考虑到编码格式
                        BufferedReader bufferedReader = new BufferedReader(read);
                        String lineTxt = null;
                        while((lineTxt = bufferedReader.readLine()) != null){
                            sBuffer.append(lineTxt+"\n");
                        }
                        read.close();
                        return sBuffer.toString();
            }else{
                System.out.println("找不到指定的文件");
            }
            } catch (Exception e) {
                System.out.println("读取文件内容出错");
                e.printStackTrace();
            }
            return "";
        }
    	
    	public static void main(String[] args) {
    		 LuceneJFrame lFrame= new LuceneJFrame("全文检索");
    	}
    }
    

    有问题可以私信或者在评论区留言。写作不易,既然来了,不妨点个关注,点个赞吧!!!

    展开全文
  • 微信小程序上传word、txt、Excel、PPT等文件

    万次阅读 热门讨论 2018-06-10 11:08:17
    微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 ; 正文: 目前小程序没有能实现此功能的 API 所以我这里通过使用 web-view 实现; 实现流程: 1. 在小程序后台配置业务域名 2. 在...

    微信小程序开发交流qq群   173683895

       承接微信小程序开发。扫码加微信。

    正文:

    目前小程序没有能实现此功能的 API 所以我这里通过使用 web-view 实现;

    实现流程:

    1. 在小程序后台配置业务域名

    2. 在服务器写一个html,实现表单上传文件

    3.后端php接收文件并存到一个服务器文件夹,把文件名存到数据库以后检索用

    4.在微信小程序创建一个页面,里面使用web-view达到上传文件的目的;

    效果图:

    具体实现:

    1. 在小程序后台配置业务域名

    地址:https://mp.weixin.qq.com/wxopen/appdatacount

    2. 在服务器写一个html,实现表单上传文件

    index.html文件

    <!DOCTYPE html>
    <html>
    
    	<head>
    		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
    		<meta charset="UTF-8">
    		<title>Title</title>
    		<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.js"></script>
    	</head>
    
    	<body>
    		<form id="form1" action="https://dwb.lynncain.cn/H5/up_file.php" target="frame1" method="post" enctype="multipart/form-data">
    			<input type="file" name="file">
    			<input type="button" value="上传" onclick="upload()">
    		</form>
    		<iframe name="frame1" frameborder="0" height="40"></iframe>
    		<!-- 其实我们可以把iframe标签隐藏掉 -->
    		<script type="text/javascript">
    			function upload() {
    				$("#form1").submit();
    				var t = setInterval(function() {
    					//获取iframe标签里body元素里的文字。即服务器响应过来的"上传成功"或"上传失败"
    					var word = $("iframe[name='frame1']").contents().find("body").text();
    					if(word != "") {
    //						alert(word); //弹窗提示是否上传成功
    //						clearInterval(t); //清除定时器
    					}
    				}, 1000);
    			}
    		</script>
    	</body>
    
    </html>

     

    3.后端php接收文件并存到一个服务器文件夹,把文件名存到数据库以后检索用

    up_file.php 文件:

    <?php  
        header("Content-Type:text/html;charset=utf8"); 
    	header("Access-Control-Allow-Origin: *"); //解决跨域
    	header('Access-Control-Allow-Methods:POST');// 响应类型  
    	header('Access-Control-Allow-Headers:*'); // 响应头设置 
        $link=mysql_connect("localhost","root","root"); 
        mysql_select_db("new_test", $link); //选择数据库
        mysql_query("SET NAMES utf8");//解决中文乱码问题
    	error_reporting(0);
    	if ($_FILES["file"]["error"] > 0)  
    	  {  
    	  echo "错误: " . $_FILES["file"]["error"] . "<br />";  
    	  }  
    	else  
    	  {  
    		$dlog["name"]=$_FILES["file"]["name"];
      		$dlogs=$dlog;	
        	//echo urldecode(json_encode($dlogs));
    		$name =$_FILES["file"]["name"];
    		echo '上传成功!';
    		echo $name;
    			//插入数据到数据库 
    			$strsql = "insert into name (fileName) values('$name')";
    			//mysql_query() 函数执行一条 MySQL 查询。SELECT,SHOW,EXPLAIN 或 DESCRIBE 都需要用这个函数执行
    			$result = @mysql_query($strsql);
    //	  echo "文件名: " . $_FILES["file"]["name"] . "<br />";  
    //	  echo "类型: " . $_FILES["file"]["type"] . "<br />";  
    //	  echo "大小: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";   
    	  }  
    	 if (file_exists("upload/" . $_FILES["file"]["name"]))  
    	    {  
    //	      echo $_FILES["file"]["name"] . " 文件已经存在. ";  
    	    }  
    	else  
    	    {  
    	      move_uploaded_file($_FILES["file"]["tmp_name"],  
    	      "upload/" . $_FILES["file"]["name"]);  
    //	      echo "文件已经被存储到: " . "upload/" . $_FILES["file"]["name"];  
    	    }   
    ?>   

    4.在微信小程序创建一个页面,里面使用web-view达到上传文件的目的;

    web.wxml文件

    <!--pages/web/web.wxml-->
     <web-view src='https://dwb.lynncain.cn/H5/'></web-view> 

    注:微信小程序web-view标签使用如上,无需多余代码。

     

     

     

     

     

     

    展开全文
  • 从今天开始就来带领大家学习微信小程序了,只要你跟着我一步步来,相信你也可以上线一款属于自己的微信小程序 一,认识小程序 微信⼩程序,简称⼩程序,英⽂名 Mini Program Mini Program ,是⼀种不需要下载安装...
  • 搜索引擎的检索模型-查询与文档的相关度计算1. 检索模型概述 搜索结果排序时搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很多,但最主要的两个因素是用户...
  • 搜索引擎的检索模型-查询与文档的相关度计算1. 检索模型概述      搜索结果排序时搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很...
  • 语音关键词检索实验

    千次阅读 2016-04-05 12:22:11
    语音关键词检索(KeywordsSearch),是指在连续语音流中检测出一组给定的关键词的过程。...语音关键词检索在实时对话系统,命令控制,语音拨号,语音监听,以及语音文档检索方面等方面有着广泛的应用。
  • 作者:初雪 ...来源:知乎 著作权归作者所有。...张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) ... 前言:新人第一坑,跳坑指南:修改后,必须保存;ctrl+S; 一:推荐地址集合:(初入门者请
  • 如题,是否有可以统计日语、西班牙语、葡萄牙语、阿拉伯语、法语等世界各国语言的词频统计小程序/应用推荐;词频统计时首先是分词,然后是计次;因此理想中的词频统计工具可以实现: 1、自由配置/定义词频统计所...
  • 微信小程序循环赋值坑

    万次阅读 2017-05-09 01:41:28
    最近在弄微信小程序,类似于共享单车用来练练手,基本原理就是小程序发送经纬度给服务器,服务器从数据库中检索经纬度附近的单车传给小程序。 就在这里。。没错就是这里,传回来的值是以jsonarray格式传过来的。 ...
  • 利用百度地图天气API开发微信小程序

    千次阅读 多人点赞 2019-01-23 11:03:42
    利用百度地图天气API开发微信小程序一、申请百度地图的AK二、下载SDK三、写代码四、解析数据 一、申请百度地图的AK ... 选择“微信小程序”,并填入...在“开发文档”中点击“微信小程序JavaScript API” 在“相关下...
  • 信息检索复习笔记

    万次阅读 2020-12-17 17:14:46
    信息检索复习 第一讲 搜索 IR(信息检索是什么样的学科): 实质上是融合了文本及多媒体检索、数据挖掘、机器学习和自然语言处理的综合学科 为什么要进行信息检索?信息过载 搜索 搜索的过程 从大规模非结构化数据...
  • 开篇先提一下,网上有很多关于小程序搜索框的,地图地点信息检索的,路线导航的,以及一个找事吧APP模仿的小程序。我也看过这些内容,整理一下,就是我今天要展示的。 惯例,先上整体效果图: 这是点击药店...
  • 掌中题库刷题神奇微信小程序介绍

    千次阅读 2020-11-18 21:52:54
    微信小程序无需安装、便于传播,安卓与ios平台都可以使用。 “掌中题库”微信小程序,针对个人或单位用户进行复习备考、业务学习、党建活动、继续教育而设计。 程序功能实用,界面简约,尤其适用于刷题背题、快速...
  • 微信小程序循环赋值坑(转)

    千次阅读 2019-03-26 16:56:32
    最近在弄微信小程序,类似于共享单车用来练练手,基本原理就是小程序发送经纬度给服务器,服务器从数据库中检索经纬度附近的单车传给小程序。 就在这里。。没错就是这里,传回来的值是以jsonarray格式传过来的。 ...
  • 微信小程序中的input组件

    万次阅读 2017-04-11 10:26:45
    这里只说一下事件,其他属性详细我们查看微信小程序官方文档 bindfocus: 指当我们的输入框获得焦点时触发,也就是鼠标或者手指点击到输入框时。 bindblur: 指输入框失去焦点是触发,也就是当我们敲击回车或手机上...
  • 微信小程序 LBS 能力全面解析

    千次阅读 2017-01-13 10:35:01
    1 月 9 日随着小程序的发布,在技术圈内引起一大波浪潮,在已发布的小程序中大部分已经用到了腾讯位置服务能力,而且一部分小程序是强依赖位置服务能力的,如:摩拜单车、通勤助手等必须要获取用户位置才能进行后续...
  • 打算做一个小程序,因为感觉做过小程序的人比较多,而且网上视频教学资料充足,这样做的过程中遇到困难也方便请教他人或者查询资料。如果没有接触过小程序的,就要开始学习起来了;基本上按官方的文档或者网上的一些...
  • 微信小程序开发学习资料

    千次阅读 2017-09-18 14:10:16
    是其它地方看到的,不知道怎么转载到csdn上,自己收藏用的,大家看到原谅,很不错的一篇文章。 作者:初雪 ...张小龙全面阐述小程序,定档1月9日上线(附90分钟演讲全文) …前言:新人第一坑,跳坑指
  • 检索FAQ

    千次阅读 2011-11-25 15:18:30
    Q1:不到1秒的时间怎么在网上检索到那么多的东东? 1 Q2:什么是倒排索引? 2 Q3:像mp3、image这种非文本对象怎么建立倒...Q6:前端检索服务程序之间是怎么分工合作的? 3 Q7:as、bs、di的检索架构有什么
  • 背景 小程序接口开发使用https协议,要申请SSL证书。现分享免费申请SSL证书和Apache安装证书的方法。申请SSL证书 经检索,现在大部分证书提供商要收费,只有腾讯云还在免费申请中。 打开腾讯云的证书选购链接/...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    javax.security.auth.callback 此包提供与应用程序进行交互所必需的类,以便检索信息(例如,包括用户名和密码的验证数据)或显示信息(例如,错误和警告消息)。 javax.security.auth.kerberos 此包包含与 ...
  • 最近自己写自己的小程序的时候遇到了wx:if想要绑定的数据使用了indexOf()方法来判断是否需要显示,但是wx:if没有办法在绑定的数据中进行函数运算,只能进行简单的判断和加减运算。 在网上搜索了一下之后发现只能将...
  • 小程序与传统HTML5,CSS的区别

    千次阅读 2018-04-03 17:21:55
    关于微信小程序,那些开发文档没有告诉你的作者:王婷婷本文由广研微信小程序的开发团队所做,作者为UI开发工程师王婷婷。本文从UI开发的角度,结合OM小程序的案例,剖析小程序的组件用法与传统HTML5标签的区别。...
  • 文章目录一、Linux目录结构树形目录结构根目录常见的子目录二、查看及检索...检索和过滤文件内容grep命令三、备份与恢复文档压缩命令gzip、bzip2命令归档命令tar命令四、VI文本编辑器文本编辑器vi命令vi编辑的工作模式...
  • 这里列出了input输入框组件的所有事件: # 事件 说明 备注 1 bindinput 键盘输入时触发,event.detail = {... 每输入一个字符都会进行一次检索,通常用于实时检索。但是这种方法对数据库...
  • 微信小程序的开发过程中,很可能会碰到和地理位置相关的一些操作,比如:根据经纬度计算两地之间的距离,根据关键字获取附近相关的地理信息,关键词输入提示等。...在小程序的官方文档中,提供了获取用户地理位置...
  • SQLite 文档存储攻略

    千次阅读 热门讨论 2020-12-02 15:01:45
    本文介绍了 SQLite 中的文档存储功能。我们可以借助于 json1 扩展插件提供的 JSON 函数实现文档数据的存储以及 JSON 文档和 SQL 数据的相互转换,同时还可以利用 SQLite 表达式索引和生成列为 JSON 数据提供索引支持...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,002
精华内容 37,600
关键字:

文档检索小程序