77.【JavaWeb文件上传和邮件发送04】

news/2024/5/2 10:41:17/文章来源:https://blog.csdn.net/qq_69683957/article/details/128047917

JavaWeb

  • (二十五)、文件上传
    • 1.准备工作
    • 2.实用类介绍
    • 3.思维导图:
    • 4.正戏开始
    • 5.完整代码
  • (二十六)、邮箱发送
    • 1.邮箱发送的原理:
    • 2.服务器的原理
    • 3.下载两个jar包
    • 4.基本类:
    • 5.全部代码
    • (二十七)、网站注册发送邮件实现

(二十五)、文件上传

1.首先创建一个empty项目
2.配置project项目中的JDK
在这里插入图片描述
3.设置模板
在这里插入图片描述
4.添加web外部支持
5.基本思路

1.准备工作

下载两个jar包:

apache commons FileUpload

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>

apache commons io

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

创建一个lib目录,然后把下载后的两个jar包放入到lib目录下,然后右键
点击 Add as library
在这里插入图片描述
点开项目结构,发现我们手动导入的lib目录不存在,所以要解决为问题
在这里插入图片描述
解决问题的存在
在这里插入图片描述

2.实用类介绍

文件上传的注意事项:
1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如
WEB-INF目录下
2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名(时间戳,uuid md5)
3.要限制上传文件的最大值 (比如朋友圈上传的视频,限制文件)
4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

需要用到的类详解:

ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个Filetem对象,在使用ServletFileUpload对象解析请求时需要DiskFileletemFactory对象。所以,我们需要在进行解析工作前构造好DiskFileltemFactory对象,通过servletFileUpload对象的构造方法或setFileltemFactory()方法设置ServletFileUpload对象的FileitemFactory属性

3.思维导图:

在这里插入图片描述

4.正戏开始

(1).表单如果包含一个文件上传输入项的化,这个表单的enctype属性就必须设置为multipart/form-data
(2).在html页面input中必须有一个<input type="file" name="filename">
(3).  get: 上传文件大小限制    post: 上传文件大无限制

1.创建文件目录

//* 判断文件上传的是普通表单还是带文件的表单,if(ServletFileUpload.isMultipartContent(req)){return;//如果是普通表带那就进入直接返回,否则就不运行}try {
//创建上传文件的保存路径,建议保存为在web-inf的路径下,用户无法直接访问上面的图片String realPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录File file = new File(realPath);
//  假如说文件目录不存在情况下,我们就创建if(!file.exists()){file.mkdir(); //创建这个目录}

2.创建临时文件目录

//*  缓存,临时文件。假如文件超过了预期的大小,我们就把他放入到一个临时文件中,活几天自动删除或提示用户转存为永久String tempRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录File tempFile = new File(tempRealPath);
//  假如说文件目录不存在情况下,我们就创建if(!tempFile.exists()){tempFile.mkdir(); //创建这个临时目录}

3.设置工厂

//* 处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的上传流获取,十分麻烦
//  但是我们都建议使用Apeache的文件上传组件来实现,common.fileupload,它需要依赖于commons-io组件
// ***************** 1.创建DiskFileItemFactory对象,处理文件上传路径或则大小限制的DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//  2.通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将她放到临时文件中去diskFileItemFactory.setSizeThreshold(1024*1024);  //缓存大小为1MB
//  3.diskFileItemFactory.setRepository(tempFile);   //临时目录的保存目录,需要一个file

4.获取servletFileUpload

// ******************* 4.获取servletFileUploadServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);//  5.监听文件上传的速度servletFileUpload.setProgressListener(new ProgressListener() {public void update(long l, long l1, int i) {System.out.println("总大小"+l1+"已上传:"+l);}});
//  处理乱码问题servletFileUpload.setHeaderEncoding("UTF-8");
//  设置单个文件的最大值
//   1024=1kb*1024=1MB*10=10MBservletFileUpload.setSizeMax(1024*1024*10);

implements sericlizable : 标记接口,JVM----》本地方法栈 native -->C++
在这里插入图片描述

5.完整代码

