文件上传和下载

什么是文件上传?

文件上传就是把用户的信息保存起来。

为什么需要文件上传?

在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。

上传组件(工具)

为什么我们要使用上传工具?

为啥我们需要上传组件呢?当我们要获取客户端的数据,我们一般是通过getParameter()方法来获取的。

上传文件数据是经过MIME协议进行分割的,表单进行了二进制封装。也就是说:getParameter()无法获取得到上传文件的数据。

我们首先来看看文件上传http是怎么把数据带过去的

  • jsp页面,表单一定要指定enctype:multipart/form-data

    <form action="${pageContext.request.contextPath }/servlet/UploadServlet1" enctype="multipart/form-data" method="post">
        上传用户:<input type="text" name="username"><br/>
        上传文件1:<input type="file" name="file1"><br/>
        上传文件2:<input type="file" name="file2"><br/>
        <input type="submit" value="提交">
    </form>

  • http抓包

这里写图片描述

  • 尝试在Servlet上使用getParameter()获取数据


        String ss = request.getParameter("username");
        System.out.println(ss);
  • 直接使用getParameter是获取不到数据的。

这里写图片描述

那么我们要怎么办呢????request对象提供了ServletInputStream流给我们读取数据

  • 我们试着读取下文件

        ServletInputStream inputStream = request.getInputStream();

        byte[] bytes = new byte[1024];
        int len = 0;

        while ((len = inputStream.read(bytes)) > 0) {
            System.out.println(new String(bytes, 0, len));
        }
  • 在jsp页面多增添一个input控件

<input type="text" name="password">
  • 我上传的文本文件内容就是111111,读取效果如下:

这里写图片描述

现在我们能够读取上传文件的数据了,但是现在问题又来了:怎么把文件上传个数据和普通传送给服务器的数据分割开来呢???上面在图上我们已经看到了,他们是混合在一起的。

按我们平常的做法是很难分割开来的,所以我们需要上传组件


上传组件有两种

  • FileUpload【操作比较复杂】
  • SamrtUpload【操作比较简单】

FileUpload

要使用FileUpload组件,就需要导入两个jar包

  • commons-io
  • Commons-fileupload

开发步骤

  • 创建解析器工厂对象【DiskFileItemFactory】
  • 通过解析器工厂创建解析器【ServletFileUpload】
  • 调用解析器方法解析request对象,得到所有上传的内容【list】
  • 遍历list,判断每个对象是否是上传文件
    • 如果是普通表单字段,得到字段名和字段值
    • 如果是上传文件,调用InputSteam方法得到输入流,读取上传的数据

快速入门



        try{

            //1.得到解析器工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();

            //2.得到解析器
            ServletFileUpload upload = new ServletFileUpload(factory);

            //3.判断上传表单的类型
            if(!upload.isMultipartContent(request)){
                //上传表单为普通表单,则按照传统方式获取数据即可
                return;
            }

            //为上传表单,则调用解析器解析上传数据
            List<FileItem> list = upload.parseRequest(request);  //FileItem

            //遍历list,得到用于封装第一个上传输入项数据fileItem对象
            for(FileItem item : list){

                if(item.isFormField()){
                    //得到的是普通输入项
                    String name = item.getFieldName();  //得到输入项的名称
                    String value = item.getString();
                    System.out.println(name + "=" + value);
                }else{
                    //得到上传输入项
                    String filename = item.getName();  //得到上传文件名  C:\Documents and Settings\ThinkPad\桌面\1.txt
                    filename = filename.substring(filename.lastIndexOf("\\")+1);
                    InputStream in = item.getInputStream();   //得到上传数据
                    int len = 0;
                    byte buffer[]= new byte[1024];


                    String savepath = this.getServletContext().getRealPath("/upload");
                    FileOutputStream out = new FileOutputStream(savepath + "\\" + filename);  //向upload目录中写入文件
                    while((len=in.read(buffer))>0){
                        out.write(buffer, 0, len);
                    }

                    in.close();
                    out.close();
                }
            }

        }catch (Exception e) {
            e.printStackTrace();
        }

