package logback.ecmapplication.cetcs.com.myapplication;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xutils.common.Callback;
import org.xutils.db.sqlite.KeyValue;
import org.xutils.http.RequestParams;
import org.xutils.http.body.MultipartBody; import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.xutils.x; import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory; import static logback.ecmapplication.cetcs.com.myapplication.EcmsApplication.log;
/****
*
* 几点注意事项:
* 1、如果app存在代码混淆,对功能有影响
* 2、运行app的时候一定要记得把对应的存储权限打开,在android 6.0以上要做权限检查
* 把手机内部存储android/data/com.cetcs.ecmapplication/logs下的文件压缩成zip文件
* zip文件存储在android/data/com.cetcs.ecmapplication/目录下ecmslog.zip
* 然后使用xutils将android/data/com.cetcs.ecmapplication/ecmslog.zip上传到
* http://10.12.8.8:8080/UpLoad_file/upload后台
* 使用https:http://blog.csdn.net/haoaoo/article/details/54614875
* */ public class MainActivity extends Activity {
private Button btn;
// Log.d(ECM_TAG, "->" + tag + ":" + msg)
private final static String CLASS_TAG = "MainActivity";
private final static String ECM_TAG = "ecms2223";
private ProgressDialog progressDialog;
private static SSLContext mSSLContext = null;
private static final String TAG = "NetWorkUtils";
public static int DEFAULT_CACHE_EXPIRY_TIME = 30 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
log.info(ECM_TAG+"->" + CLASS_TAG + ":" + "522552522525");
new Thread(new Runnable() {
@Override
public void run() {
log.info(ECM_TAG+"->" + CLASS_TAG + ":" + "2323222522552522525");
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
log.info(ECM_TAG+"->" + CLASS_TAG + ":" + "232322253533636522552522525");
}
}).start(); /* log.info(ECM_TAG,CLASS_TAG,"骂我们skkjfskjjkfsjk");
log.warn(CLASS_TAG,"424424242422424");
log.error(CLASS_TAG,"jkklsakkfa2322323");
log.getName();*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(MainActivity.this,"上传文件",Toast.LENGTH_LONG).show();
Toast.makeText(MainActivity.this,"上传文件dssd",Toast.LENGTH_LONG).show();
new Thread(new Runnable() {
@Override
public void run() {
///storage/emulated/0/android/data/com.cetcs.ecmapplication/logs
String sourceFilePath = Environment.getExternalStorageDirectory()+File.separator+"android"+
File.separator+"data"+File.separator+"com.cetcs.ecmapplication"+File.separator+"logs";
String zipFilePath = Environment.getExternalStorageDirectory()+File.separator+"android"+
File.separator+"data"+File.separator+"com.cetcs.ecmapplication";
log.error("jkklsakkfa2322323 sourceFilePath :"+sourceFilePath);
String fileName = "ecmslog";
boolean flag = FileToZip.fileToZip(sourceFilePath, zipFilePath, fileName);
if(flag){
log.info(" jkklsakkfa2322323文件打包成功!");
}else{
log.info(" jkklsakkfa2322323文件打包失败");
} final File f = new File(Environment.getExternalStorageDirectory()+File.separator+"android"+
File.separator+"data"+File.separator+"com.cetcs.ecmapplication"+File.separator+"ecmslog.zip");
log.info(" jkklsakkfa2322323上传文件路径{}"+f.toString());
if(f!= null && f.exists()){
log.info(" jkklsakkfa2322323上传文件存在");
}else{
log.info(" jkklsakkfa2322323上传文件不存在");
return;
}
String URL = "https://ecm-log.westone-service.cn:7777/UpLoad_file/upload";
RequestParams params = new RequestParams(URL);
SSLContext sslContext = getSSLContext(MainActivity.this); params.setSslSocketFactory(sslContext.getSocketFactory()); params.setMultipart(true);
params.addBodyParameter("imei",SystemUtil.getIMEI(getApplication()));
params.addBodyParameter("phoneNumber","18780279472");
params.addBodyParameter("phone_model",SystemUtil.getDeviceBrand()+":"+SystemUtil.getSystemModel());
params.addBodyParameter("appPackageName","com.cetcs.ecmapplication");
params.addBodyParameter("app_versionName","1.7.8.1");
params.addBodyParameter("app_versionCode","200");
params.addBodyParameter("File",f,null,"ecmslog.zip");
x.http().post(params, new Callback.ProgressCallback<File>() {
@Override
public void onWaiting() { } @Override
public void onStarted() {
progressDialog = new ProgressDialog(
MainActivity.this);
progressDialog.setTitle("日志上传中...");
progressDialog.setMessage("");
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setProgressNumberFormat("%1d Mb /%2d Mb");
progressDialog.show();
} @Override
public void onLoading(long total, long current,
boolean isUploading) {
log.error("jkklsakkfa2322323 onLoading :"+ total +","+current+""+(int) (((int) current / (float) total) * 100));
log.error("jkklsakkfa2322323 onLoading :"+bytes2kb(current));
int process = (int)((current * 1.0 / total)*100);
progressDialog.setMessage(""+bytes2kb(current)+"/"+bytes2kb(total)+" "+process+"%");
progressDialog.setProgress(process); } @Override
public void onSuccess(File file) {
progressDialog.dismiss();
log.error("jkklsakkfa2322323 onSuccess");
Toast.makeText(MainActivity.this,file.getName()+"文件成功",Toast.LENGTH_LONG).show();
} @Override
public void onError(Throwable throwable, boolean b) {
progressDialog.dismiss();
log.error("jkklsakkfa2322323 onError");
Toast.makeText(MainActivity.this,f.getName()+"上传文件失败"+throwable.getMessage(),Toast.LENGTH_LONG).show();
} @Override
public void onCancelled(CancelledException e) {
log.error("jkklsakkfa2322323 onCancelled");
} @Override
public void onFinished() {
log.error("jkklsakkfa2322323 onFinished");
}
});
}
}).start(); }
}); } /**
* byte(字节)根据长度转成kb(千字节)和mb(兆字节)
*
* @param bytes
* @return
*/
public static String bytes2kb(long bytes) {
BigDecimal filesize = new BigDecimal(bytes);
BigDecimal megabyte = new BigDecimal(1024 * 1024);
float returnValue = filesize.divide(megabyte, 2, BigDecimal.ROUND_UP)
.floatValue();
if (returnValue > 1)
return (returnValue + "MB");
BigDecimal kilobyte = new BigDecimal(1024);
returnValue = filesize.divide(kilobyte, 2, BigDecimal.ROUND_UP)
.floatValue();
return (returnValue + "KB");
} public static String getPrintSize(long size) {
//如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
if (size < 1024) {
return String.valueOf(size) + "B";
} else {
size = size / 1024;
}
//如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
//因为还没有到达要使用另一个单位的时候
//接下去以此类推
if (size < 1024) {
return String.valueOf(size) + "KB";
} else {
size = size / 1024;
}
if (size < 1024) {
//因为如果以MB为单位的话,要保留最后1位小数,
//因此,把此数乘以100之后再取余
size = size * 100;
return String.valueOf((size / 100)) + "."
+ String.valueOf((size % 100)) + "MB";
} else {
//否则如果要以GB为单位的,先除于1024再作同样的处理
size = size * 100 / 1024;
return String.valueOf((size / 100)) + "."
+ String.valueOf((size % 100)) + "GB";
}
} /**
* 获取Https的证书
*
* @param context 上下文
* @return SSL的上下文对象
*/
private static SSLContext getSSLContext(Context context) {
CertificateFactory certificateFactory = null;
InputStream inputStream = null;
Certificate cer = null;
KeyStore keystore = null;
TrustManagerFactory trustManagerFactory = null;
try {
certificateFactory = CertificateFactory.getInstance("X.509");
inputStream = context.getAssets().open("upload_logs.cer");//这里导入SSL证书文件
try {
cer = certificateFactory.generateCertificate(inputStream);
} finally {
inputStream.close();
} //创建一个证书库,并将证书导入证书库
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null, null); //双向验证时使用
keystore.setCertificateEntry("trust", cer); // 实例化信任库
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore); mSSLContext = SSLContext.getInstance("TLS");
mSSLContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); //信任所有证书 (官方不推荐使用)
// s_sSLContext.init(null, new TrustManager[]{new X509TrustManager() {
//
// @Override
// public X509Certificate[] getAcceptedIssuers() {
// return null;
// }
//
// @Override
// public void checkServerTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
//
// @Override
// public void checkClientTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
// }}, new SecureRandom()); return mSSLContext; } catch (Exception e) {
e.printStackTrace();
}
return null;
} }