package com.Jsxs.Servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.junit.jupiter.api.Test;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;public class Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String msg = "文件上传失败!";
//*        判断文件上传的是普通表单还是带文件的表单,
//        if (ServletFileUpload.isMultipartContent(req)) {
//            System.out.println("失败");
//            return;//如果是普通表带那就进入直接返回,否则就不运行
//        }try {
//创建上传文件的保存路径,建议保存为在web-inf的路径下,用户无法直接访问上面的图片String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录File file = new File(uploadPath);
//  假如说文件目录不存在情况下,我们就创建if (!file.exists()) {file.mkdir(); //创建这个目录}//*  缓存,临时文件。假如文件超过了预期的大小,我们就把他放入到一个临时文件中,活几天自动删除或提示用户转存为永久String tempRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录File tempFile = new File(tempRealPath);
//  假如说文件目录不存在情况下,我们就创建if (!tempFile.exists()) {tempFile.mkdir(); //创建这个临时目录}
//* 处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的上传流获取,十分麻烦
//  但是我们都建议使用Apeache的文件上传组件来实现,common.fileupload,它需要依赖于commons-io组件
// ***************** 1.创建DiskFileItemFactory对象,处理文件上传路径或则大小限制的DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//  2.通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将她放到临时文件中去diskFileItemFactory.setSizeThreshold(1024 * 1024);  //缓存大小为1MB
//  3.diskFileItemFactory.setRepository(tempFile);   //临时目录的保存目录,需要一个file
/*ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个Filetem对象,
在使用ServletFileUpload对象解析请求时需要DiskFileletemFactory对象。
所以,我们需要在进行解析工作前构造好DiskFileltemFactory对象,
通过servletFileUpload对象的构造方法或setFileltemFactory()方法
设置ServletFileUpload对象的FileitemFactory属性*/
// ******************* 4.获取servletFileUploadServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);//  5.监听文件上传的速度upload.setProgressListener(new ProgressListener() {public void update(long l, long l1, int i) {System.out.println("总大小" + l1 + "已上传:" + l);}});
//  处理乱码问题upload.setHeaderEncoding("UTF-8");
//  设置单个文件的最大值
//   1024=1kb*1024=1MB*10=10MBupload.setSizeMax(1024 * 1024 * 10);
// ******************* 6. 处理上传文件//(1).把前端请求解析,封装成一个FileItem对象,需要从ServletFileUpload对象中获取List<FileItem> fileItems = upload.parseRequest(req);for (FileItem fileItem : fileItems) {
//   判断上传的文件是普通的表单还是带文件的表单if (fileItem.isFormField()) {  //假如说普通的表单
//   判断上传的文件是普通的表单还是带文件的表单String fieldName = fileItem.getFieldName();String value = fileItem.getString("UTF-8");System.out.println(fieldName + ":" + value);} else {  //假如是文件//==================处理文件================//String uploadFileName = fileItem.getName();System.out.println("上传的文件名是:"+uploadFileName);//可能存在文件名不合法的情况if (uploadFileName.trim().equals("") || uploadFileName == null) {continue;}//获得上传的文件名 /imges/girl.jpgString fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//获得文件的后缀名String fileName_End = uploadFileName.substring(uploadFileName.lastIndexOf(".")+ 1);System.out.println("文件信息【件名:"+fileName+"--->文件类型"+fileName_End+"】");/*如果文件后缀名fileName_End 不是我们所需要的就直接return,不处理,告诉用户文件类型不对*///可以使用UUID(唯一识别的通用码),保证文件名唯一//UUID.randomUUID(),随机生成一个唯一识别的通用码;//网络传输中的东西,都需要序列化//POJO,实体类,如果想要在多个电脑上运行,需要传输====》需要把对象都序列化String uuidPath = UUID.randomUUID().toString();//==================存放地址================////存到哪? :uploadPath--->创建的文件目录// 文件真实存在的路径:realPathFileString realPath = uploadPath + "/" + uuidPath;//给每个文件创建一个对应的文件夹File realPathFile = new File(realPath);if (!realPathFile.exists()) {  //假如说不存在就创建realPathFile.mkdir();}//==================文件传输================////获得文件上传的流InputStream inputStream = fileItem.getInputStream();//创建一个文件输出流//realpath=真实的文件夹//差一个文件,加上输出文件的名字+"/+uuidPath"FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);//创建一个缓冲区byte[] bytes = new byte[1024 * 1024];//判断是否读取完毕int len = 0;//如果大于0说明还存在数while ((len = inputStream.read(bytes)) > 0) {fileOutputStream.write(bytes, 0, len);}//关闭流fileOutputStream.close();inputStream.close();msg = "文件上传成功!";fileItem.delete(); //上传成功,清楚临时文件}}req.setAttribute("msg",msg);req.getRequestDispatcher("info.jsp").forward(req,resp);} catch (FileUploadException e) {e.printStackTrace();}}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>上传资源入口</title><style>*{margin: 0;padding: 0;box-sizing: border-box;}.pic{/*background : url("..img/back8.jng");*/height:100%;width: 100%;background-size: cover;background-repeat: no-repeat;margin: 60px auto;}.contain{box-shadow: 10px 10px 60px rgba(93, 86, 20, 0.909);margin: 0 auto;width: 500px;height: 500px;border-radius: 20px;padding-top: 60px;}input.seat{margin-top: 40px;height: 35px;width: 350px;}.input_out{height: 54px;width:100px;margin-top: 41px;background-color: #6495ED;border-width: 0px;font-size: 20px;color: white;margin-left: -5px;border-top-right-radius: 10px;  /*圆角*/border-bottom-right-radius: 10px;  /*圆角*/border-top-left-radius:10px;border-bottom-left-radius:10px;}.bjimg{position: fixed;top:0;left:0;width: 100%;height: 100%;z-index: -10;/*适应*/object-fit: cover;}#file{width: 200px;height: 100px;}</style>
</head>
<body>
<video src="img/1.mp4" loop autoplay class="bjimg"></video>
<div class="pic"><div class="contain"  ><form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"><div align="center"><br/><strong><span style="font-size: 40px; color: white; font-family: 楷体">文件传输页面</span></strong><br></div><div align="center"><br/><br/><input type="text" class="seat" name="username" placeholder="请输入上传用户名" id="seat"><br><input type="file" placeholder="上传文件" name="FileUpload" style="background: aqua" id="file"><br/><br/><input type="submit" class="input_out" onmousemove="this.className='input_move'" onmouseout="this.className='input_out'" value="开始上传"></div></form></div>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="4.0" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<!--对servlet进行配置-->
<servlet><servlet-name>Servlet</servlet-name><servlet-class>com.Jsxs.Servlet.Servlet</servlet-class>
</servlet><servlet-mapping><servlet-name>Servlet</servlet-name><url-pattern>/upload.do</url-pattern></servlet-mapping>
</web-app>