测试

  • 普通的字段和上传的文件都能读取得到了!

这里写图片描述


SmartUpload

要使用SmartUpload组件,就需要导入smartupload.jar开发包

快速入门



        //实例化组件
        SmartUpload smartUpload = new SmartUpload();

        //初始化上传操作
        smartUpload.initialize(this.getServletConfig(), request, response);


        try {

            //上传准备
            smartUpload.upload();

            //对于普通数据,单纯到request对象是无法获取得到提交参数的。也是需要依赖smartUpload
            String password = smartUpload.getRequest().getParameter("password");
            System.out.println(password);

            //上传到uploadFile文件夹中
            smartUpload.save("uploadFile");


        } catch (SmartUploadException e) {
            e.printStackTrace();
        }

测试

同样地,我们可以上传文件到uploadFile文件夹中。代码量也的确减少很多!

也能够获取普通字段的参数

这里写图片描述


上传文件名的中文乱码和上传数据的中文乱码

  • 我把文件名改成中文,就乱码了:

这里写图片描述

  • 表单提交过来的中文数据也乱码了。

这里写图片描述

上面已经说了,上传文件的数据的表单进行了二进制封装,所以使用request对数据编码编码,对于表单提交过来的数据是不奏效的!

FileUpload解决乱码

使用FileUpload解决乱码问题是十分简单的

  • 解决中文文件名乱码,得到解析器以后,就直接设置解析器的编码为UTF-8就行了!


        //设置upload的编码
        fileUpload.setHeaderEncoding("UTF-8");
  • 解决表单数据乱码,在获取表单值的时候,按照UTF-8编码来获取

   String value = fileItem.getString("UTF-8");

效果:

这里写图片描述


SmartUpload解决乱码

这个组件解决乱码问题有点麻烦,在网上找了各种办法也没找到简单的……

所以,如果数据不涉及到中文就使用SmartUpload组件,涉及到中文数据就使用FileUpload组件吧!


多个文件上传,动态添加上传控件

假设我现在有多个文件要上传,而且要上传的个数是不确定的。那么我们要怎么办呢???

我们不可能列出很多很多个上传文件的控件在页面上,这样不美观。如果用户用不到那么多个控件,也浪费呀。

所以,我们想要动态地增添上传文件的控件,如果用户还想要上传文件,只需要动态地生成控件出来即可!

分析

要想在页面上动态地生成控件,无非就是使用JavaScript代码。

那么我们要怎么做呢??

这样子吧:当用户想要上传文件的时候,就点击按钮,按钮绑定事件,生成文件上传的控件。

为了做得更加完善,每当生成了文件上传的控件,也提供一个删除按钮,删除该控件!

我们应该使用div装载着我们要生成的控件和删除按钮,而用户点击删除的时候,应该是要把删除按钮和文件上传控件都一起隐藏起来的。所以,最好就是使用嵌套div!

代码

  • 页面代码:


<table border="1px">

    <tr>
        <td>上传用户:</td>
        <td><input type="text" name="username"></td>
    </tr>

    <tr>
        <td>添加上传文件</td>
        <td><input type="button" value="添加上传文件" onclick="addUploadFile()"> </td>
    </tr>

    <tr>

        <td>
            <div id="file">
            </div>
        </td>
    </tr>

</table>
  • javaScript代码

    <script type="text/javascript">

        function addUploadFile() {

            //生成文件上传控件
            var input = document.createElement("input");
            input.type = 'file';
            input.name = 'fileName';


            //生成删除按钮
            var del = document.createElement("input");
            del.type = 'button';
            del.value = '删除';

            //生成内部的div
            var innerDiv = document.createElement("div");

            //将两个控件绑定到内部div上
            innerDiv.appendChild(input);
            innerDiv.appendChild(del);

            //得到外部div控件,并将内部div绑定到外部div上
            var outterDiv = document.getElementById("file");
            outterDiv.appendChild(innerDiv);

            //为删除按钮绑定事件
            del.onclick = function dele() {

                //调用外界div的remove方法把内部的div干掉
                this.parentNode.parentNode.removeChild(this.parentNode);
            }

        }

    </script>

