JavaWeb系列二十三: web 应用常用功能(文件上传下载)

文章目录

  • 5. 文件上传基本介绍
    • 5.1 文件上传-原理示意图
    • 5.2 文件上传页面
    • 5.3 走通Servlet
    • 5.4 表单项区别处理
    • 5.5 创建目录-保存文件
    • 5.6 中文编码问题
    • 5.7 文件上传注意事项和细节
      • 5.7.1 按照年月日目录存放
      • 5.7.2 文件覆盖问题
      • 5.7.3 封装一下
    • 5.8 文件上传其他注意事项
      • 5.8.1 upload文件夹为何要在out目录下直接创建
  • 6. 文件下载基本介绍
    • 6.1 原理示意图
    • 6.2 走通Servlet
    • 6.3 设置下载响应头
    • 6.4 文件下载注意事项

在这里插入图片描述

5. 文件上传基本介绍

  1. 文件的上传和下载, 是常见的功能
  2. 后面项目就使用了文件上传下载
  3. 如果是传输大文件, 一般用专门的工具或插件
  4. 文件上传下载需要使用两个包, 需要导入 文件上传下载需要的jar
    在这里插入图片描述

jsp下的jar包

在这里插入图片描述

5.1 文件上传-原理示意图

文件上传的解读

  1. 还是使用表单来提交
  2. action依然是按照以前的规定来确认
  3. method需指定为post
  4. enctype: 全称encodetype, 即编码类型. 默认是 application/x-www-form-urlencoded, 即url编码, 这种编码不适合于二进制文件的提交.
    enctype要指定为 multipart/form-data, 即表示表单提交的数据有多个部分组成, 也就是说即可以提交二进制数据, 也可以提交文本数据

服务端要完成的工作 FileUploadServlet.java

  1. 判断是不是一个文件表单
  2. 判断表单提交的各个表单项是什么类型
  3. 如果是一个普通的表单项, 就按照文本的方式来处理
  4. 如果是一个文件表单项(二进制数据), 使用IO技术来处理
  5. 把表单提交的文件数据, 保存到你指定的服务端的某个目录

效果图
在这里插入图片描述

5.2 文件上传页面

新建项目, 导入web框架, 引入jar包, 配置Tomcat👉参考

配置FileUploadServlet👉参考

1.新建fileupdown项目

2.在com.zzw.servlet包 下配置 FileUploadServlet

public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FileUploadServlet doPost()...");
    }
}
<servlet>
    <servlet-name>FileUploadServlet</servlet-name>
    <servlet-class>com.zzw.servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FileUploadServlet</servlet-name>
    <url-pattern>/fileUploadServlet</url-pattern>
</servlet-mapping>

3.web路径下新建upload.jsp
这段代码大部分是从家居购项目的furn_update.jsp来的

<%--
  Created by IntelliJ IDEA.
  User: 赵志伟
  Version: 1.0
 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 指定了base标签 -->
    <base href="<base href="<%=request.getContextPath()%>/">
    <style type="text/css">
        input[type="submit"] {
            outline: none;
            border-radius: 5px;
            cursor: pointer;
            background-color: #31B0D5;
            border: none;
            width: 70px;
            height: 35px;
            font-size: 20px;
        }

        img {
            border-radius: 50%;
        }

        form {
            position: relative;
            width: 200px;
            height: 200px;
        }

        input[type="file"] {
            position: absolute;
            left: 0;
            top: 0;
            height: 200px;
            opacity: 0;
            cursor: pointer;
        }
    </style>

    <script type="text/javascript">
        function prev(event) {
            //获取展示图片的区域
            var img = document.getElementById("preView");
            //获取文件对象
            var file = event.files[0];
            //获取文件阅读器: Js的一个类, 直接使用即可
            var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = function () {
                //给img的src设置图片url
                img.setAttribute("src", this.result)
            }
        }
    </script>
</head>
<body>
<%--表单的enctype属性要设置为multipart/form-data
    enctype="multipart/form-data" 表示提交的数据是多个部分构成的. 有文件和文本
    --%>
