编辑代码

# encoding:utf-8
import request 
import base64
''''
车型识别
''''
request_url ="https://aip.baidubce.com/rest/2.0/image-classify/vl/ car"
# 二进制方式打开图片文件
f = open('[本地文件]','rb')
img = base64.b64encode(f.read())
params = {"image":img, "top num":5}
access_token = '[调用鉴权接口获取的 token]'
request_url = request_url + "?access token=" + access_token
headers = ('content-type': 'application/x-www-form-urlencoded' }
response = requests.post(request_url, data=params, headers=headers) 
if response:
print (response.json())
返回的JSON 数据:
{
     "log id": 4086212218842203806,
     "location result": {
         "width": 447,"top":226,"height": 209,"left":188
    },
    "result": [{
        "baike info":{
            "baike url":"http://baike.baidu.com/item/8E58B88838E588A8A08E88BF8AAChiron/20419512",
            "description": "布加迪Chiron是法国跑车品牌布加迪出品的豪华超跑车。配置四涡轮增压发动机,420公里每小时,有23种颜色的选择,售价高达260万美元。”
        },
        "score": 0.98793351650238,
        "name":"布加迪Chiron",
        "year":"无年份信息"
        },
        {
            "score":0.0021970034576952,
            "name":“奥迪 RS5", 
            "year":"2011-2017"
        },
        "score":0.0021096928976476,
        "name":"奥迪RS4",
        "year":"无年份信息"
        },
        {
            "score":0.0015581247862428,
            "name":"奥迪 RS7",
            "year":"2014-2016"
        },
        {
            "score":0.00082337751518935,
            "name":"布加迪威航",
            "year":"2004-2015"}],
            "color_result":"颜色无法识别"
            }


# news.js
let Mock = require('mockjs'); 
let Random = Mock.Random;
module.exports = function() {
    var data = {
        news:[]
    };
    var images = [1,2,3].map(x => Random.image('200x100',Random.color(),Random.word(2,6)));
    for (var i = 0; i < 100; i++) {
        var content = Random.cparagraph(0,10); 
        data.news.push({
            id:i,
            title : Random.cword(8,20), 
            desc : content.substr(0,40), 
            tag : Random.cword(2,6),
            views : Random.integer(100,5000),
            images : images.slice(0,Random.integer(1,3))
        })
    }
    return data
}

import UIKit
import Foundation

