热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot项目H5界面手机拍照调用腾讯云OCR卡证识别接口完整例子

最近一个微信端项目的功能涉及一个手机拍照上传身份证识别身份证信息回显的功能,调用的接口是腾讯云OCR的卡证识别功能。看了腾讯云的api通俗易懂,本地写好

最近一个微信端项目的功能涉及一个手机拍照上传身份证识别身份证信息回显的功能,调用的接口是腾讯云OCR的卡证识别功能。看了腾讯云的api通俗易懂,本地写好了demo测试可用。H5界面手机拍照调用后台方法保存身份证照片进行识别也可用,难度就在于后台Controller需要再去调用一层接口,在接口实现图片的下载,返回图片下载的物理路径和真实路径。由于后台Controller接收页面的文件类型为MultipartFile类型,亲测使用了三种方法进行传输。只有第三种在测试和线上是可以的。

第一种是将MultipartFile类型转成Base64编码,将Base64编码放进map进行http的dopost传输到接口,接口接收Base64编码,将Base64编码再转成MultipartFile进行下载。以下代码为相关关键代码,具体完整代码例子在第三种方法列出。后台Controller方法:

/*** 下载图片到接口* @return*/
@RequestMapping(value = "/ocrImgUpload", method = RequestMethod.POST,produces = "text/html;charset=utf-8")
@ResponseBody
public String ocrImgUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") MultipartFile mfile){try {logger.info(new Date() + "=============================下载身份证图片================================");BASE64Encoder bEncoder = new BASE64Encoder();String[] suffixArra= mfile.getOriginalFilename().split("\\.");String preffix="data:image/jpg;base64,".replace("jpg", suffixArra[suffixArra.length - 1]);String base64EncoderImg = preffix + bEncoder.encode(mfile.getBytes()).replaceAll("[\\s*\t\n\r]", "");Map pm = new HashMap();pm.put("base64EncoderImg", base64EncoderImg);String res = HttpRequestProxy.doPost(CommonUtils.getRandomAddr(itfUrl)+"/web/file/ocrImgUpload", pm);Map resMap = WebUtils.getResMap(res);String rs = (String)resMap.get("rs");return WebUtils.getData(true, "下载成功", JSONObject.parse(rs));}catch (Exception e){logger.error("TencentApiOcrController.java-ocrImgUpload-Exception: ", e);return WebUtils.resultData("-9999","上传失败",null);}
}

 

接口方法:  

/*** 接口接收图片* @return*/
@RequestMapping(value = "/ocrImgUpload", method = RequestMethod.POST,produces = "text/html;charset=utf-8")
@ResponseBody
public void ocrImgUpload(HttpServletRequest request, HttpServletResponse response){Long begintime = (new Date()).getTime();log.info("--------------ocrImgUpload------"+ "begintime========================"+begintime);PrintWriter out = null;String res = "";try{response.setContentType("text/html; charset=" + jsonCode);out = response.getWriter();String base64EncoderImg = request.getParameter("base64EncoderImg")==null?"":request.getParameter("base64EncoderImg").trim();MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(base64EncoderImg);Map map = new HashMap();map = imgUpload(multipartFile);res = WebUtils.getData(true,"下载成功",map);}catch (Exception e) {e.printStackTrace();res = WebUtils.getDataByCodeAndMsg(OCREnum.OCR_CHECK_WARN.getCode().toString(), OCREnum.OCR_CHECK_WARN.getMsg());} finally {log.info("--------------ocrImgUpload------"+"耗时========================"+(new Date().getTime()-begintime) +"毫秒");out.write(res);out.flush();out.close();}
}

第二种是将MultipartFile类型转成File类型,将File类型放进Json传输,接口接收File类型文件,再将File类型转成MultipartFile类型进行下载,以下代码为相关关键代码,具体完整代码例子在第三种方法列出。