<form action="fileUploadServlet" method="post" enctype="multipart/form-data">
    家居图: <img src="2.jpg" alt="" width="200" height="200" id="preView"><%--img是单标签, 后面不能加斜杠--%>
    <input type="file" name="pic" id="" value="" onchange="prev(this)"/>
    家居名: <input type="text" name="name"><br/>
    <input type="submit" value="上传"/>
</form>
</body>
</html>

5.3 走通Servlet

遇到了一点小问题: temp\upload改成temp\upload
在这里插入图片描述

代码

public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FileUpLoadServlet 被调用...");
        //1.判断是不是文件表单(enctype="multipart/form-data")
        if (ServletFileUpload.isMultipartContent(request)) {
            System.out.println("OK");
            //2.创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //3.创建一个解析上传数据的工具对象
            /**
             *     <input type="file" name="pic" id="" value="" οnchange="prev(this)"/>
             *     家居名: <input type="text" name="name"><br/>
             *     <input type="submit" value="上传"/>
             */
            ServletFileUpload servletFileUpload =
                    new ServletFileUpload(diskFileItemFactory);
            //4.关键代码, servletFileUpload 对象可以把表单提交的数据text/文件.
            // 将其封装到 FileItem 文件项中
            try {
                /**输出
                 * list==>
                 * [name=winner-autumn-2022 - 鍓湰.png,
                 * StoreLocation=D:\Program Files\apache-tomcat-8.5.82\temp\\upload_62628cc5_1881341bf4c__7f85_00000000.tmp,
                 * size=598521bytes, isFormField=false, FieldName=pic, name=null,
                 * StoreLocation=D:\Program Files\apache-tomcat-8.5.82\temp\\upload_62628cc5_1881341bf4c__7f85_00000001.tmp,
                 * size=6bytes, isFormField=true, FieldName=name]
                 */
                List<FileItem> list = servletFileUpload.parseRequest(request);
                System.out.println("list==>" + list);
            } catch (FileUploadException e) {
                throw new RuntimeException(e);
            }
        } else {
            System.out.println("不是文件表单...");
        }
    }
}

5.4 表单项区别处理

//4.关键代码, servletFileUpload 对象可以把表单提交的数据text/文件.
// 将其封装到 FileItem 文件项中
try {
    /**输出
     * list==>
     * [name=winner-autumn-2022 - 鍓湰.png,StoreLocation=D:\Program Files\apache-tomcat-8.5.82\temp\\upload_62628cc5_1881341bf4c__7f85_00000000.tmp,size=598521bytes, isFormField=false, FieldName=pic,
     * name=null,StoreLocation=D:\Program Files\apache-tomcat-8.5.82\temp\\upload_62628cc5_1881341bf4c__7f85_00000001.tmp, size=6bytes, isFormField=true, FieldName=name]
     */
    List<FileItem> list = servletFileUpload.parseRequest(request);
    //System.out.println("list==>" + list);
    //遍历, 并分别处理
    for (FileItem fileItem : list) {
        //不知道是什么, 就输出看一下
        //System.out.println(fileItem);
        //判断是不是一个文件==>OOP程序员
        if (fileItem.isFormField()) {//如果为真,就是文本 input type="text"
            String name = fileItem.getString("utf-8");
            System.out.println("家居名= " + name);
        } else {//是一个文件
            //获取上传的文件的名字
            String name = fileItem.getName();
            System.out.println("上传的文件名= " + name);
        }
    }
} catch (FileUploadException e) {
    throw new RuntimeException(e);
}
} else {
System.out.println("不是文件表单...");
}

5.5 创建目录-保存文件

在这里插入图片描述

