文章转载自:

http://blog.csdn.net/yan8024/article/details/46531901

http://www.51testing.com/html/56/n-3707756.html

https://blog.csdn.net/z69183787/article/details/78616463

在HttpCient4.3之后上传文件主要使用的类是位于org.apache.http.entity.mime下的MultipartEntityBuilder(原先的MultipartEntity已经基本弃用了)。
  1.首先是设置上传的模式;
  setMode(HttpMultipartMode mode),其中mode主要有BROWSER_COMPATIBLE,RFC6532,STRICT三种,默认值是STRICT。
  2.其次是创建MultipartEntityBuilder对象,并添加需要上传的数据;
  a.利用MultipartEntityBuilder.create()来创建对象;
  b.addBinaryBody:以二进制的形式添加数据,可以添加File、InputStream、byte[]类型的数据。
  addBinaryBody(String name, File file, ContentType contentType, String filename)
  addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)
  addBinaryBody(String name, byte[] b, ContentType contentType, String filename)
  c.addTextBody:添加文本数据
  addTextBody(String name, String text, ContentType contentType)
  d.addPart:以Key/Value的形式添加ContentBody类型的数据
  addPart(String name, ContentBody contentBody)
  更多函数可以参考:https://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntityBuilder.html。在GACHA API中,主要是上传图片,所以在测试中选用了addBinaryBody。其中,第一个参数name的值,是服务器已经定义好的,服务器会根据这个字段来读取我们上传的文件流,不匹配则会报错。关于contentType,可以参考:http://tool.oschina.net/commons,不同文件扩展名所对应的类型。而file/stream和fileName,就是我们所要上传文件的信息。当用浏览器的开发者工具查看API请求时,我们会看到这些/参数基本位于API请求中的 Request Payload字段。
  3.然后是利用build()方法创建一个HttpEntity对象;
  4.最后将HttpEntity对象添加到指定的URL上,采用HttpPost的setEntity的方法;
  5.最后的最后,就是调用HttpClient对象发送请求,并获取服务器的响应
 

在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了。随之替代它的类是MultipartEntityBuilder。

下面让我们了解一下MultipartEntityBuilder类:

MultipartEntityBuilder这个类主要用于创建HttpEntity。它的主要方法有:

修饰符和类型

方法和描述

MultipartEntityBuilder

addBinaryBody(String name, byte[] b)

将字节数组以二进制的形式添加数据。

MultipartEntityBuilder

addBinaryBody(String name, byte[] b, ContentType contentType, String filename)

将字节数组以二进制的形式添加数据。

MultipartEntityBuilder

addBinaryBody(String name, File file)

将文件以二进制的形式添加数据。

MultipartEntityBuilder

addBinaryBody(String name, File file, ContentType contentType, String filename)

将文件以二进制的形式添加数据。

MultipartEntityBuilder

addBinaryBody(String name, InputStream stream)

MultipartEntityBuilder

addBinaryBody(String name, InputStream stream, ContentType contentType, String filename)

将输入流以二进制的形式添加数据。

MultipartEntityBuilder

addPart(String name, ContentBody contentBody)

添加ContentBody 类型的数据。

MultipartEntityBuilder

addTextBody(String name, String text)

添加文本数据。

MultipartEntityBuilder

addTextBody(String name, String text, ContentType contentType)

以指定的内容类型添加文本数据。

HttpEntity

build()

创建一个HttpEntity。

static MultipartEntityBuilder

create()

创建一个MultipartEntityBuilder对象。

MultipartEntityBuilder

setBoundary(String boundary)

设置边界。

MultipartEntityBuilder

setCharset(Charset charset)

设置请求的编码格式。

MultipartEntityBuilder

setLaxMode()

MultipartEntityBuilder

setMode(HttpMultipartMode mode)

设置模式。

MultipartEntityBuilder

setStrictMode()

主要方法说明:

addBinaryBody、addPart、addTextBody方法用于添加要上传的数据,从上面的表格中可以发现用于添加数据的方法,都是key-value类型。所以在服务器端我们可以通过request.getPart("keyname")方式获取对应key的数据。也可以通过request.getParts()方式获取客户端通过以上三种方法提交所有数据。

1.通过addBinaryBody方法直接可以添加File、InputStream、byte[]类型的数据。

2.通过addPart方法只能添加ContentBody类型的数据,在org.apache.http.entity.mime.content包中已经提供了String、File以及InputStream对应的ContentBody类型的子类,如FileBody、InputStreamBody、StringBody,通过这些类我们可以将String、File以及InputStream类型的数据转换成ContentBody类型的数据。

3.通过addTextBody方法我们可以很方便的添加文本数据。

