Framewrok7 视图介绍(views、view)使用介绍

 更新时间:2016年10月2日 16:23  点击:2638
下面我们来看一篇关于Framewrok7 视图介绍(views、view)使用介绍吧,希望这篇文章能够帮助到各位朋友。

一、Views 与View的介绍

1,Views (<div class="views">)
(1)Views 是应用主容器。一个应用中只能有一个 Views。
(2)同时 Views 也是是所有可见 View 的容器(不包括 Modal 和 Panel)。

2,View(<div class="view">)
(1)View 在应用中是一个独立的部分,它有自己的设置、页面切换和历史。
(2)每一个视图都可以有不同的导航栏、工具栏布局和不同的样式。所以 View 就像是嵌在应用中的另一个应用。这种功能可以让你来分别操作一个应用中的不同部分。
(3)View 可以放在应用中的任何位置,但是有一个重要的规则 - 所有的可见 View 都应该放在 Views (<div class="views">)中。因为我们会用来做页面切换的动画。


二、视图的创建与初始化

1,html页面中定义视图

假设我们要做一个包含两个模块(即两个视图 View)的应用,主页代码结果如下:


<body>
  ...
  <div class="panel panel-left panel-cover">
    <div class="view panel-view"> ... </div>
  </div>
  <!-- Views -->
  <div class="views">
    <!-- 主视图(main view) -->
    <div class="view view-main">
      <!-- Navbar-->
      <!-- Pages -->
      <!-- Toolbar-->
    </div>
    <!-- 另一个视图 -->
    <div class="view another-view">
      <!-- Navbar-->
      <!-- Pages -->
      <!-- Toolbar-->
    </div>        
  </div>
  <div class="popup">
    <div class="view popup-view"> ... </div>
  </div>
  ...
</body>

2,初始化视图

前面我们已经在 html 中创建好了需要的 view,接下来还要 JavaScript 中初始化我们的 view
var myApp = new Framework7({
  // ...
}); 
 
/* 初始化视图 */
var mainView = myApp.addView('.view-main', {
  dynamicNavbar: true
})
var anotherView = myApp.addView('.another-view');

三、视图的访问与使用

1,View 的方法和属性
View 实例有很多有用的方法可以用来操作自身。上面样例中,我们将两个视图初始化后的实例分别保存在 mainView 和 anotherView 这两个变量中。下面以 mainView 为例来看看这些方法和参数。
属性(Properties)
mainView.params 初始化参数,你可以读取或者重写某些属性,
比如 mainView.params.linksView = '.another-view'
mainView.history 返回一个包含所有历史的字符串数组,其中每一个字符串都是一个页面的URL
mainView.contentCache 返回被缓存的页面。只有当内容是动态生成的时候才可以使用这个属性。
mainView.url 当前页面的URL
mainView.pagesContainer 当前的pagesHTML元素
mainView.activePage 当前页面对应的Page Data
mainView.main 当前页面是否是 main view
mainView.router router对象,有很多路由相关的方法
Methods
mainView.router.load(options) Read more about it in Router API
mainView.router.back(options) Read more about it in Router API
mainView.hideNavbar() 在当前View中隐藏导航栏
mainView.showNavbar() 在当前View中显示导航栏
mainView.hideToolbar() 在当前View中隐藏工具栏
mainView.showToolbar() 在当前View中显示工具栏
mainView.destroy() 销毁初始化过的View,解除事件绑定,禁用浏览导航

2,获取当前视图实例

有时我们需要获取到当前的活动视图,或者是作为弹出窗口、弹出面板等等的视图。可以使用 myApp.getCurrentView() 方法即可。
比如在一个面板(panel)中初始化一个视图 View,同时这个 panel 当前也是打开的,那么用这个方法就会得到这个 View。
同样的,如果我们是使用标签栏布局(tab bar layout),这个方法就会得到当前激活标签对应的视图。
(1)如果只有一个活动视图

var currentView = myApp.getCurrentView();

(2)如果当前有多个活动视图(比如 Split View 布局),就要加个索引参数。

myApp.getCurrentView(index)

3,通过HTML元素来获取视图View实例

当我们初始化完成 View 之后,Framework7 会在元素上增加一个属性以便让我们可以通过 JS 来访问。

