Bootstrap

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用户的当前工作目录
;