HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

用js打开android 原生activity方法及本地打包

里面实现一个小功能,播放视频;因为在android5.1以后播放视频有点卡,所以用到原生下面是步骤
1.新建一个移动项目,然后 发行->生成本地打包app资源,注意我打的是android,ios差不多

  1. 下载一个app打包工具
  2. 把app打包工具导入到eclipse中
  3. 把assets->apps->项目名->www替换成你自己的www
  4. 把项目名修改成你的项目名
  5. 在src中的io.dcloud这个包中新建一个activity,并加到AndroidManifest.xml
  6. 打开activity的js的关键代码如下:
    function aa (){
    var mainActivity= plus.android.runtimeMainActivity();
    Intent = plus.android.importClass('android.content.Intent');
    var intent = new Intent();
    intent.setClassName('io.dcloud.HBuilder.Hello','io.dcloud.MyActity');//我试了其它的好像就这个能打开
    mainActivity.startActivity(intent);//打开activity
    }

打完收工,代码上传不鸟!!!!!!!!!!!!

继续阅读 »

里面实现一个小功能,播放视频;因为在android5.1以后播放视频有点卡,所以用到原生下面是步骤
1.新建一个移动项目,然后 发行->生成本地打包app资源,注意我打的是android,ios差不多

  1. 下载一个app打包工具
  2. 把app打包工具导入到eclipse中
  3. 把assets->apps->项目名->www替换成你自己的www
  4. 把项目名修改成你的项目名
  5. 在src中的io.dcloud这个包中新建一个activity,并加到AndroidManifest.xml
  6. 打开activity的js的关键代码如下:
    function aa (){
    var mainActivity= plus.android.runtimeMainActivity();
    Intent = plus.android.importClass('android.content.Intent');
    var intent = new Intent();
    intent.setClassName('io.dcloud.HBuilder.Hello','io.dcloud.MyActity');//我试了其它的好像就这个能打开
    mainActivity.startActivity(intent);//打开activity
    }

打完收工,代码上传不鸟!!!!!!!!!!!!

收起阅读 »

流应用更新方式说明

更新 流应用

传统原生App的更新是要经历较长时间的下载和安装过程的。
所以很多用户干脆不更新app,任由更新角标放着。

流应用下没有这些问题,用户无需触发更新操作,总能使用到最新版。
流应用不需要平时在后台处理更新,而是在启动流应用时进行更新检查。

流应用除了能流式下载,自然也能流式更新,并且这种更新是差量更新。
如果你的app工程里有100个文件,其中5个文件变化了,那么流应用平台会自动识别并只更新这5个文件。

当流应用启动时,会向流应用服务器发起更新检测请求,如果服务器版本有更新则会下载更新包(使用差量更新技术),更新包下载完成后则执行更新操作。

流应用有多种更新模式可选。
开发者在HBuilder里提交流应用时,可以配置更新模式,不同的更新模式有不同的效果。

HBuilder里更新流应用时,可以选择更新模式:

默认模式(Android平台提示用户是否重启升级,iOS平台不提示,下次启动升级)

应用升级时弹出提示框,5秒后自动关闭,效果如下:

顶部“重启”、“忽略”按钮点击后的作用如下:

  • 重启:立即更新应用并重启生效。
  • 忽略:不立即更新应用(此时仍然使用老版本),下次启动应用时自动更新。

实时更新当前应用

启动时检查到需要更新,立即更新应用,但是已经打开的html页面不会更新。
采用此模式应该注意以下问题:

  1. 应用已经打开页面不会更新,由于更新文件从网络下载,从而导致更新时机的不确定性,此时无法确定当前用户操作到具体的页面;
  2. 应用已经加载过的资源存在缓存,更新后无法立即生效,如js/css等,此时还是使用更新前内容;
  3. 新版本应用更新需删除老版本文件,可能导致老版本业务逻辑无法继续运行;
  4. 新版本应用更新中JS业务逻辑包含重大调整,可能会出现应用无法预期的状态(如新版本某些页面的js逻辑是认为首页一定会做某些操作,而旧版本首页如果没有这些操作,从而会进入不可预期的状态)。
    这种更新模式虽然注意事项很多,但有2个适应场景:
  5. 静态资源更新,即文字图片等非js逻辑,可以立即生效的体验要比重启生效更好。
  6. 追究极致的高级开发者在经过仔细测试后,也可更新js等逻辑。

继续阅读 »

传统原生App的更新是要经历较长时间的下载和安装过程的。
所以很多用户干脆不更新app,任由更新角标放着。

