创建一个解析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.version | Java运行时环境版本 |
java.vendor | Java运行时环境供应商 |
java.vendor.url | Java供应商的 URL |
java.home | Java安装目录 |
java.vm.specification.version | Java虚拟机规范版本 |
java.vm.specification.vendor | Java虚拟机规范供应商 |
java.vm.specification.name | Java虚拟机规范名称 |
java.vm.version | Java虚拟机实现版本 |
java.vm.vendor | Java虚拟机实现供应商 |
java.vm.name | Java虚拟机实现名称 |
java.specification.version | Java运行时环境规范版本 |
java.specification.vendor | Java运行时环境规范供应商 |
java.specification.name | Java运行时环境规范名称 |
java.class.version | Java类格式版本号 |
java.class.path | Java类路径 |
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 | 用户的当前工作目录 |