if (fileItem.isFormField()) {//如果为真,就是文本 input type="text"
    String name = fileItem.getString("utf-8");
    System.out.println("家居名= " + name);
} else {//是一个文件
    //获取上传的文件的名字
    String name = fileItem.getName();
    System.out.println("上传的文件名= " + name);
    //把上传到服务器 temp目录 下的文件保存到你指定的目录👉upload
    // 1.指定一个目录, 我们网站的工作目录下
    String filePath = "/upload/";
    // 2.获取完整的目录[io/servlet基础]
    //   这个目录是合你的web项目运行环境绑定的, 是动态的
    //   fileRealPath= D:\idea_project\zzw_javaweb\fileupdown\out\artifacts\fileupdown_war_exploded\\upload\
    String fileRealPath =
            request.getServletContext().getRealPath(filePath);
    System.out.println("fileRealPath= " + fileRealPath);
    //3.创建这个上传的目录=>
    File fileRealPathDirectory = new File(fileRealPath);
    if (!fileRealPathDirectory.exists()) {//如果目录不存在, 就创建
        fileRealPathDirectory.mkdirs();//创建
    }
    //4.将文件拷贝到fileRealPathDirectory目录下
    // 构建了一个上传的文件的完整路径[目录+文件名], 这个路径由 目录+该文件的文件名 组成
    String fileFullPath = fileRealPathDirectory + "\\" + name;//这里必须加斜杠
    System.out.println("fileFullPath= " + fileFullPath);
    fileItem.write(new File(fileFullPath));
    //5.提示信息
    response.setContentType("text/html;charset=utf-8");
    PrintWriter writer = response.getWriter();
    writer.print("<h3>文件上传成功</h3>");
}

5.6 中文编码问题

在这里插入图片描述

5.7 文件上传注意事项和细节

5.7.1 按照年月日目录存放

1.如果将文件都上传到一个目录下, 当上传文件很多时, 会造成访问文件的速度变慢, 因此可以将文件上传到多个目录下.

2.比如: 一天上传的文件, 统一放到一个文件夹, 按照年月日格式, 比如👉20230513文件夹 日期类

●代码实现
1.在com.zzw.utils包下新建WebUtils工具类

public class WebUtils {
    public static String getYearMonthDay() {
        //第二代日期类Calendar
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(calendar.YEAR);
        int month = calendar.get(calendar.MONTH) + 1;//月份从0开始计算
        int day = calendar.get(calendar.DAY_OF_MONTH);
        String format = year + "/" + month + "/" + day + "/";// 2023/5/13/

        //第三代日期类LocalDateTime
        LocalDate now = LocalDate.now();
        year = now.getYear();
        month = now.getMonthValue();
        day = now.getDayOfMonth();
        format = year + "/" + month + "/" + day + "/";// 2023/5/13/
        return format;
    }
}

2.修改FileUploadServlet

在这里插入图片描述

注意
在这里插入图片描述

3.测试效果

在这里插入图片描述

3.2 手动更改时间 再次测试

在这里插入图片描述
在这里插入图片描述

测试效果

在这里插入图片描述

5.7.2 文件覆盖问题

1.修改FileUploadServlet

在这里插入图片描述

2.测试

在这里插入图片描述

5.7.3 封装一下

在这里插入图片描述

把这部分代码摘出来封装进工具类里
在这里插入图片描述
在这里插入图片描述