使用hppts参考:

http://blog.csdn.net/haoaoo/article/details/54614875

随着17年ios上线必须要支持https,以及考虑到网络安全这块,越来越多的APP开发支持和使用https。

在gradle里配置 
compile 'org.xutils:xutils:3.2.2'

在Application里配置

x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG);

  

public class NetWorkUtils {

    private static SSLContext mSSLContext = null;
private static final String TAG = "NetWorkUtils";
public static int DEFAULT_CACHE_EXPIRY_TIME = 30 * 1000; /**
* http get请求
*
* @param params 请求参数 get请求使用 addQueryStringParameter方法添加参数
* @param callback 回调对象
*/
public static Callback.Cancelable getHttpRequest(RequestParams params, final HttpCallback callback) {
return sendHttpRequest(HttpMethod.GET, params, callback);
} /**
* http post请求
*
* @param params 请求参数 post请求使用 addBodyParameter方法添加参数
* @param callback 回调对象
*/
public static Callback.Cancelable postHttpRequest(RequestParams params, final HttpCallback callback) {
return sendHttpRequest(HttpMethod.POST, params, callback);
} public static Callback.Cancelable sendHttpRequest(HttpMethod method, RequestParams params, final HttpCallback callback) { if (params == null) {
params = new RequestParams();
} params.setCacheMaxAge(1000 * 0); //为请求添加缓存时间
params.setConnectTimeout(DEFAULT_CACHE_EXPIRY_TIME);
final String url = params.getUri(); LogUtil.d("sendRequest: url = " + url);
SSLContext sslContext = getSSLContext(GoPlusApplication.getApplication());
if (null == sslContext) {
if (BuildConfig.DEBUG) LogManager.d(TAG, "Error:Can't Get SSLContext!");
return null;
} params.setSslSocketFactory(sslContext.getSocketFactory()); return x.http().request(method, params, new Callback.CommonCallback<String>() { @Override
public void onCancelled(CancelledException msg) {
Toast.makeText(text, msg.getMessage(), Toast.LENGTH_SHORT).show();
callback.onFinished();
} @Override
public void onError(Throwable arg0, boolean arg1) {
Toast.makeText(text, arg0.getMessage(), Toast.LENGTH_SHORT).show();
LogManager.i(TAG, "==> RequestCallBack.onError()");
LogManager.e(TAG, "==> response:" + arg0.getMessage() + "\n==> error:" + arg1);
callback.onFinished();
} @Override
public void onSuccess(String result) {
LogManager.i(TAG, "==> RequestCallBack.onSuccess()");
if (result == null) {
return;
}
callback.onSuccess(result);
} @Override
public void onFinished() {
LogUtil.d("onFinished");
}
});
} /**
* 获取Https的证书
*
* @param context 上下文
* @return SSL的上下文对象
*/
private static SSLContext getSSLContext(Context context) {
CertificateFactory certificateFactory = null;
InputStream inputStream = null;
Certificate cer = null;
KeyStore keystore = null;
TrustManagerFactory trustManagerFactory = null;
try {
certificateFactory = CertificateFactory.getInstance("X.509");
inputStream = context.getAssets().open("baidu.cer");//这里导入SSL证书文件
try {
cer = certificateFactory.generateCertificate(inputStream);
LogManager.i(TAG, cer.getPublicKey().toString());
} finally {
inputStream.close();
} //创建一个证书库,并将证书导入证书库
keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(null, null); //双向验证时使用
keystore.setCertificateEntry("trust", cer); // 实例化信任库
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore); mSSLContext = SSLContext.getInstance("TLS");
mSSLContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); //信任所有证书 (官方不推荐使用)
// s_sSLContext.init(null, new TrustManager[]{new X509TrustManager() {
//
// @Override
// public X509Certificate[] getAcceptedIssuers() {
// return null;
// }
//
// @Override
// public void checkServerTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
//
// @Override
// public void checkClientTrusted(X509Certificate[] arg0, String arg1)
// throws CertificateException {
//
// }
// }}, new SecureRandom()); return mSSLContext; } catch (Exception e) {
e.printStackTrace();
}
return null;
}
} public static abstract class HttpCallback {
public abstract void onSucc(String result); public abstract void onfailed();
}