(二十六)、邮箱发送

1.邮箱发送的原理:

在这里插入图片描述

2.服务器的原理

在这里插入图片描述

3.下载两个jar包

JavaMail API (compat) » 1.4.7

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version>
</dependency>

JavaBeans™ Activation Framework » 1.1.1

<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>

4.基本类:

在这里插入图片描述

5.全部代码

package Com.Jsxs;import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;//发送一个简单的邮件
public class MailDemo1 {public static void main(String[] args) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host","smtp.qq.com");  // 设置QQ邮件服务器prop.setProperty("mail.transport.protocol","smtp");  //邮件发送协议prop.setProperty("mail.smtp.auth","true");   //需要验证用户密码
//      关于QQ邮箱,还要设置SSL加密,加上一下代码即可MailSSLSocketFactory sf= new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);
//       使用JavaMail发送邮件的五个步骤//  1.创建定义整个应用程序所需要的环境信息的session对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {
//        发件人邮件用户名,授权码return new PasswordAuthentication("2261203961@qq.com","授权码");}});
//        开启Session的debug模式,这样就可以看到程序发送Email的运行状态session.setDebug(true);
//  2.通过session得到transport对象Transport ts = session.getTransport();//  3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","2261203961@qq.com","授权码");
//  4.创建邮件: 写邮件//  注意需要传递SessionMimeMessage message = new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("2261203961@qq.com"));//指明邮件的收件人,发件人和收件人一样就是发送给自己message.setRecipient(Message.RecipientType.TO,new InternetAddress("2261203961@qq.com"));//邮件的标题message.setSubject("吉士先生");//邮件的文本内容:message.setContent("<h1 style='color: red'>你好啊,李威涛<h1>","text/html;charset=UTF-8");
//  5.发送邮件ts.sendMessage(message,message.getAllRecipients());
//  6.关闭邮件链接ts.close();}
}