/*** 后台web端Controller* @return*/
@RequestMapping(value = "/ocrImgUpload", method = RequestMethod.POST,produces = "text/html;charset=utf-8")
@ResponseBody
public String ocrImgUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") MultipartFile mfile){try {logger.info("=============================下载身份证图片================================");File file = new File(mfile.getOriginalFilename());FileUtils.copyInputStreamToFile(mfile.getInputStream(),file);String multfile = JSON.toJSONString(file);Map pm = new HashMap();pm.put("multfile", multfile);String res = HttpRequestProxy.doPost(CommonUtils.getRandomAddr(itfUrl)+"/web/file/ocrImgUpload", pm);Map resMap = WebUtils.getResMap(res);String rs = (String)resMap.get("rs");return WebUtils.getData(true, "下载成功", JSONObject.parse(rs));}catch (Exception e){logger.error("TencentApiOcrController.java-ocrImgUpload-Exception: ", e);return WebUtils.getData(false,"下载失败",null);}
}/*** 接口方法* @return*/
@RequestMapping(value = "/ocrImgUpload", method = RequestMethod.POST,produces = "text/html;charset=utf-8")
@ResponseBody
public void ocrImgUpload(HttpServletRequest request, HttpServletResponse response){Long begintime = (new Date()).getTime();log.info("--------------ocrImgUpload------"+ "begintime========================"+begintime);PrintWriter out = null;String res = "";try{response.setContentType("text/html; charset=" + jsonCode);out = response.getWriter();String multfile = request.getParameter("multfile")==null?"":request.getParameter("multfile").trim();String file = StringEscapeUtils.unescapeHtml(multfile);File newFile = JSONObject.parseObject(file, File.class);FileInputStream input = new FileInputStream(newFile);MultipartFile multipartFile = new MockMultipartFile("file", newFile.getName(), "text/plain", IOUtils.toByteArray(input));Map map = new HashMap();map = imgUpload(multipartFile);res = WebUtils.getData(true,"下载成功",map);}catch (Exception e) {e.printStackTrace();res = WebUtils.getDataByCodeAndMsg(OCREnum.OCR_CHECK_WARN.getCode().toString(), OCREnum.OCR_CHECK_WARN.getMsg());} finally {log.info("--------------ocrImgUpload------"+"耗时========================"+(new Date().getTime()-begintime) +"毫秒");out.write(res);out.flush();out.close();}
}

以上两种方法虽然都能成功下载身份证,但是在测试环境和线上环境却报图片不存在,因为这两种方法在将图片类型进行转换的时候,使用FileInputStream流输出,并且在本地项目下生成了新图片,但是此时我还未调用到图片下载的方法,即未将图片下载到服务器上,我本地使用的是tomcat。所以造成了图片未找到的报错。由于我是本地环境所以不存在图片未找到。以下给出项目完整代码。项目需要使用到的依赖:

cn.hutoolhutool-all4.1.19
com.tencentcloudapitencentcloud-sdk-java3.1.49

前端H5界面代码(以下代码给出识别正面身份证代码,反面同正面一样,只需要将FRONT改为BACK即可,此处可查看腾讯云OCR识别的API参数传参):

//设置隐藏域接收图片地址



//拍照按钮

人像面

国徽面


