安卓手机扫二维码从FTP服务器下载apk

Devops平台的APP下载页面:

Linux服务器的FTP目录下的apk包:

Controller层:

 /*** getFtpApk:安卓下载FTP上的apk* @author liuyongzhan* @param proSysEnv 主体-业务系统-环境* @param apkPath 版本/apk文件名称* @param request* @param response InputStream*/@ApiOperation(value = "安卓下载FTP上的apk", notes = "")@RequestMapping(value = { "getFtpApk" }, method = RequestMethod.GET)public void getFtpApk(String proSysEnv,String apkPath,String currentLoginName,HttpServletRequest request,HttpServletResponse response) {String userName = currentLoginName;InputStream ins = null;try {Map map = appDownloadService.getFtpClient();FtpUtilForDownLoad ftpDl = (FtpUtilForDownLoad) map.get("FtpUtilForDownLoad");FTPClient ftp = (FTPClient) map.get("FTPClient");String ftpPath = (String) map.get("ftpPath");int apkSize = appDownloadService.getFtpFileSize(proSysEnv,apkPath,ftpDl,ftp,ftpPath);ins = appDownloadService.getFtpApk(proSysEnv,apkPath,ftpDl,ftp,ftpPath);String[] apkPathArr = apkPath.split("/");String fileName = apkPathArr[1];// 初始化文件流,提供客户端下载BufferedInputStream bins = new BufferedInputStream(ins);//放到缓冲流里面OutputStream outs = response.getOutputStream();//获取文件输出IO流BufferedOutputStream bouts = new BufferedOutputStream(outs);response.setContentType("application/vnd.android.package-archive");//设置response内容的类型 下载安卓应用apkresponse.setContentLength(apkSize);//设置文件大小response.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));//设置头部信息int bytesRead = 0;byte[] buffer = new byte[8192];//这个取决于硬盘的扇区大小是512byte/sec;8192/512 = 16,表明写入了16扇区。//开始向网络传输文件流while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {bouts.write(buffer, 0, bytesRead);}bouts.flush();//这里一定要调用flush()方法ins.close();bins.close();outs.close();bouts.close();} catch (Exception e) {logger.error("账号:"+userName+",安卓下载FTP上的apk异常,"+e.getMessage());logRunService.addLogRun(Module.MODULE_PUBLISH, "平台", 2, "安卓下载FTP上的apk异常",LogFileName.MODULE_PUBLISH);}}

ServiceImpl层:

 /*** 获取FtpUtilForDownLoad和FTPClient对象* @see service.publish.AppDownloadService#getFtpClient()*/@Overridepublic Map getFtpClient() throws Exception {Map resMap = new HashMap();int ftpPort = 21;String ftpIp = "10.10.101.111";String ftpUser = "admin";String ftpPwd = "admin123";String ftpPath ="/opt/vftp/";FtpUtilForDownLoad ftpDl = new FtpUtilForDownLoad();FTPClient ftp = ftpDl.connectFTP(ftpIp,ftpPort,ftpUser,ftpPwd);resMap.put("FtpUtilForDownLoad", ftpDl);resMap.put("FTPClient", ftp);resMap.put("ftpPath", ftpPath);return resMap;}/*** 获取ftp文件的size*/@Overridepublic int getFtpFileSize(String proSysEnv, String apkPath,FtpUtilForDownLoad ftpDl,FTPClient ftp,String ftpPath) throws Exception {String arr[] = proSysEnv.split("-");String[] apkPathArr = apkPath.split("/");String fileName = apkPathArr[1];String ftpApkPath = ftpPath+arr[0]+"_"+arr[1]+"/"+arr[0]+"_"+arr[1]+"_"+arr[2]+"/"+apkPathArr[0]+"/program/program/"+fileName;int apkSize = ftpDl.getFtpFileSize(ftpApkPath, ftp);return apkSize;}/*** 获取ftp文件的InputStream*/@Overridepublic InputStream getFtpApk(String proSysEnv, String apkPath,FtpUtilForDownLoad ftpDl,FTPClient ftp,String ftpPath) throws Exception {String arr[] = proSysEnv.split("-");String[] apkPathArr = apkPath.split("/");String fileName = apkPathArr[1];String ftpApkPath = ftpPath+arr[0]+"_"+arr[1]+"/"+arr[0]+"_"+arr[1]+"_"+arr[2]+"/"+apkPathArr[0]+"/program/program/"+fileName;InputStream ins = ftpDl.getFtpFileInputStream(ftpApkPath,ftp);return ins;}

FTP工具类:

package com.devops.plugins.ftp;import java.io.IOException;
import java.io.InputStream;import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;public class FtpUtilForDownLoad {/*** connectFTP: 连接ftp* @author liuyongzhan* @param url 必须是IP地址, 否则提示异常* @param port 端口* @param username ftp用户* @param password ftp密码* @return FtpClient*/public FTPClient connectFTP(String url, int port, String username, String password) {  FTPClient ftpClient = new FTPClient();try {ftpClient.connect(url,port);ftpClient.login(username, password);} catch (IOException e) {e.printStackTrace();} return ftpClient;  }  /*** getFtpFileInputStream:获取文件的InputStream* @author liuyongzhan* @param ftpFile ftp上文件的路径* @param ftp FtpClient对象* @return InputStream 文件的InputStream* @throws Exception*/public InputStream getFtpFileInputStream(String ftpFile,FTPClient ftp) throws Exception {  InputStream is = null;ftp.setBufferSize(1024);//设置文件类型(二进制)ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//      if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
//          ftpClient.setControlEncoding("UTF-8");
//      }String fileName = new String(ftpFile.getBytes("utf-8"), "iso-8859-1");is = ftp.retrieveFileStream(fileName);return is;}/*** getFtpFileSize:获取文件的大小* @author liuyongzhan* @param ftpFile ftp上文件的路径* @param ftp FtpClient对象* @return int 文件的大小* @throws Exception*/public int getFtpFileSize(String ftpFile,FTPClient ftp) throws Exception {String fileName = new String(ftpFile.getBytes("utf-8"), "iso-8859-1");FTPFile[] files = ftp.listFiles(fileName);long aSize = files[0].getSize();int apkSize = new Long(aSize).intValue();return apkSize;}public static void main(String[] args) {FtpUtilForDownLoad ftpDl = new FtpUtilForDownLoad();FTPClient ftp = ftpDl.connectFTP("10.10.101.111", 21, "admin", "admin123");String ftpPath = "/opt/vftp/ftp1_sysftp/ftp1_sysftp_DEV/201710111837/program/program/中文.apk";try {
//          ftpDl.getFtpFileInputStream(ftpPath, ftp);ftpDl.getFtpFileSize(ftpPath, ftp);} catch (Exception e) {e.printStackTrace();}}
}

Js:

 /*** 生成下载地址的二维码*/
show:function (obj,apkPath) {var curWwwPath=window.document.location.href;      //获取主机地址之后的目录,如: uimcardprj/share/meun.jsp      var pathName=window.document.location.pathname;      var pos=curWwwPath.indexOf(pathName);      //获取主机地址,如: http://localhost:8083      var localhostPaht=curWwwPath.substring(0,pos);      //获取带"/"的项目名,如:/uimcardprj      var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1); var projectPath = localhostPaht+projectName;//项目路径var ftpPath = projectPath+"/appDownload/getFtpApk.do?proSysEnv="+keys+"&apkPath="+apkPath+"&currentLoginName="+currentLoginName;$("#code").empty();var path = $.APPDownload.utf16to8(ftpPath);var aPath =  path.replace(/\s/g, "%20");$("#code").qrcode({
//      render: "table", //table方式 correctLevel:0,width: 230, //宽度 height:230, //高度 text:aPath});$("#del_modal").modal({backdrop: 'static', keyboard: false},"show");
},/*** 转码*/
utf16to8:function (str) {  var out, i, len, c;  out = "";  len = str.length;  for(i = 0; i < len; i++) {  c = str.charCodeAt(i);  if ((c >= 0x0001) && (c <= 0x007F)) {  out += str.charAt(i);  } else if (c > 0x07FF) {  out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));  out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));  out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));  } else {  out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));  out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));  }  }  return out;
},/*** 隐藏二维码*/
hide:function (obj) {var objDiv = $("#code");$(objDiv).css("display", "none");
}