var viewsElement = $$('.view-main')[0];
var viewInstance = viewsElement.f7View;

4,获取所有的视图实例
所有的 view 实例也都存储在一个应用实例的 views 属性中,比如我们可以这样找到 main view
for (var i = 0; i < myApp.views.length; i ++) {
  var view = myApp.views[i];
  if (view.main) myApp.alert('I found main View!')
}

Preloader Modal就是一个提醒加载的功能,我们这里来看Framewrok7 预加载提示模态框(Preloader Modal)用法吧,具体细节如下所示。

1,预加载Modal介绍

(1)预加载Modal 可以看作是里面包含有加载指示符(Preloader),以及相关 title 的模态框。
(2)其作用一是用来提示一些后台活动(像 Ajax 请求)。二来阻止在这个活动期间的任何用户操作。

2,预加载Modal的使用(默认标题)

如果使用使不指定 title,则会显示默认标题。默认标题为“Loading”,可以在 App 初始化的时候修改设置。参考我之前的文章:Framework7 - 修改模态框默认文字(标题、确认|取消按钮、登录框提示)

 

$$('.open-preloader').on('click', function () {
    myApp.showPreloader();
    setTimeout(function () {
        myApp.hidePreloader();
    }, 2000);
});

3,预加载Modal的使用(自定义标题)

除了在 Framework7 初始化的时候统一修改标题文字外,我也可以在每次使用预加载Modal时单独设置标题。

 


$$('.open-preloader-title').on('click', function () {
    myApp.showPreloader('正在上传照片...')
    setTimeout(function () {
        myApp.hidePreloader();
    }, 2000);
});

用Framewrok7框架做app是相当的简单了我们今天来看一篇关于Framewrok7 页面的结构、事件、以及数据用法介绍吧,具体的细节如下文所示。


1,页面结构说明

页面(Pages)和我们在在网页中打开的页面是同样的意思,比如下面一个简单的样例。


<body>
  ...
  <!-- Views -->
  <div class="views">
    <!-- Your main view -->
    <div class="view view-main">
      <!-- Pages -->
      <div class="pages">
        <div class="page" data-page="home">
          <div class="page-content">
            ... 这里是页面内容 ...
          </div>
        </div>
      </div>
    </div>
    <!-- Another view -->
    <div class="view another-view">
      <!-- Pages -->
      <div class="pages">
        <div class="page" data-page="home-another">
          <div class="page-content">
            ... 这里是页面内容 ...
          </div>
        </div>
      </div>
    </div>        
  </div>
  ...
</body>
(1)Pages 是必须的,因为同一个 View 下所有的页面切换都在这里。
(2)每一个 Page 都应该放在 Pages 容器中(<div class="pages">),而 Pages 必须是 View 的子元素(<div class="view">)。
(3)每个 Page 都有一个 data-page 属性,存储了一个唯一的 page 名。这个属性不是必须的,但是强烈推荐使用。因为这个属性在 page 事件中或者在 page 回调函数中可以用来帮助我们确定加载的是哪一个页面。
(4)所有的可见的内容,比如列表和表单等,都应该放在 <div class="page-content"> 中,它是 <div class="page"> 的子元素。这样才能保证正确的样式,布局和滚动。

2,Page 事件介绍
(1)在 Page 事件响应中,我们可以通过 JS 来操作加载好的 Page。具体的事件如下:
Event Target Description
pageBeforeInit Page Element
<div class="page"> 当Framework7把新页面插入DOM的时候会触发
pageInit Page Element
<div class="page"> 当Framework7初始化页面的组件的时候会触发
pageReinit Page Element
<div class="page"> This event will be triggered when cached page becomes visible.
It is only applicaple for Inline Pages (DOM cached pages)
pageBeforeAnimation Page Element
<div class="page"> 当页面初始化完成并且可以做动画的时候触发
pageAfterAnimation Page Element
<div class="page"> 在页面动画完成之后触发
pageBeforeRemove Page Element
<div class="page"> Page从DOM中移除之前就会触发这个事件。如果你希望做一些解除事件绑定或者销毁一些插件的时候,这个方法是很有用的。
pageBack Page Element
<div class="page"> 在返回上一页动画执行之前就会触发这个事件。和 "pageBeforeAnimation" 的不同之处在于,这个事件在老页面上也会触发,也就是那个从中间滑动到右边的页面。
pageAfterBack Page Element
<div class="page"> 返回上一页动画执行完成之后触发这个事件。同样,区别于"pageAfterAnimation",他也会在老页面上触发。