2.通过HttpCient上传文件


Android端需要添加httpcore-4.3.2.jarhttpmime-4.3.5.jar两个包。两个包缺一不可

在这里我用的是最新版的HttpCient,大家可以从http://hc.apache.org/downloads.cgi上下载所需要的jar包,如果上面的网站打不开,大家也不用担心,我已经将项目中所需要的jar包上传到CSDN上《httpcomponents-client-4.3.5-bin.zip》需要的朋友可以去下载。

Android端项目核心代码:

  1. HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求
  2. HttpPost post = new HttpPost(url);//创建 HTTP POST 请求
  3. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  4. //      builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
  5. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
  6. int count=0;
  7. for (File file:files) {
  8. //          FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
  9. //          builder.addPart("file"+count, fileBody);
  10. builder.addBinaryBody("file"+count, file);
  11. count++;
  12. }
  13. builder.addTextBody("method", params.get("method"));//设置请求参数
  14. builder.addTextBody("fileTypes", params.get("fileTypes"));//设置请求参数
  15. HttpEntity entity = builder.build();// 生成 HTTP POST 实体
  16. post.setEntity(entity);//设置请求参数
  17. HttpResponse response = client.execute(post);// 发起请求 并返回请求的响应
  18. if (response.getStatusLine().getStatusCode()==200) {
  19. return true;
  20. }
  21. return false;
[java] view plain copy
  1. HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求
  2. HttpPost post = new HttpPost(url);//创建 HTTP POST 请求
  3. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  4. //      builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
  5. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
  6. int count=0;
  7. for (File file:files) {
  8. //          FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
  9. //          builder.addPart("file"+count, fileBody);
  10. builder.addBinaryBody("file"+count, file);
  11. count++;
  12. }
  13. builder.addTextBody("method", params.get("method"));//设置请求参数
  14. builder.addTextBody("fileTypes", params.get("fileTypes"));//设置请求参数
  15. HttpEntity entity = builder.build();// 生成 HTTP POST 实体
  16. post.setEntity(entity);//设置请求参数
  17. HttpResponse response = client.execute(post);// 发起请求 并返回请求的响应
  18. if (response.getStatusLine().getStatusCode()==200) {
  19. return true;
  20. }
  21. return false;

代码分析:

上面代码主要实现了多文件上传,为了方便服务器端保存文件,上面代码设置了名称为fileTypes的参数,fileTypes是由上传的文件类型名拼接成的字符串,如”.jpg.png.docx“;

服务器端可以通过获取名为fileTypes的参数,然后将其拆分成字符数组,即可得到要保存文件的类型。

服务器端项目核心代码:

服务器段主要用到Servlet3.0的API,主要用到的方法有:

1.      request.getParameter("");//获取客户端通过addTextBody方法添加的String类型的数据。

2.      request.getPart("");//获取客户端通过addBinaryBody、addPart、addTextBody方法添加的指定数据,返回Part类型的对象。

3.      request.getParts();//获取客户端通过addBinaryBody、addPart、addTextBody方法添加的所有数据,返回Collection<Part>类型的对象。

4.      part.getName();//获取上传文件的名称即上传时指定的key。