流应用下没有这些问题,用户无需触发更新操作,总能使用到最新版。
流应用不需要平时在后台处理更新,而是在启动流应用时进行更新检查。

流应用除了能流式下载,自然也能流式更新,并且这种更新是差量更新。
如果你的app工程里有100个文件,其中5个文件变化了,那么流应用平台会自动识别并只更新这5个文件。

当流应用启动时,会向流应用服务器发起更新检测请求,如果服务器版本有更新则会下载更新包(使用差量更新技术),更新包下载完成后则执行更新操作。

流应用有多种更新模式可选。
开发者在HBuilder里提交流应用时,可以配置更新模式,不同的更新模式有不同的效果。

HBuilder里更新流应用时,可以选择更新模式:

默认模式(Android平台提示用户是否重启升级,iOS平台不提示,下次启动升级)

应用升级时弹出提示框,5秒后自动关闭,效果如下:

顶部“重启”、“忽略”按钮点击后的作用如下:

  • 重启:立即更新应用并重启生效。
  • 忽略:不立即更新应用(此时仍然使用老版本),下次启动应用时自动更新。

实时更新当前应用

启动时检查到需要更新,立即更新应用,但是已经打开的html页面不会更新。
采用此模式应该注意以下问题:

  1. 应用已经打开页面不会更新,由于更新文件从网络下载,从而导致更新时机的不确定性,此时无法确定当前用户操作到具体的页面;
  2. 应用已经加载过的资源存在缓存,更新后无法立即生效,如js/css等,此时还是使用更新前内容;
  3. 新版本应用更新需删除老版本文件,可能导致老版本业务逻辑无法继续运行;
  4. 新版本应用更新中JS业务逻辑包含重大调整,可能会出现应用无法预期的状态(如新版本某些页面的js逻辑是认为首页一定会做某些操作,而旧版本首页如果没有这些操作,从而会进入不可预期的状态)。
    这种更新模式虽然注意事项很多,但有2个适应场景:
  5. 静态资源更新,即文字图片等非js逻辑,可以立即生效的体验要比重启生效更好。
  6. 追究极致的高级开发者在经过仔细测试后,也可更新js等逻辑。

收起阅读 »

[android端] 用百度推送替换个推推送,js端继续使用官方api。

推送 推送插件配置指南 离线打包

项目github地址、jar包下载地址

  1. 介绍
    ===

    • 这是一个dcloud集成百度推送的教程(android端)。
    • 这是一个离线打包配置的教程。
    • 本项目用百度推送去替换dcloud默认集成的个推推送,使修改对于web层是完全透明的,也就是说js端的推送逻辑基本不用做修改。
  2. 使用
    ===

    • 按照dcloud官方教程集成个推推送。
    • 下载百度推送sdk,导入sdk中的jar包和so文件,so文件只需导入armeabi、armeabi-v7a、x86文件夹下的。
    • 删除个推jar包GetuiSdk2.5.0.0.jar、GetuiExt-2.0.3.jar、aps-igexin.jar,导入本项目libs目录中的baidu-gexing.jar。
    • 在AndroidManifest.xml中注释掉个推推送的所有配置,添加以下配置:
      
      <!-- baidu push开始 -->  

<!-- 用于操作本地创建的通知 -->
<receiver android:name="io.dcloud.feature.aps.NotificationReceiver" >
<!-- 如下配置用于处理推送消息 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="cn.tomygo.app.v2.CREATE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__REMOVE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.
CLEAR_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__CLILK_NOTIFICATION" />
</intent-filter>
</receiver>

<!-- 原本用于个推的配置,同样用于百度推送 -->
<meta-data
android:name="PUSH_APPID"
android:value="填写你的appid" />
<meta-data
android:name="PUSH_APPKEY"
android:value="填写你的appkey" />
<meta-data
android:name="PUSH_APPSECRET"
android:value="填写你的appsecret" />

<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

<!-- 4.6版本新增的Activity声明,提升Push后台存活率 -->  
<activity  
    android:name="com.baidu.android.pushservice.PushKeepAlive"  
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>  

<!-- push service start -->  
<!-- 用于接收系统消息以保证PushService正常运行 -->  
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="android.intent.action.BOOT_COMPLETED" />  
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
    <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />  
    <action android:name="com.baidu.android.pushservice.action.media.CLICK" />  
    <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->  
    <action android:name="android.intent.action.MEDIA_MOUNTED" />  
    <action android:name="android.intent.action.USER_PRESENT" />  
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />  
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />  
    </intent-filter>  