(2)有两种方式可以使用这些事件。下面以 pageInit 事件为例:

// 方式1. 处理所有页面的pageInit事件 (推荐):
$$(document).on('pageInit', function (e) {
  // 当页面加载并初始化完毕后执行一些代码....
 
})
 
// 方式2. 处理指定页面(data-page="about")的 pageInit事件 (不推荐):
$$(document).on('pageInit', '.page[data-page="about"]', function (e) {
  // 当页面加载并初始化完毕后执行一些代码....
})

3,Page 数据介绍

在 Page 事件中,event 实例中包含了关于当前页面非常详细的数据。
(1)下面样例中,我们将页面数据保存到一个变量中。

$$(document).on('pageInit', function (e) {
  //获取页面数据,这里面保存了所有的请求信息
  var page = e.detail.page;
})

(2)上面将页面数据保存到一个对象中,这个对象里面包含的属性如下:
Page Data Properties
page.name 就是 data-page 设定的名称
page.url 当前页面的URL
page.query 当前页面的get参数,是一个对象。假设你的页面URL是 "about.html?id=10&count=20&color=blue",那么query就是:
{
  id: '10',
  count: '20',
  color: 'blue'
}                 
page.view object. 包含当前页面的view对象(前提是view已经初始化完成)
page.container Page 对应的 HTMLElement
page.from string 当前页面从哪个方向加载进来。如果是新加载的页面,则为"right",如果是返回上一步的页面,则为"left"
page.navbarInnerContainer navbar-inner" 对应的 HTMLElement,只有动态导航栏才有。
page.swipeBack boolean。当前页面是否是滑动返回的。只有在 onPageBefore/AfterAnimation 回调函数/事件 中才可以访问。
page.context object. 这个页面的 Template7 上下文
page.fromPage object. 上一个页面的pageData

(3)使用样例如下。比如我们可以在一个 handler 中,根据不同的 page.name 来处理不同的页面。

$$(document).on('pageInit', function (e) {
    var page = e.detail.page;
    // 处理about页面
    if (page.name === 'about') {
        // 获取url中的count参数值 (about.html?count=10)
        var count = page.query.count;
        // 根据count生成对应数量的列表
        var listHTML = '<ul>';
        for (var i = 0; i < count; i++) {
            listHTML += '<li>' + i + '</li>';
        }
        listHTML += '</ul>';
        // 将列表数据填充到页面内容区域上
        $$(page.container).find('.page-content').append(listHTML);
    }
    // 处理services页面
    if (page.name === 'services') {
        myApp.alert('Here comes our services!');
    }
});

Framework7 是一个开源免费的框架可以用来开发混合移动应用(原生和HTML混合)或者开发 iOS & Android 风格的WEB APP,下面我们来看Framewrok7页面回调函数的用法详解吧。

我们通过监听页面(Page)的事件,实现在事件响应函数中对特定的页面执行特定的代码。
其实除了使用事件,我们还可以使用 Page 回调函数来实现同样的功能。

1,Page回调函数的优点(相较于Page事件)

(1)Page 回调函数不是事件,所以占用更少的的内存,同时更少的内存泄露出现几率。
(2)因为不是事件,所以不用担心如何监听。
(3)有时候会在代码结构上比使用事件更方便。

2,Page回调方法介绍

其中 pageName 是指页面的 "data-page" 属性值。


//当Framework7把新页面(必须带有data-page属性)插入到DOM的时候会触发
myApp.onPageBeforeInit(pageName, callback(page))
 
//当Framework7初始化一个页面(必须带有data-page属性)的组件和导航栏的时候会触发。
myApp.onPageInit(pageName, callback(page))
 
//当Framework7将一个页面(必须带有data-page属性)变为可见的时候会触发
myApp.onPageReinit(pageName, callback(page))
 
//当一个页面(有 data-page 属性)初始化完成并且可以开始做动画的时候触发
myApp.onPageBeforeAnimation(pageName, callback(page))
 
