美文网首页vapor 实践
vapor 安装包上传入库

vapor 安装包上传入库

作者: 搞好关系 | 来源:发表于2018-10-08 14:25 被阅读15次

以用户的邮箱作为依据上传安装包,并使用task对安装包进行解压然后抽取信息
1 先上上传文件代码然后分析

 public func upload( req: Request) -> EventLoopFuture<String>{
  
        do{
          return try req.content.decode(Upload.self).flatMap { (u) -> EventLoopFuture<String> in
            let upload: Upload = u
            //            let upload: Upload = try req.query.decode(Upload.self)
            
            return SKUser.query(on: req).filter(\.email
                , .equal
                , upload.email).first().flatMap({ (skUser) -> EventLoopFuture<String> in
                    
                    if let skUser = skUser {

                        let path =  try! req.sharedContainer.make(DirectoryConfig.self).workDir + "Public/"
                        let userFolder = u.email
                        do{
                            let fileManager = FileManager.default
                            if !fileManager.fileExists(atPath: path+userFolder) {
                                try fileManager.createDirectory(atPath: path+userFolder
                                    , withIntermediateDirectories: true
                                    , attributes: [:])
                            }
                            let userFileRelativePath = userFolder + "/\(Date().timeIntervalSince1970)" +  u.kind.type
                            let  filePath = path + userFileRelativePath
                            
                            try upload.file.write(to: URL(fileURLWithPath: filePath))
                            return  try ipaTool(req: req, ipaPath: filePath).flatMap({ (info) -> EventLoopFuture<String> in
                                let identifer =  (info["info"] as! Dictionary<String, Any>)["CFBundleIdentifier"] as! String
                             return   SKPackage.query(on: req).filter(\.identifer, .equal, identifer).first().flatMap({ (package) -> EventLoopFuture<String> in
                                    if let package = package {
                                        //存在package 则installpackage直接入库
                                        let relaticePath = userFileRelativePath
                                        let skInstallpackage: SKInstallPackage =  SKInstallPackage.init(id: nil, userId: skUser.id!, packageId: package.id!, addDate: Date().timeIntervalSince1970, relativePath: relaticePath)
                                        
                                        return  skInstallpackage.create(on: req).flatMap({ (innInstallPackage) -> EventLoopFuture<String> in
                                            let result = req.eventLoop.newPromise(String.self)
                                            
                                            result.succeed(result:  "\(innInstallPackage.owner) \(innInstallPackage.package.child.owner) \(innInstallPackage)" )
                                            return result.futureResult
                                        })
                                        
                                    }else{//不存在 则先package信息入库,然后installpackage入库
                                       return SKPackage(userId: skUser.id!, identifer: identifer, type: upload.kind).create(on: req).flatMap({ (p) -> EventLoopFuture<String> in
                                            
                                        let skInstallpackage: SKInstallPackage =  SKInstallPackage.init(id: nil, userId: skUser.id!, packageId: p.id!, addDate: Date().timeIntervalSince1970, relativePath: path)
                                      return  skInstallpackage.create(on: req).flatMap({ (sInstallPackage) -> EventLoopFuture<String> in
                                        let result = req.eventLoop.newPromise(String.self)
                                        
                                            result.succeed(result:  "\(skInstallpackage.owner) \(skInstallpackage.package)")
                                        return result.futureResult
                                        })
                                        })
                                        
                                    }
                                })
                                //文件解析信息
//                                print(info)
//                                result.succeed(result: "\(info)")
//                                return result.futureResult
                            })
                        } catch{
                            let result = req.eventLoop.newPromise(String.self)

                            result.fail(error: error)
                        }
                        
                    }else{
                        let result = req.eventLoop.newPromise(String.self)
                        result.succeed(result: "用户" + upload.email + "不存在")
                        return result.futureResult
                    }
                    let result = req.eventLoop.newPromise(String.self)
                    result.succeed(result: "这里是不走的地方")
return result.futureResult
                    
                })
            }
        }catch{
                    let result = req.eventLoop.newPromise(String.self)
                    result.fail(error: error)
                    return result.futureResult
        }
    }