所谓的https协议本质上是看你如何产生SSLFactory

下面

xutils工具上传日志文件--使用https并且带进度条显示的更多相关文章

  1. xutils工具上传日志文件--后台服务器的搭建

    在上一篇文章中使用xutils将手机上保存的日志上传到后台服务器中,现在我们来讲后台服务器是如何搭建的 后台服务器采用jsp+sevlet+mysql的框架 首先讲mysql数据库的表的建立 在fil ...

  2. xutils工具上传日志文件

    首先下载xutils java包: 添加到项目的工程中: 第二在新建一个类继承application package logback.ecmapplication.cetcs.com.myapplic ...

  3. Azure IoT Hub 十分钟入门系列 (4)- 实现从设备上传日志文件/图片到 Azure Storage

    本文主要分享一个案例: 10分钟内通过Device SDK上传文件到IoTHub B站视频:https://www.bilibili.com/video/av90224073/ 本文主要有如下内容: ...

  4. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  5. flume 增量上传日志文件到HDFS中

    1.采集日志文件时一个很常见的现象 采集需求:比如业务系统使用log4j生成日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs中. 1.1.根据需求,首先定义一下3大要素: 采集源 ...

  6. Android使用HttpClient实现文件上传到PHP服务器,并监控进度条

    上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($ ...

  7. 两种方法上传本地文件到github

    https://www.jianshu.com/p/c70ca3a02087 自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的 ...

  8. 两种方法上传本地文件到github(转)

    自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的原因是我习惯本地编辑,完成以后再一起上传github.看过了几个教程,总结出最 ...

  9. Winform上传下载文件代码

    using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...

随机推荐

  1. CentOS8的网络管理变化

    资料来源: https://www.cnblogs.com/linuxandy/p/10839856.html 1.CentOS8使用NetworkManager.service(简称NM)来管理网络 ...

  2. VUE 子组件向父组件传值 , 并且触发父组件方法(函数)

    目标:封装一个  搜索组件 <子组件需要传一个或者多个搜索参数到父组件,然后父组件执行列表查询函数> 1.子组件 <div> <input v-model="l ...

  3. Java实现 蓝桥杯 算法训练 Number Challenge(暴力)

    试题 算法训练 Number Challenge 资源限制 时间限制:3.0s 内存限制:512.0MB 问题描述 定义d(n)为n的约数个数.现在,你有三个数a,b,c.你的任务是计算下面式子mod ...

  4. Java实现 LeetCode 462 最少移动次数使数组元素相等 II

    462. 最少移动次数使数组元素相等 II 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输 ...

  5. Java实现 蓝桥杯 算法训练 谁干的好事?

    试题 算法训练 谁干的好事? 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 ABCDE中num个人做了好事,truth个人说真话. A说:"我和X中有且只有一个做了好事& ...

  6. Java实现 蓝桥杯VIP 算法提高 班级排名

    算法提高 班级排名 时间限制:1.0s 内存限制:256.0MB 问题描述 达达在陶陶的影响下,也对学习慢慢的产生了兴趣. 他在每次考试之后,都会追着老师问,自己在班级的总名次是多少.考试一多,老师也 ...

  7. java实现圆周率与级数

    ** 圆周率与级数** 圆周率 我国古代数学家对圆周率方面的研究工作,成绩是突出的.三国时期的刘徽.南北朝时期的祖冲之都在这个领域取得过辉煌战绩. 有了计算机,圆周率的计算变得十分容易了.如今,人们创 ...

  8. (八)DVWA之SQL Injection--SQLMap&Burp测试(Medium)

    一.测试需求分析 测试对象:DVWA漏洞系统--SQL Injection模块--User ID提交功能 防御等级:Medium 测试目标:判断被测模块是否存在SQL注入漏洞,漏洞是否可利用,若可以则 ...

  9. Kubernetes内部域名解析的那些事儿

    前言 在kubernets环境中,服务发现大都是基于内部域名的方式.那么就涉及到内部域名的解析.从1.11版本开始,kubeadm已经使用第三方的CoreDNS替换官方的kubedns作为集群内部域名 ...

  10. mysqldump导出数据库

    问题描述:要将一个mysql中六个数据库导出来,使用mysqldump导出 mysqldump使用语法:mysqldump -uroot -p -S /data/mysql/db_itax_m/mys ...