springboot 上传apk并得到包名、版本号等信息

创建一个解析apk的类GetApkInfo:

package com.m2m.management.utils;

import net.dongliu.apk.parser.ApkFile;
import net.dongliu.apk.parser.bean.ApkMeta;
import net.dongliu.apk.parser.bean.UseFeature;
import org.dom4j.Namespace;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class GetApkInfo {
    private static final Logger logger = LoggerFactory.getLogger(GetApkInfo.class);
    private static final Namespace NS = Namespace.get("http://schemas.android.com/apk/res/android");

    public static Map<String, Object> readApk(File apkUrl) {
        Map<String, Object> resMap = new HashMap<String, Object>();
        try (ApkFile apkFile = new ApkFile(apkUrl)) {
            ApkMeta apkMeta = apkFile.getApkMeta();
            resMap.put("filename", apkMeta.getName());
            resMap.put("pkgname", apkMeta.getPackageName());
            resMap.put("versioncode", apkMeta.getVersionCode());
            resMap.put("versionname", apkMeta.getVersionName());
            for (UseFeature feature : apkMeta.getUsesFeatures()) {
                System.out.println(feature.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resMap;
    }
}

然后在controller中调用该类:

@RequestMapping(value = "/repoapps", method = RequestMethod.POST)
    public ResponseEntity<Void> createRepoApps(
            @RequestParam("file") MultipartFile file,
            HttpServletRequest req
            ){
        try{
            File convFile = new File(     
            System.getProperty("java.io.tmpdir")+"/"+file.getOriginalFilename());
            Map<String, Object> apkInfo =  GetApkInfo.readApk(convFile);
            String filename = apkInfo.get("filename").toString();
            String pkgname = apkInfo.get("pkgname").toString();
            logger.info(pkgname);
            String versioncode = apkInfo.get("versioncode").toString();
            String versionname = apkInfo.get("versionname").toString();
            RepoApps repoApps = new RepoApps(filename, pkgname, versioncode, versionname);
            repoApps.setDescription(req.getParameter("description"));
            repoApps.setLicense(req.getParameter("license"));
            repoApps.setSummary(req.getParameter("summary"));
            repoApps.setWebsit(req.getParameter("website"));
            Optional<Repo> oprepo = repoService.findById(Long.parseLong(req.getParameter("rid")));
            repoApps.setRepo(oprepo.get());
            repoAppsService.save(repoApps);
            return new ResponseEntity(response.success(), HttpStatus.OK);
        }catch (NoSuchElementException e){
            logger.error(e.getMessage());
            return new ResponseEntity(response.error("rid is error"), HttpStatus.NOT_FOUND);
        }catch(Exception e){
            logger.error(e.getMessage());
            return new ResponseEntity(response.error("server error"), HttpStatus.INTERNAL_SERVER_ERROR);
        }


    }

相关知识总结:

1、其中MultipartFile类中还有很多好用的方法:

使用getSize()方法获得文件长度,以此决定允许上传的文件大小。

使用isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。

使用getInputStream()方法将文件读取为java.io.InputStream流对象。

使用getContentType()方法获得文件类型,以此决定允许上传的文件类型。

使用transferTo(dest)方法将上传文件写到服务器上指定的文件。

2、System.getProperty("java.io.tmpdir")用来获得服务器的临时目录,当前端发送文件时服务器会将文件先存到临时目录中。所以当处理前端传的文件时,要在文件名前面加上System.getProperty("java.io.tmpdir")来拼接。

System.getProperty("java.io.tmpdir") 是获取操作系统的缓存临时目录

在windows7中的目录是:

C:\Users\登录用户~1\AppData\Local\Temp\

在linux下的目录是:

/tmp

可以获取系统的配置信息,下面说一下System.getProperty()的参数有那些:

java.versionJava运行时环境版本
java.vendorJava运行时环境供应商
java.vendor.urlJava供应商的 URL
java.homeJava安装目录
java.vm.specification.versionJava虚拟机规范版本
java.vm.specification.vendorJava虚拟机规范供应商
java.vm.specification.nameJava虚拟机规范名称
java.vm.versionJava虚拟机实现版本
java.vm.vendorJava虚拟机实现供应商
java.vm.nameJava虚拟机实现名称
java.specification.versionJava运行时环境规范版本
java.specification.vendorJava运行时环境规范供应商
java.specification.nameJava运行时环境规范名称
java.class.versionJava类格式版本号
java.class.pathJava类路径
java.library.path加载库时搜索的路径列表
java.io.tmpdir默认的临时文件路径
java.compiler要使用的 JIT 编译器的名称
java.ext.dirs一个或多个扩展目录的路径
os.name操作系统的名称
os.arch操作系统的架构
os.version操作系统的版本
file.separator文件分隔符(在 UNIX 系统中是“/”)
path.separator路径分隔符(在 UNIX 系统中是“:”)
line.separator行分隔符(在 UNIX 系统中是“/n”)
user.name用户的账户名称
user.home用户的主目录
user.dir用户的当前工作目录
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要获取服务器上的APK版本,你需要使用一个网络请求库(如OkHttp)来从服务器获取APK的相关信息(如版本号包名等)。获取APK的图标需要使用Android的PackageManager类,而且只能在APK安装后才能获取。以下是获取未安装APK信息的方法: 1. 获取APK文件的路径 可以通过网络请求库从服务器获取APK文件的URL,然后使用URL类获取APK文件的InputStream流。然后,将InputStream流写入本地文件中,并且获取该文件的路径。 2. 获取APK的PackageInfo 获取未安装APK的PackageInfo需要使用PackageManager类。可以使用以下代码: ``` PackageManager pm = context.getPackageManager(); PackageInfo info = pm.getPackageArchiveInfo(apkFilePath, 0); ``` 其中,apkFilePath是APK文件的路径。 3. 获取APK的图标 获取未安装APK的图标需要使用PackageManager类。可以使用以下代码: ``` Drawable icon = pm.getApplicationIcon(info.applicationInfo); ``` 其中,info是通过PackageManager获取的PackageInfo对象。 4. 获取APK版本号包名 获取未安装APK版本号包名也需要使用PackageManager类。可以使用以下代码: ``` String packageName = info.packageName; String versionName = info.versionName; int versionCode = info.versionCode; ``` 其中,info是通过PackageManager获取的PackageInfo对象。 注意:以上代码需要在Android的主线程中执行。如果需要在子线程中执行,可以使用Handler或AsyncTask等方法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值