在这里插入图片描述

(二十七)、网站注册发送邮件实现

在这里插入图片描述

package com.Jsxs.Util;import com.Jsxs.projo.User;
import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;
// 网站三秒原则public class Sendmail extends Thread{
//private String from="2261203961@qq.com";
//    邮箱的用户名private String username="2261203961@qq.com";
//    授权码private String password="dbiqifywbfxjdjdh";
//    发送邮件的服务器地址private String host="smtp.qq.com";private static User user;public Sendmail(User user){this.user=user;}public void run(){try {Properties prop = new Properties();prop.setProperty("mail.host",host);  // 设置QQ邮件服务器prop.setProperty("mail.transport.protocol","smtp");  //邮件发送协议prop.setProperty("mail.smtp.auth","true");   //需要验证用户密码
//      关于QQ邮箱,还要设置SSL加密,加上一下代码即可MailSSLSocketFactory sf= null;sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);
//       使用JavaMail发送邮件的五个步骤//  1.创建定义整个应用程序所需要的环境信息的session对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {
//        发件人邮件用户名,授权码return new PasswordAuthentication(username,password);}});
//        开启Session的debug模式,这样就可以看到程序发送Email的运行状态session.setDebug(true);
//  2.通过session得到transport对象Transport ts = session.getTransport();//  3.使用邮箱的用户名和授权码连上邮件服务器ts.connect(host,username,password);
//  4.创建邮件: 写邮件MimeMessage mimeMessage = imageMall(session);
//  5.发送邮件ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//  6.关闭邮件链接ts.close();} catch (Exception e) {e.printStackTrace();}}public static MimeMessage imageMall(Session session) throws MessagingException {//  注意需要传递SessionMimeMessage mimeMessage = new MimeMessage(session);//指明邮件的发件人mimeMessage.setFrom(new InternetAddress("2261203961@qq.com"));//指明邮件的收件人,发件人和收件人一样就是发送给自己mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//邮件的标题mimeMessage.setSubject("用户注册");String info="恭喜您注册成功,您的用户名为:"+user.getUsername()+",您的密码:"+user.getPassword()+",请您妥善管理";//===================================================================图片////准备图片数据MimeBodyPart image = new MimeBodyPart();//图片需要进行处理DataHandler dh = new DataHandler(new FileDataSource("E:\\Ideal源码\\emali\\web\\img\\3.png"));image.setDataHandler(dh);  //在我们的主题中 放入这个处理后的数据image.setContentID("haha.jpg");  //给图片设置一个ID//准备正文数据MimeBodyPart text = new MimeBodyPart();text.setContent("<img src='cid:haha.jpg'>"+info,"text/html;charset=UTF-8");//*******************************************************************附件////附件MimeBodyPart body3 = new MimeBodyPart();body3.setDataHandler(new DataHandler(new FileDataSource("E:\\Ideal源码\\mail-java\\src\\Com\\resourece\\log4j.properties")));body3.setFileName("");  //附件设置名字MimeBodyPart body4 = new MimeBodyPart();body4.setDataHandler(new DataHandler(new FileDataSource("E:\\Ideal源码\\mail-java\\src\\Com\\resourece\\1.txt")));body4.setFileName(""); //附件设置名字//拼装正文内容---->文本和图片MimeMultipart mm = new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("related");//将拼接好的正文内容设置为主题MimeBodyPart contentText = new MimeBodyPart();contentText.setContent(mm);//拼装附件MimeMultipart allFile = new MimeMultipart();allFile.addBodyPart(body3);  //附件1allFile.addBodyPart(body4);    //附件2allFile.addBodyPart(contentText); //正文allFile.setSubType("mixed");  //所有类型都设置为mixed//设置到消息,保存修改mimeMessage.setContent(allFile);mimeMessage.saveChanges();//===================================================================//return mimeMessage;}}
package com.Jsxs.Servlet;import com.Jsxs.Util.Sendmail;
import com.Jsxs.projo.User;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");String email = req.getParameter("email");System.out.println(username+" "+password+" "+email);User user = new User();user.setUsername(username);user.setPassword(password);user.setEmail(email);Sendmail sendmail = new Sendmail(user);sendmail.start();//注册用户;req.setAttribute("message","注册成功,我们已经向您发送了一封电子邮件,请您查收");req.getRequestDispatcher("info.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_37787.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【配送路径规划】基于matlab遗传算法求解静态外卖骑手路径规划问题【含Matlab源码 2248期】