文件上传细节

  • 如果上传文件的大小大于我们设定文件的大小,那么文件在上传的时候会使用临时文件保存上传数据。在上传完毕后,我们应该删除临时文件
  • 上传文件的位置是不能在WEB服务器管理之下的,否则可能造成安全问题【其他人有可能通过手段来修改上传文件】
  • 如果上传文件名相同,那么就会把原本的上传文件覆盖掉。我们要生成一个独一无二的文件名。
  • 如果用户量很大,上传文件非常多。那么我们不应该在一个目录保存所有的上传文件,这样很可能造成磁盘奔溃了。所以我们要把上传的文件打散到不同的目录下。

分析

删除临时文件问题是非常简单的,只需要在所有的操作完毕之后,调用FileItem的delete()方法即可

让上传文件的位置不能在WEB服务器管理之下,我们把上传文件的位置放到WEB-INF/目录下即可!

文件名相同的问题,我们可以使用UUID+用户上传的文件名来作为我们保存上传文件名。这样的文件名就是独一无二的了。

要将上传的文件进行打散,那么我们需要使用HashCode算法来进行打散。

  • 低四位生成一级目录
  • 5-8位生成二级目录

代码

下面我们写一个比较完善的上传文件代码

  • 使用hashCode算法来打散保存的目录

    private String makeDirPath(String fileName, String path) {

        //通过文件名来算出一级目录和二级目录
        int hashCode = fileName.hashCode();
        int dir1 = hashCode & 0xf;
        int dir2 = (hashCode & 0xf0) >> 4;

        String dir = path + "\\" + dir1 + "\\" + dir2;

        //如果该目录不存在,就创建目录
        File file = new File(dir);
        if (!file.exists()) {

            file.mkdirs();
        }
        //返回全路径
        return dir;

    }

  • 生成独一无二的文件名


    private String makeFileName(String fileName) {

        //使用下划线把UUID和文件名分割开来,后面可能会解析文件名的。
        return UUID.randomUUID().toString() + "_"+ fileName;

    }
  • 上传的代码


        //创建工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();

        //通过工厂创建解析器
        ServletFileUpload fileUpload = new ServletFileUpload(factory);

        //设置upload的编码
        fileUpload.setHeaderEncoding("UTF-8");

        //判断上传表单的类型
        if(!fileUpload.isMultipartContent(request)){
            //上传表单为普通表单,则按照传统方式获取数据即可
            return;
        }

        try {

            //解析request对象,得到List【装载着上传的全部内容】
            List<FileItem> list = fileUpload.parseRequest(request);

            //遍历List,判断装载的内容是普通字段还是上传文件
            for (FileItem fileItem : list) {

                //如果是普通输入项
                if (fileItem.isFormField()) {

                    //得到输入项的名称和值
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");

                    System.out.println(name + " = " + value);
                } else {

                    //如果是上传文件

                    //得到上传名称【包括路径名】
                    String fileName = fileItem.getName();

                    //截取文件名
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);

                    //生成独一无二的文件名
                    fileName = makeFileName(fileName);

                    InputStream inputStream = fileItem.getInputStream();

                    //得到项目的路径,把上传文件写到项目中
                    String path = this.getServletContext().getRealPath("/WEB-INF/uploadFile");

                    //得到分散后的目录路径
                    String realPath = makeDirPath(fileName, path);

                    FileOutputStream outputStream = new FileOutputStream(realPath + "\\" + fileName);

                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(bytes)) > 0) {
                        outputStream.write(bytes, 0, len);
                    }

                    inputStream.close();
                    outputStream.close();

                    //删除临时文件的数据
                    fileItem.delete();

                }
            }

        } catch (FileUploadException e) {
            e.printStackTrace();
        }

效果:

  • 成功把目录打散,文件名也是独一无二的了。

这里写图片描述


列出上传目录下的文件,提供下载

在讲解respose对象的时候已经讲解过文件下载了。这次我们就直接写一个小案例来巩固文件下载把。

  • 上传目录下的文件有3个

