Javaweb文件上传至服务器/从服务器下载

思路图

文件上传思路:

也可以直接看代码

  1. 判断是不是文件表单(判断form的enctype是不是="multipart/form-data"),因为只有文件表单才能上传文件

  2. 创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象

  3. 创建一个解析上传数据的工具对象servletFileUpload

  4. 关键的地方, servletFileUpload 对象可以把表单提交的数据 text / 文件,将其封装到为 FileItem 类型的List中,然后就可以遍历,并分别处理表单中的每一个提交的数据

  5. 判断数据是一个text还是文件然后分别进行处理

  6. 如果是一个文件,就把这个上传到 服务器的 temp 下的文件保存到你指定的目录

  7. 指定一个在我们网站工作目录下的目录,(相对于当前 Web 应用程序的虚拟路径)

  8. 获取到指定的虚拟目录的物理实际路径,因为我们上传文件不可能是在一个虚拟的地方

  9. 创建这个指定的目录

  10. 将文件拷贝到该目录

以下是完整代码:放在servlet的dopost/get函数里,为了美观已省略try-catch,为了保证代码美观最好请用电脑全屏观看

//1. 判断是不是文件表单(判断form的enctype是不是="multipart/form-data"),因为只有文件表单才能上传文件
if (ServletFileUpload.isMultipartContent(request)) {
           //2. 创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象
           DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
           //3. 创建一个解析上传数据的工具对象
           ServletFileUpload servletFileUpload =
                   new ServletFileUpload(diskFileItemFactory);
           //解决接收到文件名是中文乱码问题
           servletFileUpload.setHeaderEncoding("utf-8");
           //4. 关键的地方, servletFileUpload 对象可以把表单提交的数据text / 文件,将其封装到 FileItem 文件项中
               List<FileItem> list = servletFileUpload.parseRequest(request);
               //遍历,并分别处理
               for (FileItem fileItem : list) {
                   //判断是不是一个文件
                   if (fileItem.isFormField()) { //如果是true就是文本 input text
                       String name = fileItem.getString("utf-8");    //想要获取input text要通过getString方法获取到
                       System.out.println("家具名=" + name);
                  } else { //是一个文件
                       //获取上传的文件的名字
                       String name = fileItem.getName();
                       System.out.println("上传的文件名=" + name);

                       //把这个上传到 服务器的 temp下 的文件保存到你指定的目录

                       //1.指定一个目录 , 但是这个目录是相对于这个web应用的路径,相当于以xxx_war_exploded这个目录为参照
                       //写一个相对路径表示你要创建的目录
                       String filePath = "/upload/";       //最后一个斜杠表示这个路径指向一个目录,而不是一个文件
                       //2. 获取到指定的虚拟目录的物理路径,request.getServletContext()获取到一个ServletContext,然后它可以调用                         getRealPath(filePath),将filePath转换为物理的实际路径
                       //因为我们知道我们的web应用其实一直是一个放在设定好的application context目录下的一个虚拟路径里。
                       //所以我们要调用getRealPath()将其转换成一个物理上的真实路径,这样才能真实的保存一个文件。
                       //一句话概括这个过程发生了什么呢,其实就是以xxx_war_exploded这个web应用目录为基础,在上一级目录下建一个文件夹叫upload
                       
                       String fileRealPath = request.getServletContext().getRealPath(filePath);
 // fileRealPath=E:fileupdown\out\artifacts\fileupdown_war_exploded\xupload\

                       //3. 创建fileRealPath这个已指定好的用于上传的实际目录
                       File fileRealPathDirectory = new File(fileRealPath);
                       // fileRealPathDirectory=E:fileupdown\out\artifacts\fileupdown_war_exploded\xupload\2023\4\12
                       if (!fileRealPathDirectory.exists()) { //不存在,就创建
                           fileRealPathDirectory.mkdirs(); //创建
                      }
                       
                       //4. 将文件拷贝到fileRealPathDirectory目录
                       //   构建一个上传文件的完整路径 :目录+文件名
                       //   对上传的文件名进行处理, 前面增加一个前缀,保证是唯一即可
                       name = UUID.randomUUID().toString() + "_" +System.currentTimeMillis() + "_" + name;
                       String fileFullPath = fileRealPathDirectory + "/" +name;
//fileFullPath=E:\JavaProject\hspedu_javaweb\fileupdown\out\artifacts\fileupdown_war_exploded\upload\yyyy\mm\dd/name
                       fileItem.write(new File(fileFullPath));
                       
                       //5. 提示信息
                       response.setContentType("text/html;charset=utf-8");
                       response.getWriter().write("上传成功~");
                  }
              }
      } else {
           System.out.println("不是文件表单...");
      }

文件下载思路:

  1. 先准备要下载的文件[假定这些文件是公共的资源],

    重要: 保证当我们的tomcat启动后,在工作目录out下有download文件夹, 并且有可供下载的文件!!

  2. 获取到要下载的文件的名字

  3. 给http响应设置响应头文件格式 Content-Type,就是文件的MIME

  4. 给http响应设置响应头 Content-Disposition来指定下载的数据的展示形式,attachment 则使用文件下载方式,复制以下代码即可

            //(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. 读取下载的文件数据,返回给客户端/浏览器