5.8 文件上传其他注意事项

  1. 一个完美的文件上传, 要考虑的因素很多, 比如断点续传, 控制图片大小, 尺寸, 分片上传, 防止恶意上传等. 在项目中, 可以考虑使用WebUploader组件(百度开发👉https://fex.baidu.com/webuploader/doc/index.html).
  2. 文件上传功能, 在项目中建议有限制的使用, 一般用在头像, 证明, 合同, 产品展示等, 如果不加限制, 就会造成服务器空间被大量占用[比如微信发1次朋友圈最多9张图等].

5.8.1 upload文件夹为何要在out目录下直接创建

文件上传, 创建web/upload的文件夹. 在tomcat启动时, 没有在out目录下创建对应的upload文件夹. 其原因是tomcat对应空目录是不会在out下创建相应目录的. 所以, 只需在upload目录下放一个文件即可

  1. 这是web路径一个空文件夹, Tomcat启动后, 是不会在out/artifacts下创建相应目录的
    在这里插入图片描述
    在这里插入图片描述
  2. 如图, upload100文件夹下是有文件的, 那么在Tomcat启动后, out/artifacts下就会创建upload100目录
    在这里插入图片描述
    在这里插入图片描述

6. 文件下载基本介绍

6.1 原理示意图

●响应头

  • Content-Disposition: 表示下载的数据的展示方式. 比如内联形式(网页形式或者网页一部分), 或者是文件下载方式 attachment
  • Content-type: 指定返回数据的类型MIME

●响应体

  • 在网络传输时是图片的原生数据(按照浏览器下载的编码)

6.2 走通Servlet

1.在com.zzw.servlet包 下配置 FileDownloadServlet

<servlet>
    <servlet-name>FileDownloadServlet</servlet-name>
    <servlet-class>com.zzw.servlet.FileDownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>FileDownloadServlet</servlet-name>
    <url-pattern>/fileDownloadServlet</url-pattern>
</servlet-mapping>
public class FileDownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FileDownloadServlet doPost()被调用...");
    }
}

2.web路径下新建download.jsp

<head>
    <title>文件下载</title>
    <base href="<%=request.getContextPath()%>/">
</head>
<body>
<h1>文件下载</h1>
<a href="fileDownloadServlet?name=1.jpg">点击下载小狗图片</a><br/>
<a href="fileDownloadServlet?name=韩顺平零基础Java笔记.pdf">点击下载韩顺平零基础Java笔记.pdf</a><br/>
</body>

注意: 如果重启Tomcat后, 在out目录下你没有看到你创建的download文件夹, rebuild project -> 再次重启Tomcat(不能是重新发布)

在这里插入图片描述

公共资源为什么不直接放在工作路径下?👉因为Tomcat重启之后out目录就会清空

6.3 设置下载响应头

在这里插入图片描述

public class FileDownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("fileDownloadServlet 被调用...");
        //1.准备要下载的文件, 放在web路径下的download目录, 然后重启Tomcat, 让程序把download文件夹加载到项目工作路径下
        //  如果实在不行, rebuild project -> 重启Tomcat(不是重新发布, 是重启)
        //2.获取要下载的文件的名字
        request.setCharacterEncoding("utf-8");
        String downloadFileName = request.getParameter("name");
        System.out.println("downloadFileName= " + downloadFileName);
        //3.给http响应,设置响应头Content-Type, 就是文件的MIME类型
        //  通过servletContext来获取
        ServletContext servletContext = request.getServletContext();
        String downloadPath = "/download/";//下载目录 从web工程根目录计算
        String downloadFileFullPath = downloadPath + downloadFileName;//拼接后->/download/1.jpg
        String mimeType = servletContext.getMimeType(downloadFileFullPath);
        System.out.println("mimeType= " + mimeType);
        response.setContentType(mimeType);
        //4.给http响应,设置Content-Disposition
        //  这里考虑的细节比较多, 比如不同的浏览器写法不一样, 要考虑编码
        //  ff: 文件名中文需要base64, 而ie/chrome是URL编码
        //(1)如果是Firefox 中文编码需要base64
        //(2)Content-Disposition 指定下载的数据的展示形式(如果是attachment, 则使用文件下载方式;如果没有指定, 一般是以网页形式展示)
        //(3)如果是其它(主流ie/chrome), 中文编码使用URL编码
        if (request.getHeader("User-Agent").contains("Firefox")) {
            // 火狐 Base64编码
            response.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
                    new BASE64Encoder().encode(downloadFileName.getBytes("UTF-8")) + "?=");
        } else {
            // 其他(主流ie/chrome)使用URL编码操作
            response.setHeader("Content-Disposition", "attachment; filename=" +
                    URLEncoder.encode(downloadFileName, "UTF-8"));
        }
        //5.读取下载的文件数据, 返回给客户端/浏览器
        //(1)创建一个和要下载的文件 关联的输入流
        InputStream resourceAsStream = servletContext.getResourceAsStream(downloadFileFullPath);
        //(2)得到返回数据的输出流[因为返回的文件大多数是二进制(不管是文本还是二进制都可以按字节处理),IO]
        ServletOutputStream outputStream = response.getOutputStream();
        //(3)使用工具类, 将输入流关联的文件, 对拷到输出流, 并返回给IOUtils
        IOUtils.copy(resourceAsStream, outputStream);
    }
}