</receiver>  
<!-- Push服务接收客户端发送的各种请求-->  
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="com.baidu.android.pushservice.action.METHOD" />  
    <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />  
    </intent-filter>  
    <intent-filter>  
    <action android:name="android.intent.action.PACKAGE_REMOVED" />  
    <data android:scheme="package" />  
    </intent-filter>                     
</receiver>  
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true"   
    android:process=":bdservice_v1" >  
    <intent-filter >  
        <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />  
    </intent-filter>  
</service>  
<!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->  
<service android:name="com.baidu.android.pushservice.CommandService"  
    android:exported="true" />  

<!-- 此处Receiver名字修改为当前包名路径 -->  
<receiver android:name="io.dcloud.feature.apsGt.MyPushMessageReceiver">  
    <intent-filter>  
    <!-- 接收push消息 -->   
    <action android:name="com.baidu.android.pushservice.action.MESSAGE" />  
    <!-- 接收bind、setTags等method的返回结果-->   
    <action android:name="com.baidu.android.pushservice.action.RECEIVE" />  
    <!-- 接收通知点击事件,和通知自定义内容 -->   
    <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />  
    </intent-filter>  
</receiver>  
<!-- baidu push结束 -->
*  配置完成。  

3.说明  
===  
* 百度中推送的附加字段的内容放在消息对象的payload字段中:
```javascript  
//js打印附加字段  
plus.push.addEventListener( "click", function( msg ) {  
    console.log("附加字段:"+msg.payload);  
}, false );
继续阅读 »

项目github地址、jar包下载地址

  1. 介绍
    ===

    • 这是一个dcloud集成百度推送的教程(android端)。
    • 这是一个离线打包配置的教程。
    • 本项目用百度推送去替换dcloud默认集成的个推推送,使修改对于web层是完全透明的,也就是说js端的推送逻辑基本不用做修改。
  2. 使用
    ===

    • 按照dcloud官方教程集成个推推送。
    • 下载百度推送sdk,导入sdk中的jar包和so文件,so文件只需导入armeabi、armeabi-v7a、x86文件夹下的。
    • 删除个推jar包GetuiSdk2.5.0.0.jar、GetuiExt-2.0.3.jar、aps-igexin.jar,导入本项目libs目录中的baidu-gexing.jar。
    • 在AndroidManifest.xml中注释掉个推推送的所有配置,添加以下配置:
      
      <!-- baidu push开始 -->  

<!-- 用于操作本地创建的通知 -->
<receiver android:name="io.dcloud.feature.aps.NotificationReceiver" >
<!-- 如下配置用于处理推送消息 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="cn.tomygo.app.v2.CREATE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__REMOVE_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.
CLEAR_NOTIFICATION" />
<action android:name="cn.tomygo.app.v2.__CLILK_NOTIFICATION" />
</intent-filter>
</receiver>

<!-- 原本用于个推的配置,同样用于百度推送 -->
<meta-data
android:name="PUSH_APPID"
android:value="填写你的appid" />
<meta-data
android:name="PUSH_APPKEY"
android:value="填写你的appkey" />
<meta-data
android:name="PUSH_APPSECRET"
android:value="填写你的appsecret" />

<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

<!-- 4.6版本新增的Activity声明,提升Push后台存活率 -->  
<activity  
    android:name="com.baidu.android.pushservice.PushKeepAlive"  
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>  

<!-- push service start -->  
<!-- 用于接收系统消息以保证PushService正常运行 -->  
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="android.intent.action.BOOT_COMPLETED" />  
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
    <action android:name="com.baidu.android.pushservice.action.notification.SHOW" />  
    <action android:name="com.baidu.android.pushservice.action.media.CLICK" />  
    <!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->  
    <action android:name="android.intent.action.MEDIA_MOUNTED" />  
    <action android:name="android.intent.action.USER_PRESENT" />  
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />  
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />  
    </intent-filter>  
</receiver>  
<!-- Push服务接收客户端发送的各种请求-->  
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"  
    android:process=":bdservice_v1" >  
    <intent-filter>  
    <action android:name="com.baidu.android.pushservice.action.METHOD" />  
    <action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />  
    </intent-filter>  
    <intent-filter>  
    <action android:name="android.intent.action.PACKAGE_REMOVED" />  
    <data android:scheme="package" />  
    </intent-filter>                     
</receiver>  
<service android:name="com.baidu.android.pushservice.PushService" android:exported="true"   
    android:process=":bdservice_v1" >  
    <intent-filter >  
        <action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />  
    </intent-filter>  
</service>  
<!-- 4.4版本新增的CommandService声明,提升小米和魅族手机上的实际推送到达率 -->  
<service android:name="com.baidu.android.pushservice.CommandService"  
    android:exported="true" />  

<!-- 此处Receiver名字修改为当前包名路径 -->  
<receiver android:name="io.dcloud.feature.apsGt.MyPushMessageReceiver">  
    <intent-filter>  
    <!-- 接收push消息 -->   
    <action android:name="com.baidu.android.pushservice.action.MESSAGE" />  
    <!-- 接收bind、setTags等method的返回结果-->   
    <action android:name="com.baidu.android.pushservice.action.RECEIVE" />  
    <!-- 接收通知点击事件,和通知自定义内容 -->   
    <action android:name="com.baidu.android.pushservice.action.notification.CLICK" />  
    </intent-filter>  
</receiver>  
<!-- baidu push结束 -->
*  配置完成。  

3.说明  
===  
* 百度中推送的附加字段的内容放在消息对象的payload字段中:
```javascript  
//js打印附加字段  
plus.push.addEventListener( "click", function( msg ) {  
    console.log("附加字段:"+msg.payload);  
}, false );
收起阅读 »