接下来走一下代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1. 先准备要下载的文件[假定这些文件是公共的资源]
       //   重要: 保证当我们的tomcat启动后,在工作目录out下有download文件夹, 并且有可供下载的文件!!
       //   如果你没有看到你创建的download在工作目录out下 rebuild project -> restart, 就OK

       //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
       //(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 java基础]
       ServletOutputStream outputStream = response.getOutputStream();
       //(3) 使用工具类,将输入流关联的文件,对拷到输出流,并返回给客户端/浏览器
       IOUtils.copy(resourceAsStream, outputStream);
  }

Javaweb文件上传至服务器/从服务器下载的更多相关文章

  1. 将本地文件上传到指定的服务器(HttpWebRequest方法)

    将本地文件上传到指定的服务器(HttpWebRequest方法),通过文件流,带文件名,同文件一同上传的表单文本域及值. ///<summary> /// 将本地文件上传到指定的服务器(H ...

  2. JavaScript进阶(九)JS实现本地文件上传至阿里云服务器

    JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...

  3. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  4. Mac将本地文件上传到Centos7(Linux)服务器上

    1.打开终端,输入命令: scp /Users/codez/Downloads/jdk-8u144-linux-x64.tar.gz root@139.224.235.xxx:/root/java/j ...

  5. springmvc 文件上传实现(不是服务器的)

    1.spring使用了apache-commons下的上传组件,因此,我们需要引用2个jar包 1)apache-commons-fileupload.jar 2 ) apache-commons-i ...

  6. JavaWeb——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. JavaWeb 文件 上传 下载

    文件上传下载对于一个网站来说,重要性不言而喻.今天来分享一个JavaWeb方式实现的文件上传下载的小例子. 项目依赖 项目目录 工作流程 文件上传 表单处的设置 服务器端 上传功能的实现 upload ...

  8. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  9. JavaWeb -- 文件上传下载示例

    1. 上传简单示例 Jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  10. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

随机推荐

  1. 鼎捷ERP二维码整体解决方案 Tiptop GP条码管理系统 鼎捷ERP移动解决方案 鼎捷条码扫描 鼎捷WMS仓库移动扫码 鼎捷安卓PDA扫码方案 Tiptop 出入库盘点出货条码扫码 提供源码

    本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案. 最近定制开发了一套适合企业的条码扫码平台,基于鼎 ...

  2. 内网搭建DNS服务器

    DNS:Domain Name Service,域名解析服务 监听端口:udp/53,tcp/53 应用程序:bind 根域:. 一级域: 组织域:.com, .org, .net, .mil, .e ...

  3. [网络/Java EE/Web]Tomcat/Nginx中配置全局的安全响应头(header)——X-Frame-Options / X-XSS-Protection / X-Content-Options

    Step1 配置Tomcat step1.1 查看是否已配置目标的HTTP网络安全头 方式1 – Tomcat / conf/web.xml cat /opt/myTomcat/conf/web.xm ...

  4. 用Abp实现找回密码和密码强制过期策略

    @ 目录 重置密码 找回密码 发送验证码 校验验证码 发送重置密码链接 创建接口 密码强制过期策略 改写接口 Vue网页端开发 重置密码页面 忘记密码控件 密码过期提示 项目地址 用户找回密码,确切地 ...

  5. 界面重建——Marching cubes算法

    一.引子 对于一个标量场数据,我们可以描绘轮廓(Contouring),包括2D和3D.2D的情况称为轮廓线(contour lines),3D的情况称为表面(surface).他们都是等值线或等值面 ...

  6. Go语言核心知识回顾(反射)

    有时要求写一个函数有能力统一处理各种值类型的函数,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在设计函数时并不存在,当我们无法透视一个未知类型的布局时,这段代码就无法继续,这是就 ...

  7. 6个优化策略,助你降低K8S成本

    Kubernetes 早已成为容器编排引擎的事实标准,而随着 Kubernetes 环境的复杂性持续增长,成本也在不断攀升.CNCF 发布的调查报告<Kubernetes 的 FinOps> ...

  8. Vue项目使用Echarts来实现中国地图,省份显示

    当时做的时候参考了CSND博主:接口写好了吗   第一步:下载echarts  npm install echarts --save main.js中引入 import * as echarts fr ...

  9. 【Visual Leak Detector】核心源码剖析(VLD 1.0)

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇对 VLD 1.0 源码做内存泄漏检测的思路进行剖析.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. 源码 ...

  10. Linux修改系统时间(手动/自动同步)

    一.手动修改 1.在终端窗口中输入date来查看系统当前的时间. 2.使用命令:"date -s 完整日期时间(YYYY-MM-DD hh:mm:ss)" 3.最后使用命令:&qu ...