这里写图片描述

分析

首先,要把目录下的文件都列出来。由于后面要根据文件名对文件进行下载,所以我们用一个Map集合来保存所有的文件

下载文件部分也很简单,根据文件名和上传文件位置找到对应的文件,对其进行读写,然后修改消息头实现下载就好了。

代码

  • 将存放在WEB-INF/目录下的文件全部放在Map集合中


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        //得到上传文件的目录
        String filePath = this.getServletContext().getRealPath("/WEB-INF/uploadFile");

        Map map = new HashMap();

        //使用递归来得到所有的文件,并添加到Map集合中
        getAllFiles(new File(filePath), map);

        request.setAttribute("map", map);
        request.getRequestDispatcher("/listFile.jsp").forward(request, response);



    }

    private void getAllFiles(File filePath, Map map) {

        //如果不是文件,那么它就是文件夹
        if (!filePath.isFile()) {

            //列出文件夹下所有的文件(可能是文件,可能是文件夹)
            File[] files = filePath.listFiles();
            for (File file : files) {

                //得到的文件(或者是文件夹)再对其进行判断
                getAllFiles(file, map);
            }
        } else {
            //进入到else语句了,肯定是文件了

            //得到文件名
            String fileName = filePath.getName().substring(filePath.getName().lastIndexOf("_") + 1);

            //我们将文件全名作为key,文件名作为value保存在map集合中
            map.put(filePath.getName(), fileName);

        }

    }
  • 在JSP页面中显示可以下载的文件



<c:forEach items="${map}" var="me">

    <c:url var="url" value="/DownFileServlet">
        <c:param name="fileName" value="${me.key}"></c:param>
    </c:url>
    ${me.value}<a href="${url}">下载!</a><br>

</c:forEach>
  • 实现下载的Servlet
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //得到文件的全名
        String fileName = request.getParameter("fileName");

        //如果是中文数据,需要转码。
        fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");

        //得到保存文件的位置
        String path = this.getServletContext().getRealPath("/WEB-INF/uploadFile");

        //文件是通过文件名进行hashCode打散保存的,通过文件名拿到文件绝对路径
        String fileRealPath = makeFilePath(fileName, path);
        System.out.println(fileRealPath);

        //判断文件是否存在
        File file = new File(fileRealPath);
        if (!file.exists()) {
            request.setAttribute("message", "您要下载的资源不存在了!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return ;
        }

        //存在

        //读取该文件并把数据写给浏览器
        FileInputStream inputStream = new FileInputStream(fileRealPath);
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(bytes)) > 0) {
            response.getOutputStream().write(bytes, 0, len);
        }

        inputStream.close();


        //设置消息头,告诉浏览器,这是下载的文件
        String name = fileName.substring(fileName.lastIndexOf("_") + 1);
        response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(name, "UTF-8"));

    }

    private String makeFilePath(String fileName, String path) {

        int hashCode = fileName.hashCode();

        int dir1 = hashCode & 0xf;
        int dir2 = (hashCode & 0xf0) >> 4;

        String dir = path + "\\" + dir1 + "\\" + dir2 +"\\"+ fileName;
        return dir;
    }

效果

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
手把手教你用闲置安卓手机+蓝鲸支付,零成本搞定个人项目自动收款(附私有化部署教程) 本文详细介绍了如何利用闲置安卓手机和蓝鲸支付系统,零成本搭建个人项目自动收款解决方案。通过私有化部署教程,读者可以学习到从手机选择、系统配置到支付渠道对接的全流程,实现安全、高效的收款系统,特别适合个人开发者和小型项目使用。 阅读详情

相关推荐

暗月项目七详解

本文围绕“暗月靶场项目七”展开,记录了一次从外网 Web 入口逐步深入内网并最终获取域控目标的完整实训过程。

Re_K123的博客 416

傲拓PLC,NApro程序上载说明