⛄一、遗传算法求解静态外卖骑手路径规划问题 1 模型假设 外卖配送的实际运行是一个复杂的过程, 受诸多因素影响, 为了建立调度模型, 本文做如下假设。 (1) 外卖配送更多的是服务特殊群体, 所以本文认为外卖配送是一种预约型配送, 即在进行调度安排前, 己经获取了所有顾客的地…

版本控制利器——changelog

问题描述 当前&#xff0c;我们项目需要进行版本的确定&#xff0c;人工审核代码已接近尾声&#xff0c;但为了防止后续继续出现该问题&#xff0c;我希望能够做到在每次push到master时&#xff0c;更新changelog 将每一个版本的commit记录下来&#xff0c;类似于下列 解决…

C++_串口编程_官方示例:监视通信事件

这是微软官方的一个例子&#xff0c;这个例子中&#xff0c;如果不做修改&#xff0c;那么他是可以异步运行的&#xff0c;会出现一个错误&#xff1a;官方也说了一下&#xff0c;但是不太好懂&#xff0c;我拷贝过来放在这里&#xff0c;作为参考。 如果无法立即完成重叠的操作…

【Canvas】js用Canvas绘制阴阳太极图动画效果

学习JavaScript是否兴趣缺缺&#xff0c;那就需要来一个兴趣学习&#xff0c;问一下有没有兴趣用Canvas画图呢&#xff0c;可以画很多有趣的事物&#xff0c;自由发挥想象&#xff0c;收获多多哦&#xff0c;这里有一个例子&#xff0c;如何用canvas画阴阳太极图动图效果&#…

【博客544】golang pprof性能调试:寻找memory瓶颈

golang pprof性能调试&#xff1a;寻找memory瓶颈 1、前置 pprof的使用与输出列解析看姐妹篇&#xff1a;golang pprof性能调试&#xff1a;寻找cpu瓶颈 2、引入pprof到程序中&#xff0c;以调试memory瓶颈 给程序加入&#xff1a; import _ "net/http/pprof"go…

【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)

需要源码和Jar包请点赞关注收藏后评论区留下QQ~~~ 一、在线语音合成 虽然国产智能机大多集成了中文语音引擎&#xff0c;但是系统自带的语音工具无法满足商用要求&#xff0c;功能单一&#xff0c;所以势必引入第三方的语音引擎&#xff0c;依靠第三方提供的开发包统一支撑语音…

缓存穿透、缓存击穿、缓存雪崩及其解决方案

缓存&#xff08;cache&#xff09;&#xff0c;大家都非常熟悉&#xff0c;几乎每个系统乃至整个计算机体系中都会用到。在分布式系统架构中&#xff0c;主要用于减轻数据库的压力&#xff0c;提高系统的响应速度和并发吞吐&#xff0c;即空间(内存)换时间。当大量的读、写请求…

2023年天津财经大学珠江学院专升本经济学专业课考试大纲

天津财经大学珠江学院2023年高职升本科专业课考试《经济学》考试大纲一、本大纲系天津财经大学珠江学院2023年高职升本科《经济学》课程考试大纲。所列考试范围出自郑健壮、王培才主编的教材《经济学基础&#xff08;第二版&#xff09;》&#xff0c;清华大学出版社&#xff0…

React - Ant Design4.x版本安装使用,并按需引入和自定义主题

React - Ant Design4.x版本安装使用&#xff0c;并按需引入和自定义主题一. 安装使用 antd二&#xff0e;antd 高级配置安装 craco&#xff0c;对 create-react-app 的默认配置进行自定义自定义主题安装 babel-plugin-import &#xff0c;按需加载组件代码和样式Ant Design官网…