5.      part.getSize()//获取上传文件的大小单位为字节。

  1. String fileTypes=request.getParameter("fileTypes");//获取客户端上传的所有文件类型
  2. String[]typeArray=fileTypes.substring(1).split("\\.");//将文件类型字符串拆分成String数组
  3. try {
  4. Iterator<Part>iterator=request.getParts().iterator();
  5. int count=0;
  6. while (iterator.hasNext()) {//遍历客户端上传的所有文件
  7. if (count>=typeArray.length)break;//如果超出文件类型数组的大小则跳出循环
  8. Part part = (Part) iterator.next();
  9. //              System.out.println("part.getSize()"+part.getSize());//获取上传文件的大小
  10. //              System.out.println("part.getName()"+part.getName());//获取上传文件的名及添加数据时的key名
  11. File file=new File("E:\\upload\\"+count+"."+typeArray[count++]);
  12. InputStream inputStream=part.getInputStream();
  13. FileOutputStream fos=new FileOutputStream(file);
  14. byte[]buffer=new byte[1024];
  15. int len=0;
  16. while ((len=inputStream.read(buffer))!=-1) {
  17. fos.write(buffer,0, len);
  18. }
  19. inputStream.close();
  20. fos.close();
  21. }
  22. }catch (Exception e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
[java] view plain copy
  1. String fileTypes=request.getParameter("fileTypes");//获取客户端上传的所有文件类型
  2. String[]typeArray=fileTypes.substring(1).split("\\.");//将文件类型字符串拆分成String数组
  3. try {
  4. Iterator<Part>iterator=request.getParts().iterator();
  5. int count=0;
  6. while (iterator.hasNext()) {//遍历客户端上传的所有文件
  7. if (count>=typeArray.length)break;//如果超出文件类型数组的大小则跳出循环
  8. Part part = (Part) iterator.next();
  9. //              System.out.println("part.getSize()"+part.getSize());//获取上传文件的大小
  10. //              System.out.println("part.getName()"+part.getName());//获取上传文件的名及添加数据时的key名
  11. File file=new File("E:\\upload\\"+count+"."+typeArray[count++]);
  12. InputStream inputStream=part.getInputStream();
  13. FileOutputStream fos=new FileOutputStream(file);
  14. byte[]buffer=new byte[1024];
  15. int len=0;
  16. while ((len=inputStream.read(buffer))!=-1) {
  17. fos.write(buffer,0, len);
  18. }
  19. inputStream.close();
  20. fos.close();
  21. }
  22. }catch (Exception e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }

代码分析:

服务器端是通过Servlet实现的,通过调用request.getParameter("fileTypes")方法来获取客户端上传的所有文件类型,然后将文件类型字符串拆分成String数组。通过request.getParts()方法取出客户端通过addBinaryBody、addPart、addTextBody上传的所有数据,然后遍历数据集合即可进行文件的保存。

由于事先和客户端协定,添加上传文件的顺序在添加请求参数之前,所以可以根据拆分出的文件类型数组的长度判断出客户端上传文件的个数,因此当上面代码遍历超出了类型数组的长度时程序跳出循环,不再进行文件的保存,因为下面的Part都是些参数,而不是要保存的文件了。

程序运行效果图:


 

3.完成项目代码:


MainActivity.java
  1. package com.jph.ufh.activity;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import com.jph.ufh.R;
  7. import com.jph.ufh.service.UploadService;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.os.Environment;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.view.View;
  14. import android.widget.Toast;
  15. /**
  16. * 通过httpClient批量上传文件
  17. * @author jph
  18. * Date:2014.10.09
  19. */
  20. public class MainActivity extends Activity {
  21. private ArrayList<File>files;
  22. private Map<String, String>params;
  23. Handler mHandler=new Handler(){
  24. @Override
  25. public void handleMessage(Message msg) {
  26. // TODO Auto-generated method stub
  27. switch (msg.what) {
  28. case UploadService.UPLOAD_SUCCESS:
  29. Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_LONG).show();
  30. break;
  31. }
  32. super.handleMessage(msg);
  33. }
  34. };
  35. @Override
  36. protected void onCreate(Bundle savedInstanceState) {
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.activity_main);
  39. files=new ArrayList<File>();
  40. params=new HashMap<String, String>();
  41. }
  42. public void upload(View v) {
  43. files.clear();
  44. params.clear();
  45. File file=new File(Environment.getExternalStorageDirectory(),"kaola.jpg");
  46. File file2=new File(Environment.getExternalStorageDirectory(),"test.docx");
  47. File file3=new File(Environment.getExternalStorageDirectory(),"test.jpg");
  48. files.add(file);
  49. files.add(file2);
  50. files.add(file3);
  51. StringBuffer sbFileTypes=new StringBuffer();
  52. for (File tempFile:files) {
  53. String fileName=tempFile.getName();
  54. sbFileTypes.append(getFileType(fileName));
  55. }
  56. params.put("fileTypes",sbFileTypes.toString());
  57. params.put("method", "upload");
  58. UploadService uploadService=new UploadService(mHandler);
  59. uploadService.uploadFileToServer(params, files);
  60. }
  61. /**
  62. * 获取文件的类型
  63. * @param fileName :文件名
  64. * @return 文件类型
  65. */
  66. private String getFileType(String fileName) {
  67. // TODO Auto-generated method stub
  68. return fileName.substring(fileName.lastIndexOf("."), fileName.length());
  69. }
  70. }