注意:如果之前在的程序设置未勾选允许程序上载,便不能上载任何东西!上载成功后显示如下提示,并点击保存编译按钮进行项目编译。2)填写要上载的PLC IP地址。3)填写要上载的文件名称后点击确定。选择第一步创建的文件夹,并填写文件名后点击保存。第三步:1)点击菜单栏下载按钮,选择上载全部。第二步:打开NAPro编程软件,新建项目。第一步:在桌面新建空白文件夹。

weixin_44281509的博客 1024

Windows批处理脚本实战:用Ping命令打造简易网络监控工具(附完整代码)

本文介绍如何利用Windows批处理脚本和Ping命令,快速构建一个轻量级、自动化的网络监控工具。该方案无需额外安装软件,通过周期性探测目标IP连通性,并将结果(成功、失败及延迟)自动记录到带时间戳的日志文件中,适合中小团队或临时监控需求,实现低成本、高效率的网络状态监控。

5f4d3s2a1q的博客 494

记录一次图片上传(非SpringMVC)

记录一次图片上传 一、提前准备 1、需要知道 一般进行图片上传处理的时候,将图片保存到oss中,路径保存到数据库,使用的时候调用路径即可 前端代码: 在java中使用form表单上传文件时form标签中必须加上 enctype=“multipart/form-data” enctype: 规定在发送到服务器之前应该如何对表单数据进行编码。 enctype的三个参数: |- application/x-www-form-urlencoded: 在发送前编码所有字符(默认) |- multipart/fo

Mr_QinHongXin的博客 336

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

TC387 MCMCAN Message RAM配置详解:Tx Buffer与Rx FIFO地址布局

在嵌入式CAN/CAN FD通信系统中,缓冲区和FIFO是数据收发的核心机制,而AURIX TC3xx系列单片机将这一机制集成在了MCMCAN模块专用的Message RAM中。这是一块由CAN控制器独占的内存区域,开发人员需要按照寄存器规范手动划分Tx Buffer、Rx FIFO、过滤元素等子区间。合理的RAM布局能确保不同功能区域互不重叠、有序排列,避免数据覆盖与错帧。通过掌握TXBC、RXF0C等配置寄存器的字段含义,结合实用的地址布局表,可以显著降低多节点CAN通信的调试成本。本内容面向使用TC3

weixin_34226182的博客 221

SpringMVC教程(十一)

SpringMVC:文件上传和下载 2019-10-19/Java/狂神说位置:Home»Java»本页 准备工作 ​ 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配...

qq_39825574的博客 584

2024从零开始使用VSCode编程(静态页面制作篇)HTML+CSS+JS阶段

VSCode第一个前端静态页面的编写

ssrsrrn的博客 9590

Java 文件上传 三种方式

一:配置springBoot上传文件限制 spring: servlet: multipart: max-file-size: 100MB #单个文件大小 max-request-size: 1024MB #总文件大小 二:代码 import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.spri

qq_50990903的博客 2万+

如何实现一个用STM32F103C8T6作为主控芯片,加上AD8232、MAX30102 、MPU6050模块的用于运动中监测心率变异性??

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1212

mapbox高阶,加载倾斜摄影

本文详细介绍如何基于mapbox-gl v3.8.0版本实现倾斜摄影的加载,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 345

Java文件上传【通用】

Java文件上传 主要是针对于网页来说,一般是通过input的file类型上传文件流到后台,再通过后台处理将文件移动到指定位置达到上传的目的。 这里贴代码时,主要是以springboot框架为例,但是是通用的。 1、表单提交上传 <form enctype="multipart/form-data" method="post" action="/upload"> 文件:<input type="file" name="fileUpload"/> <input t

21届Java攻城狮&Python民兵 2万+

如何对EMB电子机械制动器的热衰退问题进行优化

摘要 电子机械制动器(EMB)在新能源汽车和自动驾驶中具有重要应用价值,但其在高强度工况下会出现热衰退现象。本文分析了EMB热衰退的五大机理:摩擦副热效应、电机热衰退、减速机构热失效、温度对控制策略干扰以及结构设计导致的热积累。针对这些问题,提出了从材料、结构、控制三个维度的优化措施:升级耐高温材料、改进散热设计、优化控制算法等。通过"热生成抑制-热传导优化-热失效补偿"的系统方案,可有效改善EMB的热衰退问题,为智能汽车提供更可靠的制动保障。