安卓手机扫二维码从FTP服务器下载apk相关推荐

  1. 【生活小捣鼓】登录PC端某网站,需要他人(不在身边)手机扫二维码,这时候该怎么办?

    首先要区分两个概念:[二维码扫描]和[二维码识别],扫描是在摄像头对二维码图片的录入下完成的,识别是只需要一台手机进行自我识别完成的. 以前登录微信公众号,不是管理者也可以.在输入账号密码后,把登录的 ...

  2. 物联网开发笔记(31)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(1)

    一.目的 我们分3节讲述远程控制.这一节在我们的240x240的oled屏幕上显示二维码,然后用手机扫二维码,从开发板的TCP服务器上返回字符串. 二.环境 ESP32 + 240x240的oled彩 ...

  3. 物联网开发笔记(32)- 使用Micropython开发ESP32开发板之手机扫二维码远程控制开关灯(2)

    一.目的 上一节我们测试了远程控制的环境是好的,这一节在我们的240x240的oled屏幕上显示二维码,然后用手机扫二维码,远程控制LED灯的状态. 二.环境 ESP32 + 240x240的oled ...

  4. java实现手机扫二维码登陆

    实现流程: pc端: 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事 a:生成随机的uuid,是 ...

  5. iOS和安卓共用同一个二维码实现跳转下载链接

    最近看到一篇文章介绍如何实现,ios和android 使用同一个二维码自动实现跳转下载链接:最近公司项目正好也遇到了同样需求,在此笔记一下: 希望iOS和安卓使用一个二维码,让扫描的机器自己识别操作系 ...

  6. 手机扫二维码登录是怎么实现的?

    扫码登录完整流程: ①用户 A 访问微信网页版,微信服务器为这个会话生成一个全局唯一的 ID,上面的 URL 中 obsbQ-Dzag== 就是这个 ID,此时系统并不知道访问者是谁: ②用户A打开自 ...

  7. 如何用手机扫二维码盘点海量固定资产?

    今天跟大家分享如何用手机去快速地盘点海量固定资产. 第一步,将固定资产批量导入到易点易动固定资产管理系统中后,选择一个二维码或条形码的标签模板,将固定资产标签批量打印出来,贴到对应的固定资产上. 第二 ...

  8. 如何让手机扫二维码就能阅读PDF

    有时候我们需要将PDF转换为二维码,方便别人扫一扫就能进行阅读 首先我们打开maipdf的网站,因为市场上做pdf安全分析的网站非常少,所以建议使用maipdf 打开网站之后,选择您需要分享的pdf文 ...

  9. 调用手机扫二维码 并且识别其信息

    A页面调用B页面 B页面是扫描页面 需要在A页面中引用mui.css 和 mui.js A页面 <img src="../images/scanning.png" class ...