[java] view plain copy
  1. package com.jph.ufh.activity;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import com.jph.ufh.R;
  7. import com.jph.ufh.service.UploadService;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.os.Environment;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.view.View;
  14. import android.widget.Toast;
  15. /**
  16. * 通过httpClient批量上传文件
  17. * @author jph
  18. * Date:2014.10.09
  19. */
  20. public class MainActivity extends Activity {
  21. private ArrayList<File>files;
  22. private Map<String, String>params;
  23. Handler mHandler=new Handler(){
  24. @Override
  25. public void handleMessage(Message msg) {
  26. // TODO Auto-generated method stub
  27. switch (msg.what) {
  28. case UploadService.UPLOAD_SUCCESS:
  29. Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_LONG).show();
  30. break;
  31. }
  32. super.handleMessage(msg);
  33. }
  34. };
  35. @Override
  36. protected void onCreate(Bundle savedInstanceState) {
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.activity_main);
  39. files=new ArrayList<File>();
  40. params=new HashMap<String, String>();
  41. }
  42. public void upload(View v) {
  43. files.clear();
  44. params.clear();
  45. File file=new File(Environment.getExternalStorageDirectory(),"kaola.jpg");
  46. File file2=new File(Environment.getExternalStorageDirectory(),"test.docx");
  47. File file3=new File(Environment.getExternalStorageDirectory(),"test.jpg");
  48. files.add(file);
  49. files.add(file2);
  50. files.add(file3);
  51. StringBuffer sbFileTypes=new StringBuffer();
  52. for (File tempFile:files) {
  53. String fileName=tempFile.getName();
  54. sbFileTypes.append(getFileType(fileName));
  55. }
  56. params.put("fileTypes",sbFileTypes.toString());
  57. params.put("method", "upload");
  58. UploadService uploadService=new UploadService(mHandler);
  59. uploadService.uploadFileToServer(params, files);
  60. }
  61. /**
  62. * 获取文件的类型
  63. * @param fileName :文件名
  64. * @return 文件类型
  65. */
  66. private String getFileType(String fileName) {
  67. // TODO Auto-generated method stub
  68. return fileName.substring(fileName.lastIndexOf("."), fileName.length());
  69. }
  70. }
UploadService.java
  1. package com.jph.ufh.service;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Map;
  6. import org.apache.http.HttpEntity;
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.client.ClientProtocolException;
  9. import org.apache.http.client.HttpClient;
  10. import org.apache.http.client.methods.HttpPost;
  11. import org.apache.http.entity.mime.HttpMultipartMode;
  12. import org.apache.http.entity.mime.MultipartEntityBuilder;
  13. import org.apache.http.impl.client.DefaultHttpClient;
  14. import android.os.Handler;
  15. /**
  16. * 采用HttpClient上传文件,支持多文件上传
  17. * @author jph
  18. * Date:2014.10.09
  19. */
  20. public class UploadService {
  21. private static String url="http://10.219.57.16:8080/ServerForUpload/ServletForUpload";
  22. //  private static String url="http://10.110.6.58:8080/ServerForUpload/ServletForUpload";
  23. public static final int UPLOAD_SUCCESS=0x123;
  24. public static final int UPLOAD_FAIL=0x124;
  25. private Handler handler;
  26. public UploadService(Handler handler) {
  27. // TODO Auto-generated constructor stub
  28. this.handler=handler;
  29. }
  30. /**
  31. * @param params 请求参数,包括请求的的方法参数method如:“upload”,
  32. * 请求上传的文件类型fileTypes如:“.jpg.png.docx”
  33. * @param files 要上传的文件集合
  34. */
  35. public void uploadFileToServer(final Map<String, String> params, final ArrayList<File>files) {
  36. // TODO Auto-generated method stub
  37. new Thread(new Runnable() {
  38. @Override
  39. public void run() {
  40. // TODO Auto-generated method stub
  41. try {
  42. if (uploadFiles(url,params,files)) {
  43. handler.sendEmptyMessage(UPLOAD_SUCCESS);//通知主线程数据发送成功
  44. }else {
  45. //将数据发送给服务器失败
  46. }
  47. } catch (Exception e) {
  48. // TODO Auto-generated catch block
  49. e.printStackTrace();
  50. }
  51. }
  52. }).start();
  53. }
  54. /**
  55. * @param url servlet的地址
  56. * @param params 要传递的参数
  57. * @param files 要上传的文件
  58. * @return true if upload success else false
  59. * @throws ClientProtocolException
  60. * @throws IOException
  61. */
  62. private boolean uploadFiles(String url,Map<String, String>params,ArrayList<File>files) throws ClientProtocolException, IOException {
  63. HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求
  64. HttpPost post = new HttpPost(url);//创建 HTTP POST 请求
  65. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  66. //      builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
  67. builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
  68. int count=0;
  69. for (File file:files) {
  70. //          FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
  71. //          builder.addPart("file"+count, fileBody);
  72. builder.addBinaryBody("file"+count, file);
  73. count++;
  74. }
  75. builder.addTextBody("method", params.get("method"));//设置请求参数
  76. builder.addTextBody("fileTypes", params.get("fileTypes"));//设置请求参数
  77. HttpEntity entity = builder.build();// 生成 HTTP POST 实体
  78. post.setEntity(entity);//设置请求参数
  79. HttpResponse response = client.execute(post);// 发起请求 并返回请求的响应
  80. if (response.getStatusLine().getStatusCode()==200) {
  81. return true;
  82. }
  83. return false;
  84. }
  85. }