m0_59012156的博客 342

JavaWeb 文件上传和下载

JavaWeb——文件上传与下载 内容分享。

优快云 / 稀土掘金/ B站 / GitHub: Cyan_RA9 4479

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于springboot文件上传和下载

基于springboot文件上传和下载

hyt_struggle的博客 5197

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SpringBoot如何实现文件上传和下载

文件上传 其实文件上传无非就是文件的读取和写入,明白这个道理之后就好办了。 前端页面 <form method="POST" action="/fileUpload" enctype="multipart/form-data"> <input type="file" id="myFile" name="myFile" /><br/> <in...

wunianisme的博客 1678

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JSP实现文件上传和文件下载

JSP实现文件上传和文件下载 目录 JSP实现文件上传和文件下载 1. 文件上传 1.2 核心逻辑 1.3 中文乱码和名字重复 2. 文件下载 2.2 核心逻辑 2.3 中文乱码处理 3. 通用 Servlet 实现文件上传下载 IDEA 环境配置:导入依赖 jar 包。 commons-fileupload-1.4.jar commons-io-2.6.jar 1. 文件上传 本质就是将一台电脑中的文件根据网络协议通过 io 流传递到另一台电脑(服务器)上。 1.1 三要素

zgphacker2010的专栏 3638

SpringBoot文件上传和下载

SpringBoot文件上传和下载 一、SpringBoot文件上传 1、SpringMVC文件上传 1、Client处理 选择文件 (1)form表单 选择文件 method="post" (2)enctype="multipart/form-data" (3) 准备文件框<input type="file" name="upload"> 2、服务端准备存储上传文件的目录 新建文件夹 项目/webapp/upload文件 3、开发文件上传Controller public

程序员小王的博客 1万+

JavaWeb——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上...

zhangyuliang6430的博客 194

【文件上传和下载教科书】JavaWeb文件上传和下载技术总结

文章目录@[toc]前言一、文件上传1.1 文件上传的核心思想1.2 文件上传中JSP的三要素1.3 上传文件核心jar包1.4 文件上传的细节处理1.4.1 文件名重复覆盖问题1.4.2 使用目录分离算法存储文件1.4.3 文件上传jar包API二、文件下载2.1 文件下载的核心思想2.2 文件下载的两种格式2.3 手动编写代码方式的三要素2.4 文件下载的细节处理2.4.1 解决下载文件后名称...

奈何的人生 1404

SpringMVC文件上传和下载

将要下载的文件以字节流的形式写入到响应的输出流中,即通过使用 response.getOutputStream().write(byteArray) 将文件内容返回给客户端。在控制器方法中,可以通过专门的文件处理逻辑来处理上传的文件。电子商务平台:商家可以上传产品图片,用户可以下载产品说明书、用户手册等。医疗系统:医生可以上传检查报告、影像资料,患者可以下载自己的健康档案。在线教育平台:教师可以上传课件、资料,学生可以下载学习资料、作业等。企业应用:员工可以上传和下载团队文件、报告、表格以及其他工作文档。

时间如瑾 代码如诗 1612

java文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。   对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileup

享受技术!享受快乐! 3178

Javaweb 文件上传和下载

以上示例展示了如何借助 Apache Commons FileUpload 和 Commons IO 实现一个简洁版的文件上传与下载功能。虽然该实现相对基础,仍有许多可以优化和增强的空间,但它对于理解文件上传下载的核心流程与底层机制具有重要价值。通过这一案例,我们不仅掌握了表单数据的解析、文件流的处理等关键步骤,也为今后使用更高级的框架(如 Spring Boot 中的 Multipart 处理)以及集成第三方对象存储服务(如阿里云 OSS 或 MinIO)打下了扎实的基础。

weixin_43415514的博客 1859
上一篇: 监听器【第二篇应用】
下一篇: -128补码
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值