承接HTML5+ MUI外包或纯前端界面

HTML5+ mui 外包

前端经验两年,北京工作,现承接HTML5+ MUI外包或者纯前端界面,有意详谈 扣扣80883080

前端经验两年,北京工作,现承接HTML5+ MUI外包或者纯前端界面,有意详谈 扣扣80883080

[BUG?] plus.storage.removeItem删不干净

Storage

plus.storage.removeItem 删除某个键值对的时候好像删不干净,再去取删除掉的键时有时候还可以取到. 有没有人遇到同样的问题?

plus.storage.removeItem 删除某个键值对的时候好像删不干净,再去取删除掉的键时有时候还可以取到. 有没有人遇到同样的问题?

Hybrid APP开发工程师招聘(西安高新区)

AngularJS

Hybrid APP开发工程师招聘,工作地点西安
1、掌握JavaScript语言开发基础,熟悉Javascript面向对象编码者优先;
2、精通Html、Div+Css布局,掌握W3C标准及各种浏览器兼容性调试;
3、熟练Dreamweaver、Fireworks、Photoshop、Webstorm等常用网页、UI设计工具;
4、了解一种以上前端开发框架,如Jquery、Angularjs、ExtJS、LigerUI等;
5、熟悉XML/JSON前端开发技术,了解BootStrap;
熟悉Java开发者优先,具备MUI、AngularJS经验者优先,具备APP Hybrid设计经验者优先;

继续阅读 »

Hybrid APP开发工程师招聘,工作地点西安
1、掌握JavaScript语言开发基础,熟悉Javascript面向对象编码者优先;
2、精通Html、Div+Css布局,掌握W3C标准及各种浏览器兼容性调试;
3、熟练Dreamweaver、Fireworks、Photoshop、Webstorm等常用网页、UI设计工具;
4、了解一种以上前端开发框架,如Jquery、Angularjs、ExtJS、LigerUI等;
5、熟悉XML/JSON前端开发技术,了解BootStrap;
熟悉Java开发者优先,具备MUI、AngularJS经验者优先,具备APP Hybrid设计经验者优先;

收起阅读 »

使用Uploader上传文件,Java做后端的处理方法

由于刚刚接触HTML5+开发APP,对于后端处理不太了解,昨天还发帖询问呢,但是没有人回答,经过不懈的努力,终于搞定了,现将后端处理的代码分享上来!
此程序需要的jar包如下:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
需将两个jar包放到工程的lib文件夹下,上传页面的代码我用的是HelloH5+项目的uploader.html,这个应该很好找,后端的上传处理我用的是Servlet,具体的配置方法就不讲了,直接来代码:

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Calendar;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Random;  
import java.util.UUID;  

import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import org.apache.commons.fileupload.FileItem;  
import org.apache.commons.fileupload.FileUploadBase;  
import org.apache.commons.fileupload.ProgressListener;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.commons.fileupload.servlet.ServletFileUpload;  
/**  
 * Apache组件上传  
 *   
 * @author 于世海  
 * @date 2016-02-17  
 */  
public class UploadHandleServlet extends HttpServlet {  