转载于: :http://blog.csdn.net/fengyuzhengfan/article/details/39941851

以下待研究:http://blog.csdn.net/zhouzme/article/details/18940279、htp://my.oschina.net/weichou/blog/352753

        http://topmanopensource.iteye.com/blog/1605238(使用HttpurlConnection上传文件)

HttpClient MultipartEntityBuilder 上传文件的更多相关文章

  1. 使用HttpClient MultipartEntityBuilder 上传文件,并解决中文文件名乱码问题

    遇到一种业务场景,前端上传的文件需要经过java服务转发至文件服务.期间遇到了原生HttpClient怎么使用的问题.怎么把MultipartFile怎么重新组装成Http请求发送出去的问题.文件中文 ...

  2. 转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

    请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Andr ...

  3. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)

    Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,结构也大量修改 ...

  4. C# 应用 - 使用 HttpClient 发起上传文件、下载文件请求

    1. 示例代码 using System; using System.IO; using System.Net.Http; /// <summary> /// 下载文件 /// </ ...

  5. HttpClient中转上传文件

    场景:客户端(浏览器)A---->选择文件上传---->服务器B---->中转文件---->服务器C---->返回结果---->服务器B---->客户端A 有 ...

  6. Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件

    折腾了好几天的 HTTP 终于搞定了,经测试正常,不过是初步用例测试用的,因为后面还要修改先把当前版本保存在博客里吧. 其中POST因为涉及多段上传需要导入两个包文件,我用的是最新的 httpmine ...

  7. HttpClient 测试web API上传文件实例

    1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...

  8. java使用httpcomponents 上传文件

    一.httpcomponents简介 httpcomponents 是apache下的用来负责创建和维护一个工具集的低水平Java组件集中在HTTP和相关协议的工程.我们可以用它在代码中直接发送htt ...

  9. Android利用网络编程HttpClient批量上传(一个)

    请尊重他人的劳动成果.转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP訪问网络资源>一文中介绍过HttpCient ...

随机推荐

  1. windows下安装配置postgreSQL

    1.下载 postgresql-10.4-1-windows-x64.exe 进行安装 2.环境配置(1)文本使用的IDE是VS2010,我们需要配置包含目录(include).库目录(lib).链接 ...

  2. Excle中的使用小技巧

    关于从数据库中拷贝来的数字,拷贝到excle中,那些数字都变成了科学计算法. 步骤1,鼠标右键选中的列,选择“设置单元格格式(F)” 2.从这里面选中这些是否有小数,如果没有小数就把这个改成0

  3. newcode网学习笔记(1)

    1.类的内存结构一开始指向的是虚函数表,指向虚函数表的指针为4个字节(32位系统)[类的内存结构最前面的是指向虚函数表的指针] 2.包含标准库文件以及相关命名空间,则系统不允许用户重新定义标准库函数, ...

  4. cycle标签和random两种方式美化表格

    一:cycle标签实现给表格变色 1. <style>标签里写好需要的颜色 2. 在要变色的地方(行/列)加固定的语句,按照顺序依次执行 代码: <!DOCTYPE html> ...

  5. FineUI 相关

    FineUI 相关(ExtAsp.Net 2008-2017),记在这把,免得找不到了. 不知道同年代的类似项目Coolite怎么样了?更名为Ext.net了,在国外活得还算滋润,在国内嘛..死贵死贵 ...

  6. 移动App专项测试

    移动App测试实战—专项测试 转自:http://www.51testing.com/html/58/n-3713758.html 我们在进行了手工的功能测试之后,也开发了一些自动化测试用例,并且做了 ...

  7. vuex 入坑篇

    Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 这个状态自管理应用包含 ...

  8. arcgis for js 根据多边形自动缩放

    交代背景:多边形已经渲染在图层上,然后根据多边形自动缩放值合适的大小: 思路:获取图层信息,获取图层中的几何信息,获取图形范围信息,在地图上设置范围:(下面的方法有封装)记一下思路就好 var pol ...

  9. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165215

    2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165215 目录 Kali的下载及安装 网络配置 设置共享文件夹及剪切板 更新软件源 [Kali的下载及安 ...

  10. 记使用expo与expoKit分离工程遇到的坑

    expoKit是支持expo平台的Objective-C和Java库,比纯RN一个个引入包开发效率会高一些,比如react-native-vector-icons包已经集成在expoKit中了. 假定 ...