6.4 文件下载注意事项

  1. 文件下载, 比较麻烦的就是文件名中文处理
    在这里插入图片描述
  2. 对于网站的文件, 很多文件使用另存为即可下载, 对于大文件(文档, 视频), 会使用专业的下载工具(迅雷, 华为网盘, 腾讯, 百度等).
  3. 对于不同的浏览器, 在把文件下载完毕后, 处理的方式不一样, 有的是直接打开文件, 有的是将文件下载到本地的下载目录

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

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

相关文章

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

go mod 依赖管理补充2

依赖包的版本问题&#xff0c;别的开发语言有没有类似的问题&#xff1f;是怎么解决的&#xff1f; 举例&#xff1a;java java的依赖包的版本问题&#xff0c;通过Maven模块来操作&#xff0c;可以指定依赖包版本号&#xff0c;如下&#xff1a; go.mod 文件 go.mod文件是G…

VS2019运行显示缺少调试目标

出现问题点 如果点击运行显示上述错误&#xff0c;可以尝试先清理&#xff0c;然后重新生成 此时会出来一个调试目标路径&#xff0c;代表生成成功 但是运行还是显示缺少调试目标 右键项目&#xff0c;点击属性&#xff0c;然后修改路径&#xff0c;既可成功

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一&#xff0c;使用逆向工程步骤梳理1&#xff0c;修改逆向工程的application.yml配置2&#xff0c;修改逆向工程的generator.properties配置3&#xff0c;以Debug模式启动逆向工程4&#xff0c;使用逆向工程生成代码5&#xff0c;整合生成的代码到对应的模块中 二&am…

paddleocr运行报错?谈谈解决思路。

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【网安播报】CocoaPods 曝关键漏洞,应用程序面临供应链攻击风险

1、CocoaPods 曝关键漏洞&#xff0c;数百万 macOS 和 iOS 应用程序面临供应链攻击风险 开源依赖管理器 CocoaPods 中的安全漏洞暴露了数千个软件包&#xff0c;利用这些漏洞的攻击者可以将恶意代码注入合法应用&#xff0c;通过受信任的渠道分发恶意软件&#xff0c;并破坏用户…

Python前沿技术:机器学习与人工智能

Python前沿技术&#xff1a;机器学习与人工智能 一、引言 随着科技的飞速发展&#xff0c;机器学习和人工智能&#xff08;AI&#xff09;已经成为了计算机科学领域的热门话题。Python作为一门易学易用且功能强大的编程语言&#xff0c;已经成为了这两个领域的首选语言之一。本…

私有化要约溢价60%,欧舒丹与投资者的相互成就

港股市场迎来新一轮私有化浪潮。据上海证券报不完全统计&#xff0c;自2023年以来&#xff0c;已有19家港股上市公司完成私有化退市。 对于深陷港股低估值困境的投资者来说&#xff0c;持仓名单里有公司宣布高溢价私有化要约&#xff0c;可谓“喜大普奔”的消息。 上市公司私…

A股周一低开低走,行情继续炸裂!

今天的A股&#xff0c;让人揪心不已、心情极度炸裂&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开低走&#xff0c;A股又是绿油油的一天&#xff0c;两市近4800家个股在等待着上涨。近一个多月来&#…

快速掌握AI的最佳途径实践