mycat-3-实战篇

1 总结&#xff1a; 1&#xff1a;用的表必须在mycat的配置文件中配置。 2&#xff1a;mycat默认分片策略中&#xff0c;都是针对表的主键&#xff0c;默认是id,如果主键不是id的&#xff0c;请去rule.xml自己复制一份修改 3&#xff1a; 2 注意细讲解 1&#xff1a;schem…

车辆大全和车牌识别系统毕业设计,车牌识别系统设计与实现,车牌AI识别系统论文毕设作品参考

功能清单 【后台管理员功能】 系统设置&#xff1a;设置网站简介、关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&a…

TypeScript开启

TypeScript是什么&#xff1f; typescript是以JavaScript为基础构建的语言&#xff0c;是一个Javascript的超集&#xff0c;可以在任何支持JavaScript的平台中执行&#xff0c;typescript扩展了JavaScript&#xff0c;并添加了类型。 注意&#xff1a;ts不能被js直接解析执行&…

27个超实用Chrome DevTools 调试技巧 source 全局搜索(持续更新)

谷歌开发者工具提供了一系列的功能来帮助开发者高效 Debug 网页应用&#xff0c;让他们可以更快地查找和修复 bug。在谷歌的开发者工具中&#xff0c;有非常多有用的小工具&#xff0c;但是很多开发者并不知道。通过这篇文章&#xff0c;我把我常用的那些高效 Debug 的 Chrome …

大数据(9f)Flink双流JOIN

文章目录概述开发环境使用状态列表实现 INNER JOIN&#xff08;双流connect后CoProcessFunction&#xff09;基于间隔的JOIN&#xff08;Interval Join&#xff09;基于窗口的JOIN&#xff08;Window Join&#xff09;概述 Flink双流JOIN可用算子或SQL实现&#xff0c;FlinkSQ…

Flutter 5 大本地数据库解决方案

Flutter 5 大本地数据库解决方案 原文 https://levelup.gitconnected.com/top-5-local-database-solutions-for-flutter-development-6351cd494070 前言 这里列出了最流行的数据库解决方案以及代码示例。 选择正确的数据管理系统对于提高效率和可 extension 性以及影响可用性和…

PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

目录 1--前言 2--基于Qt Designer设计ui文件 3--视频的编解码操作 4--完整代码 5--结果展示 6--存在的问题 7--参考 1--前言 ① 创建两个线程&#xff0c;主线程为ui线程&#xff0c;子线程用于读取摄像头视频&#xff0c;将处理后的图像帧数据&#xff08;处理操作可以…

JDBC操作数据库实现增、删、查、改

0.JDBC概念 实际开发中,手动的输入SQL语句是少之又少,大多数情况下是通过编译代码进行来控制自动执行. 具体操作如下: 上述展示有一个【自己写的Mysql客户端】&#xff0c;这种操作是非常容易的&#xff0c;因为各种数据库本身就提供一系列的API&#xff0c;可以让用户很方便…

内存一致性,指令重排序,内存屏障,volatile解析

文章目录为什么会存在“内存可见性”问题重排序与内存可见性的关系as-if-serial语义单线程程序的重排序规则多线程程序的重排序规则happen-before是什么解决方案&#xff1a;内存屏障Volatile关键字解决内存可见性问题的实现原理为什么会存在“内存可见性”问题 下图为x86架构…

如何利用快解析远程访问家庭智能网关

随着家庭宽带用户的暴增&#xff0c;涌现出了许多连接家居设备和控制中心的产品&#xff0c;如家庭智能网关。家庭智能网关是家居智能化的心脏&#xff0c;通过它实现系统的信息采集、信息输入、信息输出、集中控制、远程控制、联动控制等功能。 ​ 智能家庭网关具备智能家居控…

3D-SKIPDENSESEG医学图像分割

蓝色三角、黄色三角、红色三角相对应。 得到第三个feature map&#xff0c;反卷积会恢复到原来的尺寸 Dense block&#xff0c;通道增加了 Transition&#xff0c;池化 用正则表达式把里面的h5文件匹配一下吧 os.path.join()把两个部分的路径拼一下 root_path —data_train *.…