//当一个页面(有 data-page 属性)动画完成之后会触发
myApp.onPageAfterAnimation(pageName, callback(page))
 
//当一个页面(有 data-page 属性)从DOM移除之前会触发
myApp.onPageBeforeRemove(pageName, callback(page))
 
//当页面开始执行返回动画之前调用。
//区别于 "onPageBeforeAnimation", 这个函数在老的页面上也会调用,也就是从中间向右滑动的那个页面
myApp.onPageBack(pageName, callback(page))
 
//当页面开始执行返回动画完成之后调用。
//区别于 "onPageBeforeAnimation", 这个函数在老的页面上也会调用,也就是从中间向右滑动的那个页面。
myApp.onPageAfterBack(pageName, callback(page))
使用样例:

var myApp = new Framework7();
 
//about页面初始化回调
myApp.onPageInit('about', function (page) {
  console.log('About page initialized');
  console.log(page);
});
 
//所有页面的初始化回调
myApp.onPageInit('*', function (page) {
  console.log(page.name + ' initialized');
});

3,回调对象(用于手动触发或移除回调)

上面的每一个回调方法都会返回一个回调对象。通过这个对象的 trigger() 与 remove() 这两个方法,我们可以用来手动触发或者移除这个回调。

var myApp = new Framework7();
//contacts页面初始化回调
var contactsCallback = myApp.onPageInit('contacts', function (page) {
  console.log('Contacts page initialized');
  console.log(page);
});
//删除取消这个回调
contactsCallback.remove();
//手动触发这个回调
contactsCallback.trigger();

4,调用初始化页面的回调函数
有时我们需要触发初始化页面(比如首页)的回调函数。但是有一个问题,当我们添加 .onPage 回调的时候,应用已经初始化完成了,我们添加的回调函数不会被触发。有如下几个方法可以解决这个问题:

(1)手动初始化
也就是说我们先不自动初始化应用,在添加回调函数之后再手动初始化。

var myApp = new Framework7({
  init: false //禁用App的自动初始化功能
});
 
//添加页面的回调函数
myApp.onPageInit('home', function (page) {
  //进行一些页面操作....
});
 
//初始化应用
myApp.init();

(2)使用APP的回调

在App的回调函数中通过参数来判断页面,并做相应的处理。

var myApp = new Framework7({
  onPageInit: function (app, page) {
    if (page.name === 'home') {
      //对首页进行一些操作...
    }
  }
});

(3)手动触发

注意:这种情况下手动触发回调,回调函数不会接受到一个 Page Data 作为参数。


var myApp = new Framework7();        
 
//添加页面初始化回调函数
myApp.onPageInit('home', function (page) {
  //对首页进行一些操作
}).trigger(); //立刻触发这个回调函数

下面我们来看一篇在Android 上传PHP xUtils Bug修复分析过程,这个bug也是非常的好利用了,各位朋友可以和小编一起来看看的哦。

起因

作为全职PHPer偶尔需要客串下Androider,最近公司的一个项目需要Android的客户端(主要图片特效处理及其上传),自己就客串下Androider.

之前有过Android开发经验所以做这个挺顺手的,几乎所有东西直接github中拿过来改改就用,不过在处理图片上传的时候选择了xUtils这个

开源工具类,用起来确实比较好用,挺方便的,例如如下代码就可以实现上传:

RequestParams params = newRequestParams();
params.addBodyParameter("file", file);
HttpUtils httpUtils = newHttpUtils();
httpUtils.send(HttpRequest.HttpMethod.POST, UPLOAD_URL, params, newRequestCallBack<String>() {
@Override
//上传失败处理方法
publicvoidonFailure(HttpException arg0, String msg) {
 alert(msg);
 }
@Override
//上传进度处理
publicvoidonLoading(longtotal,longcurrent,
booleanisUploading) {
if(isUploading) {
 Log.i(LOG_NAME, "upload:"+ current +"/"+ total);
 }
 }
@Override
//上传成功处理
publicvoidonSuccess(ResponseInfo<String> responseInfo) {
 alert(responseInfo.result);
 Log.i(LOG_NAME, responseInfo.result);
 }
});
可以看到用起来比较方便,如果自己写还是比较麻烦的。不过最让人头疼的不是使用方法,而是作为接收端为PHP的话是接收不到上传的文件,最后经证实