//url为MOCKMOCK服务器的网址
if let url =URL(string:"http://localhost:3004/news") {
    URLSession.shared.dataTask(with:url) { (data,response,error) in if error != nil {
        print("Network errors")
    }
    else {
        let rs= String(data: data!,encoding: String.Encoding.utf8)! 
        print(rs)
        if let json = try? JSONSerialization.jsonObject(with: data!, options:.allowFragments) {
            print(json)
        }
    }
    .resume()
}


func sessionGetData(){
    //创建URL对象
    let urlString = "http://www.tuling123.com/" 
    let url = URL(stringurlString)
    //创建请求对象
    let request = URLRequest(url:url!)
    let session = URLSession.shared
    let dataTask = session.dataTask(with:request,completionHandler: ((data, response, error) -> Void in if error ! = nil{
        print(error.debugDescription)
    }
    else{
        let str = String(data: data!,encoding:String.Encoding.utf8)
        print(str!)
        }
}) as URLSessionTask
//使用resume方法启动任务 
dataTask.resume()
}

func sessionDownloadImage() { 
    //下载地址
    let url = URL(string: "http://hangge.com/blog/images/logo.png”)
    //请求
    let request = URLRequest(url: url!)
    let session = URLSession.shared
    //下载任务
    let downloadTask = session.downloadTask(with: request,
                                       completionHandler:{
(location:URL?,response:URLResponse?,error:Error?)
                                            ->Void in
                //输出下载文件原来的存放目录
                print("location:\(String(describing: location))")
                //location位置转换
                let locationPath = location?.path
                //获取当前时间
                let now = NSDate()
                //当前时间的时间戳
                let timeInterval:TimeInterval = now.timeIntervalsince1970 
                let timeStamp = String(timeInterval)
                //拷贝到用户目录
                let documents:String = NSHomeDirectory() + "/Documents/\(timeStamp).png"
                //创建文件管理器
                let fileManager = FileManager.default
                try! fileManager.moveItem(atPath: locationPath!, toPath:documents)
                print("new location:\(documents)")
                })
                //使用resume方法启动任务 
                downloadTask.resume()
            }



<?php
/** php 接收流文件
* @param String$file 接收后保存的文件名
* @return boolean
*/
function receiveStreamFile($receiveFile){
    $streamData = isset($GLOBALS['HTTP RAW POST DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] :'';
    if(empty($streamData)) {
        $streamData = file_get_contents('php://input');
        }
        if($streamData!='') {
            $ret = file_put_contents($receiveFile, $streamData, true);
            }else{
                $ret = false;
            }
            return $ret;
}
//定义服务器存储路径和文件名
$receiveFile = $ SERVER["DOCUMENT ROOT"]."/uploadFiles/swift.png"; 
echo $receiveFile;
$ret= receiveStreamFile($receiveFile);
echo json encode(array('success'=>(bool)$ret));
?>

func sessionUploadPhp(){
    //上传地址
    let url = URL(string: "http://localhost/uploadSwift.php")
    //1.创建会话对象
    let session = URLSession.shared
    //请求
    var request = URLRequest(url: url!,cachePolicy:.reloadIgnoringCacheData) 
    request.httpMethod = "POST"
    //上传数据流
    let fileImage = Bundle.main.path(forResource: "beel", ofType: "png") 
    let imgData = try! Data(contentsOf: URL(fileURLWithPath:fileImage!))
    let uploadTask = session.uploadTask(with: request as URLRequest, from:imgData) { 
        (data:Data?, response:URLResponse?, error:Error?) -> Void in
        //上传完毕后
        if error != nil {
            print(error!) 
            }else{
                let str = String(data: data!, encoding: String.Encoding.utf8) 
                print("上传完毕:\(String(describing:str))")
            }
    }
    //使用resume方法启动任务 
    uploadTask.resume()
}



import UIKit
import Foundation
let API_Key = "EIpA1hdD7i5152EsiNqpUOF"
let Secret_Key = "p8EZWg4agjDOxABmKvBYSNyZ1YzGFqb_"
let token_host = "https://aip.baidubce.com/oauth/2.0/token?grant pemclient_credentials&client_id=\(API_Key) &client_secret=\ (Secret Key)"
var access_token =""
var expires_in :Int32 = 0
if let url = URL(string: token host) {
    RLSession.shared.dataTask(with: url) { (data,response,error) in
    if error != nil {
        print ("network error")
        else {
            if let json mtry? JSONSerialization.jsonObject(with: data!,options:.allowFragments) as? [String :Any] {
                access_token = json["access token"] as! String 
                expires_in = json["expires in"] as! Int32 
                print("--------access_token------") 
                print(access_token)
                print("--------expires time------") 
                print(expires in)
            }
        }
    }
    .resume ()
}
else {
    print("url error")
}

//以文本或者二进制方式读入源程序文件的Loader 
public struct Loader{
    static func readTxt(file url:URL) -> String? {
        do {
            let source = try String(contentsOf: url) 
            return source
        }
        catch {
            return nil
        }
        static func readBin(file url:URL) -> Data? {
            do {
                let data = try Data(contentsOf: url) 
                return data
            }
            catch {
                return nil
            }
        }
    }
}

//Resources中的文件,并把路径转化为URL
let path = Bundle.main.path(forResource:"qrcar.jpg", ofType: nil) 
let url = URL(fileURLWithPath: path!)
let data = Loader.readBin(file: url)
if(data == nil) {
    print("File failed to load")
}
let data_base64_str = data?.base64Encodedstring() 
let data_base64 = data?.base64EncodedData()
access_token = "24.2ec96a68f74a8429b0f07869929413ae25920001598921312.282335-21737249"
let carType_host = "https://aip.baidubce.com/rest/2.0/image-classify/v1/ car" + "?access token=" + "\(access_token)"
if let url = URL(string: carType_host) {
    var request = URLRequest(url:url)
    request.setValue("application/x-www-form-urlencoded",forHTTPHeaderField:"Content-Type")
    request.httpMethod = "POST"
    let csmNSCharacterSet(charactersIn:"/=+号").inverted
    let image_urlEncode = data base64 str!.addingPercentEncoding(withAllowedCharacters:cs)
    let postString ="image=\(image urlEncode!)&top num=5&baike num-1"
    request.httpBody = postString.data(using: .utf8)
    URLSession.shared.dataTask(with:request){ (data,response,error)in if error != nil {
        print("error")
    }
    else {
        let rs = String(data: data!,encoding:String.Encoding.utf8) print(rs!)
    }
}
.resume()
}

{ 
    "log id": 4368540366187197442,
    "location result":
    {
        "width": 386.4585876464844,
        "top":81.3405532836914,
        "height":183.9795532226562,
        "left":58.03330230712891
    },
    "result":
    [ 
        {
            "score":0.9767324924468994,
            "year":"2014-2017",
            "baike_info":
            {
              "baike_url": "/item/%E5%A5%87%E7%91%9EE5/4714",
              "image_url":
                  "/pic/5882b2b7d0a20cf47a91d7777c094b36acaf9910",
              "description":  
                  "2014 款奇瑞 E5 是国内科技家轿的引领者,带领消费者悦享领先科技。"},
            "name":"奇瑞E5"
            },
            {
                "score":0.007103727199137211,
                "name":"奇瑞旗云",
                "year":"2010-2013"
            },
            {
                "score":0.003686367534101009,
                "name":"奇瑞艾瑞泽 7",
                "year":"2016-2017"
            },
            { 
                "score":0.001757977530360222,
                "name":"奇瑞E3",
                "year":"2015-2017"
            },
            {
                "score":0.001047104829922318,
                "name":"奇瑞A5",
                "year":"2015"
            }
        ],
        "color result":"黑色"
}



//
// ViewController.swift
// CameraUsage
//
// Created by Zhifeng Chen on 2020/8/2.
// Copyright @ 2020 Zhifeng Chen. All rights reserved.
//
import UIKit
class ViewController: UIViewController ,UINavigationControllerDelegate,UIImagePickerControllerDelegate {
    //设置图像显示用的Outlet,就是变量carImageView
    @IBOutlet weak var carImageView: UIImageView!
    //设置Action,由相册按钮事件触发
    @IBAction func onLibrary(_ sender: UIButton) {
        //设置相册拍照的控制器
        let vc = UIImagePickerController()
        //设置为相册
        vc.sourceType = .photoLibrary 
        vc.allowsEditing = true 
        vc.delegate = self
        present(vc, animated: true)
        //设置Action,由拍照按钮事件触发
        @IBAction func onCamera(_ sender: UIButton) {
            let vc = UIImagePickerController()
            //设置为摄像头
            vc.sourceType = .camera 
            vc.allowsEditing = true 
            vc.delegate = self present(vc, animated: true)
        }
        //相册获取图片需要调用的Delegate
        func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
            picker.dismiss(animated: true)
            guard let image = info[.editedImage] as? UIImage 
            else {
                return
            }
            //将相册图片显示在carImageView中 
            carImageView.image = image
        }
    }


//
// ViewController.swift
// CameraUsage
//
// Created by Zhifeng Chen on 2020/8/2.
// Copyright 0 2020 Zhifeng Chen. All rights reserved.
//

import UIKit
class ViewController: UIViewController ,UINavigationControllerDelegate,UIImagePickerControllerDelegate{
    //设置围像显示用的Outlet,就是变量carImageview
    @IBOutlet weak var carImageView: UIImageview!
    //显示识别出来的车辆名称型号
    @IBOutlet weak var carName: UILabel!
    //显示该车辆百度百科里面的简介
    @IBOutlet weak var carDetails: UILabel!
    //设置Action,由相册按钮事件触发
    @IBAction func onLibrary(_sender; UIButton) {
        //设置相册拍照的控制器
        let vc = UIImagePickerController()
        //设置为相册
        vc.sourceType = .photoLibrary 
        vc.allowsEditing = true 
        vc.delegate = self
        present(vc, animated: true)
        //设置Action,由拍照按钮事件触发
        @IBAction func onCamera( sender: UIButton) {
            let vc = UIImagePickerController()
            //设置为摄像头
            vc.sourceType = .camera 
            vc.allowsEditing = true 
            vc.delegate = self
            present(vc, animated: true)
            //相册获取图片需要调用的Delegate
            uncimagepickerController(_ picker: UIImagePickerController, dFinishPickingMediaWithInfo info:[UIImagePickerController.InfoKey :Any]) {
                picker.dismiss(animated: true)
                guard let image = info[.editedImage] as? UIImage 
                else {
                    return
                }
                //将相册图片显示在carImageView中 
                carImageView.image = image
                //获得百度AI平台的 access_token
                let access_token = get baidu token() 
                if access token == "" {
                    return
                }
                else {
                    //从百度AI 获得车型信息
                    get_car_type(access_token: access_token)
                }
                //传入有效的access_token,上传图片,获得车型信息 
                func get_car type(access token; String) {
                    //获取显示的图片,并保存为jpg格式 
                    let image = carImageView.image
                    //let data = UIImagePNGRepresentation(image)
                    guard let data = image!.jpegData(compressionQuality: 0.5) 
                    else {
                        return
                    }
                    //将图片进行base64编码
                    let data_base64_str = data.base64Encodedstring()
                    //准备好获取车型的API的URL的字符串
                    let carType host = "https://aip.baidubce.com/rest/2.0/image-classify/vl/car" + "?access token=" + "\(access token)"
                    //从字符串转换为URL
                    if let url = URL(string: carType host) {
                        //从URL生成URLRequest
                        var request = URLRequest(url:url)
                        //设置HTTP HEADER中的Content-Type为application/x-www-form-urlencoded
                        request.setValue("application/x-www-form-urlencoded",forHTTPHeaderField:"Content-Type")
                        //设置为POST方法
                        request.httpMethod = "POST"
                        //将图片文件进行urlencode转码
                        let cs = NSCharacterSet(charactersIn: "/=+%").inverted
                        let image_urlEncode = data _base64_str.addingPercentEncoding(withAllowedCharacters: cs
                        //合并三个参数为一个字符串
                        let postString = "image=\(image_urlEncode!) &top_num=5&baike num=l"
                        //将字符串转为UTF8类型的数据
                        request.httpBody = postString.data(using: utf)
                        //URLSession调用
                        URLSession.shared.dataTask(with; request){ (data,response, error) in
                        if error != nil { 
                            print("error")
                        }
                        else { 
                            if let json = try? JSONSerialization,jsonObject(with:data!, options: .allowFragments) as? [String : Any]
                            let result = json("result"l as! Array<Dictionary<Any>>
                            let name = result[0]["name"] as! String
                            var description = "非车类" 
                            if name != "非车类" {
                                let baike_info = result[0]["baike info") as! Dictionary<String,String>
                                if let details = baike info["description"]  { 
                                    description = details
                                }
                                else{
                                    description = "百度百科无此车资料"
                                }
                                //转入主线程
                                DispatchQueue.main.async { 
                                    self.carDetails.textm = description 
                                    self.carNametext = name
                                }
                            }
                        }
                    
                    }
                    .resume()
                }
            }
            //以信号量方式等待网络结果返回access_token,如果没有成功,则返回"" 
            func get_baidu_token()-> String {
                let API_Key = "EIpAlhdD7i5152EsiNqpU0F1"
                let Secret_Key = "p8EZWg4agjDOxABmKvBYSNyZ1YzGFgbm"
                let token_host="https://aip.baidubce.com/oauth/2.0/token?grant_ient_credentialssclient_id-\(API_Key)&client_secret-\(Secret Key)"
                var access token=""
                //设置信号量
                let semaphore: DispatchSemaphore = DispatchSemaphore(value:0)
if let url= URListring:token host) { 
    URLSession.shared.dataTask(with; url) { (data, response, error) in
    if error != nil {
        print("network error")
    }
    else {
        if let json = try? JSONSerializationjsonObject(with:data!,options:allowFragments)as? [String :Any] {
            access_token = json["access_token"l as! String
        }
        //发出信号量
        semaphore.signal()
    }
    .resume()
    }
    else {
        print("url error")
    }
    //等待信号量
    semaphore.wait()
    return access_token
    }
}