科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为许多人希望掌握的重要技能。对于普通人来说&#xff0c;如何快速有效地学习AI仍然是一个挑战。本文将详细介绍几种快速掌握AI的途径&#xff0c;并提供具体的操作步骤和资源建议。 前言 AI的普及和应用已经深…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一&#xff0c;FL Studio 2024发布引入了新功能&#xff0c;同时采用了新的命名方式&#xff0c;从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Cloud…

国内知名源码交易平台及其特点,建议收藏!

​在数字化时代&#xff0c;源码交易平台成为连接开发者与项目需求的重要桥梁。这些平台不仅提供了丰富的源码资源&#xff0c;还促进了技术交流与合作。本文小编将分享介绍几个国内知名的源码交易平台&#xff0c;包括帮企商城、春哥技术博客、86资源网、春哥技术源码论坛以及…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年&#xff0c;在可口可乐、朝日、麒麟等饮料巨头先后入局&#xff0c;市场竞争非常激烈的情况下&#xff0c;BOSS咖啡成为受国民欢迎的品牌&#xff0c;它是如何做到的呢? 罐装咖啡趋势崛起&#xff0c;各大品牌推出罐装咖啡 自1980年代起&#xff0c;罐装…

2024世界人工智能大会|实在智能孙林君分享实在Agent创新应用与落地进展

近日&#xff0c;2024世界人工智能大会&#xff08;WAIC 2024&#xff09;在上海举办&#xff0c;汇聚了9位图灵奖、菲尔兹奖、诺贝尔奖得主、88位国内外院士及超过1000位全球全球领军人物&#xff0c;共同探讨AI伦理治理、大模型、数据、算力等前沿议题&#xff0c;把握AI带来…

java-spring boot光速入门教程(超详细!!)

目录 一、引言 1.1 初始化配置 1.2 整合第三方框架 1.3 后期维护 1.4 部署工程 1.5 敏捷式开发 二、SpringBoot介绍 spring boot 2.1 搭建一个spring boot工程 2.2 使用idea创建项目 2.3 在线创建姿势 2.4 项目的目录结构 2.5 项目的运行方式 2.6 yml文件格式 2…

网络资源模板--Android Studio 外卖点餐App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 原创外卖点餐&#xff1a;基于Android studio 实现外卖(点)订餐系统 非原创奶茶点餐&#xff1a;网络资源模板--基于 Android Studio 实现的奶茶点餐App报告 一、项目演示 网络资源模板--基于Android …

数字化设计与分析助力建造印度最大污水处理厂

利用 STAAD 开展结构分析和设计&#xff0c;为不稳定土体上的复杂水池系统开发稳定的基础 治理河流 新德里不仅是印度的首都&#xff0c;一个多世纪以来也一直是印度最重要的城市之一。这座城市于 1911 年作为新的政府所在地&#xff0c;历经 20 年时间建成了许多宏伟建筑&…

LlamaGen:自回归模型的图像生成革命

LlamaGen&#xff1a;自回归模型的图像生成革命 1. 突破性进展&#xff1a;LlamaGen超越传统扩散模型 在图像生成领域&#xff0c;LlamaGen团队带来了颠覆性创新。由香港大学和字节跳动的研究人员共同开发的这一模型&#xff0c;不仅在技术上超越了传统的扩散模型&#xff0c;…

颍川韩氏始祖,归顺大汉的弓高侯

弓高侯&#xff0c;听起来十分不顺当&#xff0c;像是域外来音似的。本人的名字更另类——颓当&#xff0c;词典中甚至找不到。然而&#xff0c;弓高曾经是河北的一个县名——弓高县&#xff0c;颓当曾经是匈奴的一个城——颓当城&#xff0c;这两个地名已经不存在了&#xff0…

大模型增量预训练新技巧-解决灾难性遗忘

大模型增量预训练新技巧-解决灾难性遗忘 机器学习算法与自然语言处理 2024年03月21日 00:02 吉林 以下文章来源于NLP工作站 &#xff0c;作者刘聪NLP NLP工作站. AIGC前沿知识分享&落地经验总结 转载自 | NLP工作站 作者 | 刘聪NLP 目前不少开源模型在通用领域具有不错…