不仅仅是PHP C# 也有问题, 网上搜素了下不少人都遇到问题不过没有解决方案,看来只能自己动手解决了

问题分析

既然要解决问题,那么就需要分析bug可能出现的地方,既然是HTTP上传那么我们得知道在PHP 在HTTP协议中文件是怎么处理上传的,直接在官方文档

就可以找到

PHP 能够接受任何来自符合 RFC-1867 标准的浏览器(包括 Netscape Navigator 3 及更高版本,打了补丁的 Microsoft Internet Explorer 3 或者更高版本)上传的文件。

这个是PHP官方文档中给出的解释, PHP在处理上传的时候遵循的是RFC-1867标准,那么我们接下来看看什么是RFC-1867。

这里我给出一个RFC-1867的说明文档地址 RFC-1867 说明 ,太长了就不放在这里了只拿核心重点内容过来看看:

# The client might send back the following data use POST method:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="field1"

Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain

 ... contents of file1.txt ...
--AaB03x--
这里通俗点讲,RFC-1867通过HTTP协议传输特定的格式来实现上传文件,比如我们上传一个文件名字叫做hello.txt的文本到服务端,那么发起请求的HTTP格式应该就如下:

POST /up.phpHTTP/1.1
Host:creturn.com
Content-Length:294
Content-type:multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="file"; filename="hello.txt"
Content-Type: text/plain

hello
--AaB03x--
这里HTTP头部协议没有写完整只是为了说明问题写的格式。在这些描述信息中

第一个Content-type(http头部描述信息)值multipart/form-data 是告诉服务器此次发送的数据是上传文件数据, boundary是告诉服务器文件数据之间分割标示符是 AaB03x
在HTTP body数据中以—AaB03x 分割多个文件,每个分隔符下面的描述信息是作为上传文件的描述信息
发送结束后需要以分隔符加“—”符号进行标示
如果这三点没有问题那么就能正确上传,当然次实例中肯定不成功因为HTTP头部协议描述信息简短切不争取(比如长度)

解决过程

既然上面已经对问题进行分析了,同样也知道了只要发送过程是按照RFC-1867的标准进行发送那么至少PHP是能够接收到上传的文件,那么接下来我们要解决的就是如果判断

或者查看xUtils发送文件过程中是否遵循了RFC-1867标准

那么如何查看xUtils是否发送了正确的数据格式? 有两种方案,一个是利用代理工具抓包,另外一个方案就是直接抓包

这里就说说直接抓包,代理抓包可以google一大堆。

pc 上面建立无线热点分享给手机,这样所有的数据都通过电脑走,不会用pc分享热点的google一大堆,或者为了偷懒买个传说中的mini WIFI都行

抓包工具window推荐smartSniff, linux或者os x直接就tcpdump也行

先写个简单的app装到手机上这里给出上传代码:

String UPLOAD_URL = "http://www.creturn.com/up.php";
File file = newFile(Environment.getExternalStorageDirectory() ,"hello.txt");
RequestParams params = newRequestParams();
params.addBodyParameter("file", file);
HttpUtils httpUtils = newHttpUtils();
httpUtils.send(HttpRequest.HttpMethod.POST, UPLOAD_URL, params, newRequestCallBack<String>() {
@Override
//上传失败处理方法
publicvoidonFailure(HttpException arg0, String msg) {
 alert(msg);
 }
@Override
//上传进度处理
publicvoidonLoading(longtotal,longcurrent,
booleanisUploading) {
if(isUploading) {
 Log.i(LOG_NAME, "upload:"+ current +"/"+ total);
 }
 }
@Override
//上传成功处理
publicvoidonSuccess(ResponseInfo<String> responseInfo) {
 alert(responseInfo.result);
 Log.i(LOG_NAME, responseInfo.result);
 }
});
上面代码作用是把sdcard根目录的hello.txt文件上传到UPLOAD_URL, 所以在sdcard根目录放一个hello.txt文件里面内容随便写点

php服务端这边就直接打印上传的文件信息就行,代码很简单:

<?php
print_r($_FILES);
?>
如果上传成功就会反馈上传文件的信息,写好app装到手机连接好wifi然后在pc上面抓包,我这里用的是smart sniffer

抓包

打开smart sniffer
选择菜单 Options -> Capture Options
选择你分享wifi的网卡
确定点击开始抓包
在手机app上操作上传文件时候就可以看到抓包工具中已经有相应的http数据,抓包工具会对所有流量抓取所以如果有其他包干扰还可以

设置相应的过滤规则,这里就不阐述google就能找到

看看我们抓到的包内容:


图种可以看到我们上传的HTTP包信息,不过很明显反馈的信息提示是没有上传成功的。

那么接下来我们怎么去分析这个?怎么去排查问题?很多人应该能够想到,要是有个正确参照物不就很容易分析出问题出处?

那么我们在建立一个html文件用浏览器同样上传sdcard里面的hello.txt文件,html内容如下:

<html>
<body>

<formaction="http://www.creturn.com/up.php"method="post"enctype="multipart/form-data">
<labelfor="file">Filename:</label>
<inputtype="file"name="file"id="file"/>
<br/>
<inputtype="submit"name="submit"value="Submit"/>
</form>

</body>
</html>
用同样的方法抓包看看正确的包内容是什么样的:

POST /up.phpHTTP/1.1
Host:www.creturn.com
Connection:keep-alive
Content-Length:294
Cache-Control:max-age=0
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin:http://222.73.234.196
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryIexdOW8e2EZyciDK
Referer:http://222.73.234.196/up.html
DontTrackMeHere:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8

------WebKitFormBoundaryIexdOW8e2EZyciDK
Content-Disposition: form-data; name="file"; filename="hello.txt"
Content-Type: text/plain

hello upload
------WebKitFormBoundaryIexdOW8e2EZyciDK
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundaryIexdOW8e2EZyciDK--
可以看到处理HTTP头部描述信息和包体里面多了一个Submit,几乎一样

之前说过上传过程中的几个重点,然后对比下我们发现Content-Type描述信息多了一个charset字符编码描述信息

那么要做测试的话肯定就要把不同的地方去掉,然后对包进行回放看看是否成功

包回放指的是包数据包重新发送一次

回放数据包有两种方法,一种直接修改xUtils源码重新上传。这里说一个简单的方法window自带的telnet ,用telnet 链接服务器80端口

手动发送数据

注意: windows7默认没有安装需要在控制面板->程序和功能->打开或者关闭windows功能中开启

如何进行手动发送?按照我们之前的想法去掉charset描述信息然后手动发送,那么先去掉charset信息后的包内容放入记事本:

POST /up.phpHTTP/1.1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11
Content-Length:233
Content-Type:multipart/form-data; boundary=6wYgRevA02R_Uy4EJP31EcIJtsBlZtRv
Host:wwwcreturn.com
Connection:Keep-Alive
DontTrackMeHere:gzip

--6wYgRevA02R_Uy4EJP31EcIJtsBlZtRv
Content-Disposition: form-data; name="file"; filename="hello.txt"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

hello upload

--6wYgRevA02R_Uy4EJP31EcIJtsBlZtRv--
打开cmd 然后输入telnet www.creturn.com 80 然后黏贴进去看看效果


为了印证我们的才行可以把charset加上去和去掉的进行对比看看是不是加了之后就收不到上传文件的信息。

其实根据HTTP协议来讲理论上加不加charset应该不会影响上传,但结果这个问题确实是由于charset引起的。

接下来就简单了找到根源解决就行,在源码里面进行搜索 boundary ,找到地方根据作者写的方法注释掉其中添加charset的代码:

protectedStringgenerateContentType(
finalString boundary,
finalCharset charset) {
 StringBuilder buffer = newStringBuilder();
 buffer.append("multipart/"+ multipartSubtype +"; boundary=");
 buffer.append(boundary);
//这里就是需要注释掉的代码
/*if (charset != null) {
 buffer.append("; charset=");
 buffer.append(charset.name());
 }*/
returnbuffer.toString();
}

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • PHP mysql与mysqli事务使用说明 分享

    mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
  • Postman安装与使用详细教程 附postman离线安装包

    这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • vs2019安装和使用详细图文教程

    这篇文章主要介绍了vs2019安装和使用详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25