//正面
function frontclick() {$('#front_z').click();
}//反面
function backclick() {if($("#filePath1").val() == null || $("#filePath1").val() == "" || $("#filePath1").val() == undefined){layer.msg("请先拍照身份证人像面",{time:1000});return;}$('#back_z').click();
}//这里使用layui上传组件,引入layui的js和css即可//上传完毕后调用frontOcr()方法,传入图片物理路径调用后台方法进行识别回显
//正面调用腾讯云OCR认证
function frontOcr(imageStr, idCardSide) {$.ajax({url: pcs.common.path + "/web/ocr/getIdcardOcr",data: {imageStr: imageStr,idCardSide: idCardSide},type: 'post',dataType: 'json',success: function (data) {if (data.success) {var cardInfo = data.rs;var Address = cardInfo.Address;var Birth = cardInfo.Birth;var IdNum = cardInfo.IdNum;var Name = cardInfo.Name;var Nation = cardInfo.Nation;var Sex = cardInfo.Sex;var tempId = cardInfo.AdvancedInfo;var obj = JSON.parse(tempId);var arr = obj.WarnInfos;//以下值都为页面表单字段 自行添加即可$("#Name").val(Name);$("#Sex").val(Sex);$("#IdNum").val(IdNum);$("#Address").val(Address);$("#tempId").val(arr);$("#Birth").val(Birth);} else {layer.msg(data.errmsg,{time:1000});}}});
}

这行代码是设置手机拍照功能。

WebController:

/*** WebController层* @return*/
@RequestMapping(value = "/ocrImgUpload", method = RequestMethod.POST,produces = "text/html;charset=utf-8")
@ResponseBody
public String ocrImgUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") MultipartFile mfile){try {logger.info(new Date() + "=============================下载身份证图片================================");MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile file = multipartRequest.getFile("file");//从request中获取前端穿过来的文件//调用httpclientString res = HttpCilentMultipartFile.uploadFile(CommonUtils.getRandomAddr(itfUrl)+"/web/file/ocrImgUpload", file, "file");Map resMap = WebUtils.getResMap(res);String rs = (String)resMap.get("rs");return WebUtils.resultData("1", "上传成功", JSONObject.parse(rs));}catch (Exception e){logger.error("TencentApiOcrController.java-ocrImgUpload-Exception: ", e);return WebUtils.resultData("-9999","上传失败",null);}
}

HTTP传输工具类:

package com.fjqwkj.commons.utils;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Map;/*** @Author: fd* @Date 2020/9/11 10:13* @Description:*/
public class HttpCilentMultipartFile {public static String uploadFile(String requestURL , MultipartFile file, String fileParamName) {CloseableHttpClient httpClient = HttpClients.createDefault();String result = "";try {String fileName = file.getOriginalFilename();HttpPost httpPost = new HttpPost(requestURL);//添加header
// for (Map.Entry e : headerParams.entrySet()) {
// httpPost.addHeader(e.getKey(), e.getValue());
// }MultipartEntityBuilder builder = MultipartEntityBuilder.create();builder.setCharset(Charset.forName("utf-8"));builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//加上此行代码解决返回中文乱码问题builder.addBinaryBody(fileParamName, file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流/*for (Map.Entry e : otherParams.entrySet()) {builder.addTextBody(e.getKey(), e.getValue());// 类似浏览器表单提交,对应input的name和value}*/HttpEntity entity = builder.build();httpPost.setEntity(entity);HttpResponse response = httpClient.execute(httpPost);// 执行提交HttpEntity responseEntity = response.getEntity();if (responseEntity != null) {// 将响应内容转换为字符串result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}}

接口itfController:

/*** 下载图片到接口* @return*/@RequestMapping(value = "/ocrImgUpload", method = RequestMethod.POST)public void ocrImgUpload(HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "file") MultipartFile file){Long begintime = (new Date()).getTime();log.info("--------------ocrImgUpload------"+ "begintime========================"+begintime);PrintWriter out = null;String res = "";try{response.setContentType("text/html; charset=" + jsonCode);out = response.getWriter();
// String base64EncoderImg = request.getParameter("base64EncoderImg")==null?"":request.getParameter("base64EncoderImg").trim();
// MultipartFile multipartFile = BASE64DecodedMultipartFile.base64ToMultipart(base64EncoderImg);Map map = new HashMap();map = imgUpload(file);res = WebUtils.getData(true,"下载成功",map);}catch (Exception e) {e.printStackTrace();res = WebUtils.getDataByCodeAndMsg(OCREnum.OCR_CHECK_WARN.getCode().toString(), OCREnum.OCR_CHECK_WARN.getMsg());} finally {log.info("--------------ocrImgUpload------"+"耗时========================"+(new Date().getTime()-begintime) +"毫秒");out.write(res);out.flush();out.close();}}//图片下载方法
public Map imgUpload(MultipartFile file) {Map map = new HashMap();String res = "";if (!file.isEmpty()) {String msg = "";//最大文件大小long maxSize = 52428800;//50M//检查目录File uploadDir = new File(realPath);log.info("uploadDir" + uploadDir);if (!uploadDir.isDirectory()) {msg = "上传目录不存在,请确认您配置的物理路径是否正确!";map.put("false", msg);return map;}//检查目录写权限if (!uploadDir.canWrite()) {msg = "上传目录没有写权限。";map.put("false", msg);return map;}//创建文件夹-正式String dirName = "image";SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String ymd = sdf.format(new Date());sdf = new SimpleDateFormat("hh");String hh = sdf.format(new Date());sdf = new SimpleDateFormat("mm");String mm = sdf.format(new Date());String realpathStr = realPath + "/" + dirName + "/";log.info("正式文件夹目录:" + realpathStr);File realFile = new File(realpathStr);if (!realFile.exists()) {realFile.mkdirs();}log.info("realFile:"+realFile);realpathStr += ymd + "/" + ymd + hh + "/" + ymd + hh + mm + "/";String realUrlStr = realUrl + "/" + dirName + "/" + ymd + "/" + ymd + hh + "/" + ymd + hh + mm + "/";File realFile2 = new File(realpathStr);if (!realFile2.exists()) {realFile2.mkdirs();}log.info("realUrlStr:"+realUrlStr);log.info("realFile2:"+realFile2);//检查文件大小if (file.getSize() > maxSize) {msg = "上传文件太大,不能超过50M";map.put("false", msg);return map;}String fileName = file.getOriginalFilename();//检查扩展名String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();if (!("gif".equals(fileExt) || "jpg".equals(fileExt) || "jpeg".equals(fileExt) || "png".equals(fileExt) || "bmp".equals(fileExt))) {msg = "上传文件扩展名是不允许的扩展名。只允许gif,jpg,jpeg,png,bmp格式。";map.put("false", msg);return map;}SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;try {File uploadedFile = new File(realpathStr, newFileName);file.transferTo(uploadedFile);} catch (Exception e) {msg = "上传文件失败。";map.put("false", msg);return map;}log.info("newFileName:"+newFileName);String picUrl = realUrlStr + newFileName;String picPath = realpathStr + newFileName;log.info("picUrl:"+picUrl);map.put("picUrl", picUrl);map.put("picPath", picPath);return map;} else {map.put("false", "上传文件失败");return map;}}

本地项目文件路径配置:

#####文件路径配置
local_url: http://127.0.0.1:8080/file/upload/tem_file/ #临时访问路径
tmp_url: E:/tomcat/apache-tomcat-7.0.94/webapps/file/upload/tem_file/ #临时存放路径
real_path: E:/tomcat/apache-tomcat-7.0.94/webapps/file/upload/real_file/ #真实路径
real_url: http://127.0.0.1:8080/file/upload/real_file/

到此为止才将文件从h5传到webcontroller再http传输到接口进行下载。最后一步就是将返回的图片进行OCR识别回显信息。

/*** 获取身份证OCR识别信息.* @return*/@RequestMapping(value = "/getIdcardOcr",method = RequestMethod.POST,produces = "text/html;charset=utf-8")@ResponseBodypublic String getIdcardOcr(HttpServletRequest request){try {String imageStr = request.getParameter("imageStr")==null?"":request.getParameter("imageStr").trim();String idCardSide = request.getParameter("idCardSide")==null?"":request.getParameter("idCardSide").trim();imageStr = StrUtils.xssEncode(imageStr);idCardSide = StrUtils.xssEncode(idCardSide);Map pm = new HashMap();if(StringUtils.isNotBlank(imageStr)){pm.put("imageStr", imageStr);}if(StringUtils.isNotBlank(idCardSide)){pm.put("idCardSide", idCardSide);}imageStr = PicToBase64.ImageToBase64(imageStr);String rs = tencentApiOcrService.getIdcardOcr(idCardSide, imageStr);return WebUtils.getData(true, "OCR识别成功", JSONObject.parse(rs));} catch (Exception e) {logger.error("TencentApiOcrController.java-getIdcardOcr-Exception: ", e);return WebUtils.getData(false,"OCR识别失败",null);}}

public interface TencentApiOcrService {public String getIdcardOcr(String cardSide, String imageStr);}

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fjqwkj.commons.utils.CommonUtils;
import com.fjqwkj.commons.utils.HttpRequestProxy;
import com.fjqwkj.commons.utils.WebUtils;
import com.fjqwkj.service.apiocr.TencentApiOcrService;
import com.fjqwkj.service.checkocr.TCheckOcrService;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.ocr.v20181119.OcrClient;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRRequest;
import com.tencentcloudapi.ocr.v20181119.models.IDCardOCRResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;/*** @Author: fd* @Date 2020/9/2 20:48* @Description:*/
@Service
public class TencentApiOcrServiceImpl implements TencentApiOcrService {private static Logger logger &#61; LoggerFactory.getLogger(TencentApiOcrService.class);private static final String FIELD_SECRET_ID &#61; "";//填写secretIdprivate static final String FIELD_SECRET_KEY &#61; "";//填写secretKeyprivate static final String FIELD_TENCENT_CLOUD_API &#61; "ocr.tencentcloudapi.com";private static final String FIELD_REGION &#61; "ap-guangzhou";&#64;Value("${itf_url:}")private String itfUrl;&#64;Autowiredprivate TCheckOcrService tCheckOcrService;/*** 获取OcrClient.** &#64;return*/private OcrClient getOcrClient(){Credential cred &#61; new Credential(FIELD_SECRET_ID, FIELD_SECRET_KEY);HttpProfile httpProfile &#61; new HttpProfile();httpProfile.setEndpoint(FIELD_TENCENT_CLOUD_API);ClientProfile clientProfile &#61; new ClientProfile();clientProfile.setHttpProfile(httpProfile);OcrClient ocrClient &#61; new OcrClient(cred, FIELD_REGION, clientProfile);return ocrClient;}/*** 身份证识别** &#64;param cardSide* &#64;param imageStr* &#64;return*/public String getIdcardOcr(String cardSide, String imageStr) {OcrClient ocrClient &#61; getOcrClient();Map params &#61; new HashMap<>();params.put("ImageBase64", imageStr);params.put("CardSide", cardSide);Map configMap &#61; new HashMap<>();configMap.put("CopyWarn",true);configMap.put("BorderCheckWarn",true);configMap.put("ReshootWarn",true);configMap.put("DetectPsWarn",true);configMap.put("TempIdWarn",true);configMap.put("InvalidDateWarn",true);String Config &#61; JSON.toJSONString(configMap);params.put("Config", Config);try {IDCardOCRRequest req &#61; IDCardOCRRequest.fromJsonString(JSON.toJSONString(params), IDCardOCRRequest.class);IDCardOCRResponse resp &#61; ocrClient.IDCardOCR(req);HashMap dataMap &#61; new HashMap<>();resp.toMap(dataMap, "");return JSONObject.toJSONString(dataMap);} catch (Exception e) {logger.info(e.getMessage());}return null;}}

到这里整个流程就结束&#xff0c;可以实现身份证识别回显。总结一下&#xff0c;如果使用base64传输的话&#xff0c;因为将图片编码成base64位&#xff0c;编码大小会随着图片的大小像素而改变&#xff0c;将普通拍照上传的一张图片进行编码后&#xff0c;查看它的字符多达600多万&#xff0c;而http传输过程String类型有大小限制&#xff0c;会导致接口那边接收到的base64编码是空的&#xff0c;导致无法转成图片进行下载。还有使用base64编码的一个坏处就是容易造成解码错误&#xff0c;与原来图片不匹配。最主要还是生成的base64编码实在太大&#xff0c;过程太慢了。所以最后使用MultipartFile传输是最快最安全的。


推荐阅读
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 我尝试使用Vue.js在Laravel中实现imageupload吗?但是,我不知道为什么图像 ... [详细]
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • 原文转自:http:blog.csdn.netchinasoftosgarticledetails7903045UploadAction.java:packagecr ... [详细]
author-avatar
林筱杏-HA
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有