2.大致流程分析
.检测用户是否存在
.接受上传文件并存储本地
.调用shell解压安装包并分析安装Info.plist
.包信息入库 安装资源包信息入库
3.使用task调用shell分析

public func ipaTool(req: Request, ipaPath path: String)throws -> EventLoopFuture<Dictionary<String, Any>>{
    //let path =  try req.sharedContainer.make(DirectoryConfig.self).workDir + "Public/s1538917708.271797.ipa"
    let currentTempDirFolder = NSTemporaryDirectory().appending(UUID.init().uuidString)
    
    
    let result = req.eventLoop.newPromise(Dictionary<String, Any>.self)
    
    let process: Process = Process.launchedProcess(launchPath: "/usr/bin/unzip"
        , arguments: ["-u", "-j", "-d", currentTempDirFolder, path, "Payload/*.app/embedded.mobileprovision", "Payload/*.app/Info.plist","*","-x", "*/*/*/*"])
    
    
    process.terminationHandler = {p in
        let status = p.terminationStatus
        
        if status == 0 {
            
            var provisionPath: String  = "\(currentTempDirFolder)".appending("/embedded.mobileprovision")
            
            let plistPath: String = "\(currentTempDirFolder)".appending("/Info.plist")
            do{
                let appPlist = try! Data.init(contentsOf: URL(fileURLWithPath: plistPath))
                let  appPropertyList: Dictionary<String,Any> = try PropertyListSerialization.propertyList(from: appPlist
                    , options: PropertyListSerialization.ReadOptions.mutableContainers
                    , format: nil) as! Dictionary
                
                let bundleExecutable = appPropertyList["CFBundleExecutable"] as! String
                
                let binaryPath = "\(currentTempDirFolder)/\(bundleExecutable)"
                if process.terminationReason == .exit{
                    print("结束🔚")
                }
                
                result.succeed(result: ["path":"\(currentTempDirFolder)".appending(bundleExecutable)+"\(appPropertyList)", "info": appPropertyList])
                
            }catch{
                result.fail(error: error)
            }
            
            
            //        result.succeed(result: "process succeeded\(currentTempDirFolder)")
            //        print("Task succeeded.\(currentTempDirFolder)")
        } else {
            result.succeed(result: [:])
            print("Task failed.")
        }
        
    }
    
    return result.futureResult
}

4.数据库入库结果


安装包入库结果
包信息入库结果

相关文章

  • vapor 安装包上传入库

    以用户的邮箱作为依据上传安装包,并使用task对安装包进行解压然后抽取信息1 先上上传文件代码然后分析 2.大致流...

  • ORACLE 11g 静默安装

    一、安装准备 0)上传安装包 上传安装包到 /db目录: 1)解压安装包 2)安装依赖 如果没有互联网环境无法使用...

  • Linux安装Maven

    1.下载并上传安装包 下载安装包apache-maven-3.6.1-bin.tar.gz:Maven官网下载上传...

  • centos上安装mongodb

    上传安装包到centos 下载centos上使用的mongodb安装包时,选择CommunityServer ->...

  • Linux上MySQL的安装与部署

    1. 上传安装包到Linux系统中 2. 将上传的mysql安装包移动到local目录中 3. 切换到local目...

  • Vapor 2.0 - 使用JSON(Using JSON)

    前往 Vapor 2.0 - 文档目录 用Vapor(With Vapor) 这个包在默认情况下被Vapor包含了...

  • vapor 文件上传大小限制

    vapor功能绝大多数是通过注册service来实现注入,而form表单系统有默认的最大上限:maxBodySiz...

  • vapor 用户订阅安装包(1)

    用户订阅安装包分为功能分为两步来开发:。1用户订阅对应包。2当订阅的安装包更新之后,自动发送email给订阅者,通...

  • PLSQL Developer及客户端安装

    安装包准备 首先要下载客户端,相关安装包。防止文章被锁,不再上传任何安装包,如需要安装包................

  • 07_hive_搭建_启动_使用

    [TOC] 1. 搭建hive 1.1 上传hive安装包 上传apache-hive-1.2.1-bin.tar...

网友评论

    本文标题:vapor 安装包上传入库

    本文链接:https://www.haomeiwen.com/subject/wmtjaftx.html