最新文章

  1. fopen 中 按文本读写与按二进制读写 实例
  2. 为什么《30天自制操作系统》封面中的猫是两只尾巴
  3. 机器学习可解释性工具箱XAI
  4. 题目1170:找最小数
  5. apc220使用心得
  6. php_mvc实现步骤五
  7. java连接并操作redis_java 使用 jedis 连接 redis 并进行简单操作
  8. SQL 基础之管理方案对象(十七)
  9. Windows下Git的下载与安装
  10. python菜鸟教程100例-Python 练习实例1
  11. python大文件去重_python大ip文件排重
  12. Android Theme主题继承(SDK下主题和v7包下主题)
  13. 高通qxdm抓取sensor的log【学习笔记】
  14. IOUtils快速进行内容复制与常用方法
  15. 计算机系统与itunes不兼容,解决XP系统安装iTunes的要求更改更高版本的不兼容情况...
  16. codeblocks安装教程和文件的简单创建方法
  17. 阿里云 maven 镜像地址
  18. Windows XP SP3英文版镜像
  19. Python 微信机器人
  20. 第十二届蓝桥杯大赛软件赛省赛 Python 大学 A 组 部分试题与解析

热门文章

  1. 360网站卫士 PHP-DOS攻击脚本专杀工具使用笔记
  2. 用5v1a的充电器给1.2v的镍氢电池充电(充满后可自动断电)或者可以定时
  3. 世界星载SAR发展2——SeaSat(1978,美国)
  4. 关于显卡PCIE3.0 X16 X8 X4 X1速度的测试
  5. 代理方式部署NER标注平台doccano
  6. Legolas工业自动化平台案例 —— 水源地自动化监控系统
  7. 电力圈大佬再次“华山论剑”:如何构建以新能源为主体的新型电力系统?
  8. java玩gbc,GB也有相当严谨的格斗游戏。GBC少年街霸2.让我稍微惊喜了一下。
  9. 织梦教程新建ID丨重置栏目ID丨文章ID不从1开始的解决方法
  10. k8s镜像一直failed pull images