    private static final long serialVersionUID = 5827821285414610443L;  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        this.doPost(request, response);  
    }  

    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        // 上传文件目录  
        String uploadDir = this.getServletContext().getRealPath("/upload");  
        DiskFileItemFactory factory = new DiskFileItemFactory();  
        // 设置内存区块大小4KB  
        factory.setSizeThreshold(4 * 1024);  
        // 设置暂存容器,当上传文件大于设置的内存块大小时,用暂存容器做中转  
        factory.setRepository(new File(this.getServletContext().getRealPath(  
                "/temp")));  
        ServletFileUpload fileUpload = new ServletFileUpload(factory);  
        fileUpload.setSizeMax(1024 * 1024 * 100);  
        //fileUpload.setFileSizeMax(1024 * 1024 * 10);  
        List<FileItem> fileItemList = null;  

        try {  
            fileItemList = fileUpload.parseRequest(request);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        Iterator<FileItem> fileItemIterator = fileItemList.iterator();  
        FileItem fileItem = null;  
        while (fileItemIterator.hasNext()) {  
            fileItem = fileItemIterator.next();  
            // 普通文件框上传  
            if (fileItem.isFormField()) {  
                String filedName = fileItem.getFieldName();  
                String filedValue = fileItem.getString("GBK");// 编码格式  
                System.out.println(filedName);// 文件框名称  
                System.out.println(filedValue);// 文件的值  
            } else {  
                String filedName = fileItem.getFieldName();// 文件上传框的名称  
                // 获取文件上传的文件名  
                String OriginalFileName = takeOutFileName(fileItem.getName());  
                System.out.println("原始文件名:"+OriginalFileName);  
                if (!"".equals(OriginalFileName)) {  
                    // 根据上传的文件名重新命名  
                    String newFileName = getNewFileName(OriginalFileName);  
                    System.out.println("重新名:"+newFileName);  
                    File writeToFile = new File(uploadDir + File.separator  
                            + newFileName);  
                    try {  
                        fileItem.write(writeToFile);  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  

    private String takeOutFileName(String filePath) {  
        String fileName = filePath;  
        if (null != filePath && !"".equals(filePath)) {  
            int port = filePath.lastIndexOf("\\");  
            if(port != -1){  
                fileName = filePath.substring(port+1);  
            }  
        }  
        return fileName;  
    }  

    private String getNewFileName(String originalFileName) {  
        StringBuffer newFileName = new StringBuffer();  
        if (null != originalFileName && !"".equals(originalFileName)) {  
            int port = originalFileName.lastIndexOf(".");  
            String type = "";  
            String fileName = "";  
            if (port != -1) {  
                type = originalFileName.substring(port + 1);  
                fileName = originalFileName.substring(0, port);  
            } else {  
                fileName = originalFileName;  
            }  
            StringBuffer suffix = new StringBuffer("_");  
            suffix.append(Calendar.getInstance().getTimeInMillis());  
            suffix.append("_");  
            suffix.append(new Random().nextInt(100));  
            newFileName.append(fileName);  
            newFileName.append(suffix);  
            newFileName.append(".");  
            newFileName.append(type);  
        }  
        return newFileName.toString();  
    }  

}

其他的处理代码直接修改就可以了!

继续阅读 »

由于刚刚接触HTML5+开发APP,对于后端处理不太了解,昨天还发帖询问呢,但是没有人回答,经过不懈的努力,终于搞定了,现将后端处理的代码分享上来!
此程序需要的jar包如下:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
需将两个jar包放到工程的lib文件夹下,上传页面的代码我用的是HelloH5+项目的uploader.html,这个应该很好找,后端的上传处理我用的是Servlet,具体的配置方法就不讲了,直接来代码:

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Calendar;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Random;  
import java.util.UUID;  

import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import org.apache.commons.fileupload.FileItem;  
import org.apache.commons.fileupload.FileUploadBase;  
import org.apache.commons.fileupload.ProgressListener;  
import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
import org.apache.commons.fileupload.servlet.ServletFileUpload;  
/**  
 * Apache组件上传  
 *   
 * @author 于世海  
 * @date 2016-02-17  
 */  
public class UploadHandleServlet extends HttpServlet {  

    private static final long serialVersionUID = 5827821285414610443L;  

    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        this.doPost(request, response);  
    }  

    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        // 上传文件目录  
        String uploadDir = this.getServletContext().getRealPath("/upload");  
        DiskFileItemFactory factory = new DiskFileItemFactory();  
        // 设置内存区块大小4KB  
        factory.setSizeThreshold(4 * 1024);  
        // 设置暂存容器,当上传文件大于设置的内存块大小时,用暂存容器做中转  
        factory.setRepository(new File(this.getServletContext().getRealPath(  
                "/temp")));  
        ServletFileUpload fileUpload = new ServletFileUpload(factory);  
        fileUpload.setSizeMax(1024 * 1024 * 100);  
        //fileUpload.setFileSizeMax(1024 * 1024 * 10);  
        List<FileItem> fileItemList = null;  

        try {  
            fileItemList = fileUpload.parseRequest(request);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        Iterator<FileItem> fileItemIterator = fileItemList.iterator();  
        FileItem fileItem = null;  
        while (fileItemIterator.hasNext()) {  
            fileItem = fileItemIterator.next();  
            // 普通文件框上传  
            if (fileItem.isFormField()) {  
                String filedName = fileItem.getFieldName();  
                String filedValue = fileItem.getString("GBK");// 编码格式  
                System.out.println(filedName);// 文件框名称  
                System.out.println(filedValue);// 文件的值  
            } else {  
                String filedName = fileItem.getFieldName();// 文件上传框的名称  
                // 获取文件上传的文件名  
                String OriginalFileName = takeOutFileName(fileItem.getName());  
                System.out.println("原始文件名:"+OriginalFileName);  
                if (!"".equals(OriginalFileName)) {  
                    // 根据上传的文件名重新命名  
                    String newFileName = getNewFileName(OriginalFileName);  
                    System.out.println("重新名:"+newFileName);  
                    File writeToFile = new File(uploadDir + File.separator  
                            + newFileName);  
                    try {  
                        fileItem.write(writeToFile);  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  

    private String takeOutFileName(String filePath) {  
        String fileName = filePath;  
        if (null != filePath && !"".equals(filePath)) {  
            int port = filePath.lastIndexOf("\\");  
            if(port != -1){  
                fileName = filePath.substring(port+1);  
            }  
        }  
        return fileName;  
    }  

    private String getNewFileName(String originalFileName) {  
        StringBuffer newFileName = new StringBuffer();  
        if (null != originalFileName && !"".equals(originalFileName)) {  
            int port = originalFileName.lastIndexOf(".");  
            String type = "";  
            String fileName = "";  
            if (port != -1) {  
                type = originalFileName.substring(port + 1);  
                fileName = originalFileName.substring(0, port);  
            } else {  
                fileName = originalFileName;  
            }  
            StringBuffer suffix = new StringBuffer("_");  
            suffix.append(Calendar.getInstance().getTimeInMillis());  
            suffix.append("_");  
            suffix.append(new Random().nextInt(100));  
            newFileName.append(fileName);  
            newFileName.append(suffix);  
            newFileName.append(".");  
            newFileName.append(type);  
        }  
        return newFileName.toString();  
    }  

}

其他的处理代码直接修改就可以了!

收起阅读 »

这个是一篇好文章

这是非常好的文章,偶然间读到这个文章,感觉非常有用,但是当时疏忽没有拷贝url,本以为还可以再找到。
关闭页面后开始编程,过一会想找这个页面就找不到了,找了整整3个小时才找到。

以下是链接,没看过的一定要看一下,看过的略过
http://ask.dcloud.net.cn/article/25

,感觉社区目录排版有些混乱,或许是刚来的原因。
支持Dcloud!!

继续阅读 »

这是非常好的文章,偶然间读到这个文章,感觉非常有用,但是当时疏忽没有拷贝url,本以为还可以再找到。
关闭页面后开始编程,过一会想找这个页面就找不到了,找了整整3个小时才找到。

以下是链接,没看过的一定要看一下,看过的略过
http://ask.dcloud.net.cn/article/25

,感觉社区目录排版有些混乱,或许是刚来的原因。
支持Dcloud!!

收起阅读 »

Andriod下拉刷新失效,pullRefresh问题

下拉刷新

今天做一个下拉刷新评论的模块,iOS版本上面正常,在Andriod上面却失效,查了很久最后发现原因是初始化载入数据的问题;
Andriod机器上,如果我一初始化瞬间就加载数据(loadComment),会导致整个下拉失效,后来发现需要延迟一点才可以,所以再plusReady防法上写了下面代码;

mui.plusReady(function(){  
    //加载评论  
    if(mui.os.android){  
        //Andriod容易加载太快导致初始化下拉失败  
        setTimeout('loadComment()',800);  
    }else{  
        loadComment();  
    }  
});  

mui.init({  
    pullRefresh: {  
        container: '#pullrefresh',  
        down:{  
            callback: pulldownRefresh  
        }  
    }  
});

浪费了很多时间,所以写出来希望能给朋友们一些思路;

继续阅读 »

今天做一个下拉刷新评论的模块,iOS版本上面正常,在Andriod上面却失效,查了很久最后发现原因是初始化载入数据的问题;
Andriod机器上,如果我一初始化瞬间就加载数据(loadComment),会导致整个下拉失效,后来发现需要延迟一点才可以,所以再plusReady防法上写了下面代码;

mui.plusReady(function(){  
    //加载评论  
    if(mui.os.android){  
        //Andriod容易加载太快导致初始化下拉失败  
        setTimeout('loadComment()',800);  
    }else{  
        loadComment();  
    }  
});  

mui.init({  
    pullRefresh: {  
        container: '#pullrefresh',  
        down:{  
            callback: pulldownRefresh  
        }  
    }  
});

浪费了很多时间,所以写出来希望能给朋友们一些思路;

收起阅读 »

H5国际化的实现[基于i18n]

国际化 i18n

要过年啦,客户的项目还没开始动工,客户就喊着要 客户端支持国际化,要中英文双语的。
....度娘....,果然还是有解决方案的。 依然是基于 jquery 的,学名:i18n
首先呢,还是加引用,可以是这样的。

<script src="//cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js"></script>  
        <script type="text/javascript" src="js/jquery.i18n.properties-min-1.0.9.js"></script>

其次呢,Dom结构咯;这里我就简单的放了俩按钮,第一个是表现的,第二个用来点击触发改变用的;

<div class="mui-content">  
            <button id='btn'></button>  

            <button id='changelanguage'></button>  
        </div>  
最后呢,就是js代码了
``````javascript  
<script>  
            var lang = '';  
            $(function() {  
                lang = (jQuery.i18n.browserLang().substring(0, 2)); //默认从浏览器语言读取  
                jQuery.i18n.properties({  
                    name: 'strings',  
                    path: 'i18n/', //资源文件路径  
                    mode: 'map', //用Map的方式使用资源文件中的值  
                    language: lang,  
                    callback: function() { //加载成功后设置显示内容  
                        $('#btn').html($.i18n.prop('btn'));  
                        $('#changelanguage').html($.i18n.prop('changelanguage'));  
                    }  
                });  
            })  
            document.getElementById("changelanguage").addEventListener('tap', function() {  
                if ('zh' == lang) {  
                    lang = 'en';  
                } else {  
                    lang = 'zh';  
                }  
                jQuery.i18n.properties({  
                    name: 'strings',  
                    path: 'i18n/', //资源文件路径  
                    mode: 'map', //用Map的方式使用资源文件中的值  
                    language: lang,  
                    callback: function() { //加载成功后设置显示内容  
                        $('#btn').html($.i18n.prop('btn'));  
                        $('#changelanguage').html($.i18n.prop('changelanguage'));  
                    }  
                });  
            });  
        </script>

好了,上面都是页面上代码了,最最后就是对应的配置文件了,你不配置,代码怎么知道你的英文要先显示成什么中文呢??
只要指定要配置的id就行。比如上面的按钮的id是 btn,所以这里配置文件里 写btn;
没了。就这么多了,最后附上包

继续阅读 »

要过年啦,客户的项目还没开始动工,客户就喊着要 客户端支持国际化,要中英文双语的。
....度娘....,果然还是有解决方案的。 依然是基于 jquery 的,学名:i18n
首先呢,还是加引用,可以是这样的。

<script src="//cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js"></script>  
        <script type="text/javascript" src="js/jquery.i18n.properties-min-1.0.9.js"></script>

其次呢,Dom结构咯;这里我就简单的放了俩按钮,第一个是表现的,第二个用来点击触发改变用的;

<div class="mui-content">  
            <button id='btn'></button>  

            <button id='changelanguage'></button>  
        </div>  
最后呢,就是js代码了
``````javascript  
<script>  
            var lang = '';  
            $(function() {  
                lang = (jQuery.i18n.browserLang().substring(0, 2)); //默认从浏览器语言读取  
                jQuery.i18n.properties({  
                    name: 'strings',  
                    path: 'i18n/', //资源文件路径  
                    mode: 'map', //用Map的方式使用资源文件中的值  
                    language: lang,  
                    callback: function() { //加载成功后设置显示内容  
                        $('#btn').html($.i18n.prop('btn'));  
                        $('#changelanguage').html($.i18n.prop('changelanguage'));  
                    }  
                });  
            })  
            document.getElementById("changelanguage").addEventListener('tap', function() {  
                if ('zh' == lang) {  
                    lang = 'en';  
                } else {  
                    lang = 'zh';  
                }  
                jQuery.i18n.properties({  
                    name: 'strings',  
                    path: 'i18n/', //资源文件路径  
                    mode: 'map', //用Map的方式使用资源文件中的值  
                    language: lang,  
                    callback: function() { //加载成功后设置显示内容  
                        $('#btn').html($.i18n.prop('btn'));  
                        $('#changelanguage').html($.i18n.prop('changelanguage'));  
                    }  
                });  
            });  
        </script>

好了,上面都是页面上代码了,最最后就是对应的配置文件了,你不配置,代码怎么知道你的英文要先显示成什么中文呢??
只要指定要配置的id就行。比如上面的按钮的id是 btn,所以这里配置文件里 写btn;
没了。就这么多了,最后附上包

收起阅读 »

MUI的TAP事件在部分手机上会执行2次

已经验证HBuilder 版本 HBuilder 6.9.2.201601052351

MUI框架的事件tap在很多机器上都会被执行2次,换成click事件问题立即解决。
绝对不是两个窗体或者2次绑定引起的。已经在INSPECT里面调试过了。只有一个窗体实例,元素上也只有1个TAP监听。

我一直要求员工都用MUI的TAP事件。例如用TAP打开一个窗口。造成窗口都要闪烁2次,我原来以为是加速造成,结果发现完全是TAP引起的。。一次偶然,用TAP事件上,绑定了一个plus.nativeUI.alert,结果弹了2次框,我这才发现这个问题。。立即把所有TAP都改成CLICK了,结果所有因2次执行引起的闪烁全部消失。

以上问题不是在全部机器上都出现。。我用自己的NOTE5出现,用一个华为的手机出现。。有些小米手机出现,有些不出现。。未深究TAP的JS代码,有时间多的高人看看有没有更好的解决方案。

继续阅读 »

已经验证HBuilder 版本 HBuilder 6.9.2.201601052351

MUI框架的事件tap在很多机器上都会被执行2次,换成click事件问题立即解决。
绝对不是两个窗体或者2次绑定引起的。已经在INSPECT里面调试过了。只有一个窗体实例,元素上也只有1个TAP监听。

我一直要求员工都用MUI的TAP事件。例如用TAP打开一个窗口。造成窗口都要闪烁2次,我原来以为是加速造成,结果发现完全是TAP引起的。。一次偶然,用TAP事件上,绑定了一个plus.nativeUI.alert,结果弹了2次框,我这才发现这个问题。。立即把所有TAP都改成CLICK了,结果所有因2次执行引起的闪烁全部消失。

以上问题不是在全部机器上都出现。。我用自己的NOTE5出现,用一个华为的手机出现。。有些小米手机出现,有些不出现。。未深究TAP的JS代码,有时间多的高人看看有没有更好的解决方案。

收起阅读 »

【分享】常见字符集,字符编码编码和相互之间的转换以及Base64加密

技术分享 base64 字符编码

最近在用JS时,涉及到了不同编码之间的转换.于是汇总了一些网上的资料,整合成了自己的文档.

知识点涉及:
1.字符编码基础,几种常见字符编码的基本概念

  1. 不同编码之间的转换,如UTF-8转UTF-16,如UTF-16转GBK;
  2. Base64加密,GBK型与UTF-8型加密等
  3. 示例demo(js实现),比如如何用js将utf-16编码(js内置编码)转为UTF-8和GBK;比如如何将UTF-16编码的字符串(js内部的字符串)进行base64GBK和UTF-8编码

基础知识:(感谢@maq的提醒,这里普及下,字符集和字符编码的区别)

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码

常用字符集和字符编码

常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。经常说的GB2312即是字符集也是字符编码,所以经常将字符集和字符编码混着说.
参考来源:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

注:原文是在csdn博客上的,这里就不重复了.直接给出链接.(里面包含demo)

http://blog.csdn.net/u010979495/article/details/50601511

继续阅读 »

最近在用JS时,涉及到了不同编码之间的转换.于是汇总了一些网上的资料,整合成了自己的文档.

知识点涉及:
1.字符编码基础,几种常见字符编码的基本概念

  1. 不同编码之间的转换,如UTF-8转UTF-16,如UTF-16转GBK;
  2. Base64加密,GBK型与UTF-8型加密等
  3. 示例demo(js实现),比如如何用js将utf-16编码(js内置编码)转为UTF-8和GBK;比如如何将UTF-16编码的字符串(js内部的字符串)进行base64GBK和UTF-8编码

基础知识:(感谢@maq的提醒,这里普及下,字符集和字符编码的区别)

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码

常用字符集和字符编码

常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。经常说的GB2312即是字符集也是字符编码,所以经常将字符集和字符编码混着说.
参考来源:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

注:原文是在csdn博客上的,这里就不重复了.直接给出链接.(里面包含demo)

http://blog.csdn.net/u010979495/article/details/50601511

收起阅读 »