【JavaWeb学习笔记】18 - 文件上传下载

项目代码

https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/fileupdown

目录

文件上传

一、基本介绍

二、文件上传的基本原理

​编辑

三、文件上传应用实例

四、文件上传的注意细节

1.解决中文乱码问题

2.分割文件夹

3.防止重名

4.百度WebUploader

5.空目录构建问题

文件下载

一、文件下载原理分析

二、文件下载案例

三、文件下载注意事项细节


文件上传

一、基本介绍

1.文件的上传和下载,是常见的功能。

2.后面项目就使用了文件上传下载。

3.如果是传输大文件,一般用专门工具或者插件

4.文件上传下载需要使用到两个包,需要导入

二、文件上传的基本原理

最后http请求走到servlet

三、文件上传应用实例

四、文件上传的注意细节

1.解决中文乱码问题

            //解决接收到文件名是中文乱码问题servletFileUpload.setHeaderEncoding("utf-8");

2.分割文件夹

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package com.yinhai.utils;import java.time.LocalDateTime;public class WebUtils {public WebUtils() {}public static String getYearMonthDay() {LocalDateTime ldt = LocalDateTime.now();int year = ldt.getYear();int monthValue = ldt.getMonthValue();int dayOfMonth = ldt.getDayOfMonth();String yearMonthDay = year + "-" + monthValue + "-" + dayOfMonth + "/";System.out.println(yearMonthDay);return yearMonthDay;}
}

在创建目录的时候调用工具类返回日期

3.防止重名

//4. 将文件拷贝到fileRealPathDirectory目录
//   构建一个上传文件的完整路径 :目录+文件名
//   对上传的文件名进行处理, 前面增加一个前缀,保证是唯一即可, 不错
name = UUID.randomUUID().toString() + "_" +System.currentTimeMillis() + "_" + name;
String fileFullPath = fileRealPathDirectory + "/" +name;
fileItem.write(new File(fileFullPath));

4.百度WebUploader

一个完美的文件上传,要考虑的因素很多,比如断点续传、控制图片大小,尺寸,分片上传,防止恶意上传等,在项目中,可以考虑使用WebUploader组件(百度开发)
WebUploader API文档 - Web Uploader

5.空目录构建问题

文件上传,创建web/upload的文件夹,在tomcat启动时,没有在out目录下创建对应的upload文件夹,原因是tomcat对应空目录是不会在out下创建相应目录的,所以,只需在upload目录下,放一个文件即可这个是Idea + Tomcat的问题,实际开发不会存在

6.多文件上传,改变一下前端页面即可,数组是会默认拿出来的

文件下载

一、文件下载原理分析

二、文件下载案例

downloadServlet

package com.yinhai.servlet;import com.sun.org.apache.bcel.internal.generic.NEW;
import com.yinhai.utils.WebUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;/*** @author 银小海* @version 1.0* @email yinhai14@qq.com*/
@WebServlet(name = "FileUploadServlet",urlPatterns = "/fileUpload")
public class FileUploadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("be invoked...");//1.判断是不是文件表单(enctype=“multipart/form-data”)if(ServletFileUpload.isMultipartContent(request)){System.out.println("OK! this is fileUpload!!!");//2. 创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();//3. 创建一个解析上传数据的工具对象/***     表单提交的数据就是 input 元素*     <input type="file" name="pic" id="" value="2xxx.jpg" onchange="prev(this)"/>*     家居名: <input type="text" name="name"><br/>*     <input type="submit" value="上传"/>*/ServletFileUpload servletFileUpload =new ServletFileUpload(diskFileItemFactory);//解决接收到文件名是中文乱码问题servletFileUpload.setHeaderEncoding("utf-8");//4. 关键的地方, servletFileUpload 对象可以把表单提交的数据text/文件//   将其封装到 FileItem 文件项中//   如果我们不知道一个对象是什么结构[1.输出 2.debug 3. 底层自动看到]try {List<FileItem> list = servletFileUpload.parseRequest(request);System.out.println("list" + list);/*list[name=MIKU.jpg,StoreLocation=C:\Users\64301\Desktop\JAVA\apache-tomcat-8.0.50\temp\ upload_32df8824_18ca62f4c87__7f5a_00000000.tmp,size=294099bytes, isFormField=false, FieldName=pic,name=null,StoreLocation=C:\Users\64301\Desktop\JAVA\apache-tomcat-8.0.50\temp\ upload_32df8824_18ca62f4c87__7f5a_00000001.tmp,size=0bytes, isFormField=true, FieldName=name]*///遍历并分别处理for (FileItem fileItem : list) {//System.out.println("fileItem=" + fileItem);//判断是不是一个文本=> 你是OOP程序员if (fileItem.isFormField()) {//如果是true就是文本 input textString name = fileItem.getString("utf-8");// String name = fileItem.getName();System.out.println("输入的名字=" + name);} else {//是一个文件//用一个方法//获取上传的文件的名字String name = fileItem.getName();System.out.println("上传的文件名=" + name);//把这个上传到 服务器的 temp下的文件保存到你指定的目录//1.指定一个目录 , 就是我们网站工作目录下String filePath = "/upload/";//2.获取到完整目录//C:\Users\64301\Desktop\JAVA\code\JavaWeb_LearningCode\out\artifacts\fileupdown_war_exploded\ upload\String fileRealPath = request.getServletContext().getRealPath(filePath) + WebUtils.getYearMonthDay();System.out.println(fileRealPath);//3. 创建这个上传的目录=> 创建目录 => Java基础// 一个工具类,可以返回 /2024-11-11/ 字符串File fileRealPathDirectory = new File(fileRealPath);if(!fileRealPathDirectory.exists()){//不存在就创建boolean mkdirs = fileRealPathDirectory.mkdirs();System.out.println("创建文件夹" + mkdirs);}//4. 将文件拷贝到fileRealPathDirectory目录//   构建一个上传文件的完整路径 :目录+文件名//   对上传的文件名进行处理, 前面增加一个前缀,保证是唯一即可, 不错name = UUID.randomUUID().toString() + "_" +System.currentTimeMillis() + "_" + name;String fileFullPath = fileRealPathDirectory + "/" +name;fileItem.write(new File(fileFullPath));//5. 提示信息response.setContentType("text/html;charset=utf-8");response.getWriter().write("上传成功~");}}} catch (Exception e) {e.printStackTrace();}}else{System.out.println("Dont fileUpload...");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}

download.JSP 

<%--Created by IntelliJ IDEA.User: 银小海Date: 2023/12/26 Time: 22:32To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件下载</title><base href="<%=request.getContextPath()+"/"%>>">
</head>
<body>
<h1>文件下载</h1>
<a href="fileDownload?name=Miku.jpg">点击下载Miku.jpg</a><br/><br/>
<a href="fileDownload?name=Rem.png">点击下载 Rem.png</a><br/><br/>
<%--<a href="fileDownload?name=高山流水.mp3">点击下载 高山流水.mp3</a><br/><br/>--%>
</body>
</html>

三、文件下载注意事项细节

1.文件下载,比较麻烦的就是文件名中文处理

        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"));}

2.因此,老师在代码中,针对不同浏览器做了处理

3.对于网站的文件,很多文件使用另存为即可下载,对于大文件(文档,视频),会使用专业的下载工具(迅雷、百度)

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

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

相关文章

redis 从0到1完整学习 (七):ZipList 数据结构

文章目录 1. 引言2. redis 源码下载3. zipList 数据结构3.1 整体3.2 entry 数据结构分析3.3 连锁更新 4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&am…

常用API:Object

Object Object类的作用&#xff1a; Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有的对象都可以直接使用Object类中提供的一些方法。 Object类的常见方法 方法名说明public String toString&#xff08;&#xff09;返回对象的字符串表示形式publi…

Vue 3 表单处理精讲:打造响应式注册表单的艺术

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃诸葛妙计&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &…

kubernetes -pod 实践

一、资源与对象 1、pod 容器都是由镜像启动的,但在容器外面会包裹通过Pod将容器包裹起来这个是K8s的概念,在这个Pod里面可以有一个或多个容器,那这个Pod的有什么特征呢 Pod里的所有容器都会调度在同一个节点上运行0。Pod中的所有容器会共享同一网络,它们有一个唯一的IP,…

PDF编辑工具--Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款功能强大的PDF编辑和管理软件&#xff0c;它可以帮助用户在创建、编辑、转换和共享PDF文档方面达到前所未有的高度。这款软件提供了丰富的编辑功能&#xff0c;使用户能够轻松添加注释、高亮、下划线、插入文本等&#xff0c;自由地编辑PDF文档。除了…

LeetCode 每日一题 Day 23 || 简单数学题

1276. 不浪费原料的汉堡制作方案 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数tomatoSlices和 cheeseSlices&#xff0c;分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下&am…

枚举的使用

背景以及定义 枚举是在jdk1.5以后引入的.主要用途是:将常量组织起来,在这之前表示一组常量通常使用定义常量的方式: public static final int RED 1; public static final int GREEN 2; public static final int BLUE 3; 但是常量举例有不好的地方,例如:可能碰巧有一个数字…

Leetcode 2972. Count the Number of Incremovable Subarrays II

Leetcode 2972. Count the Number of Incremovable Subarrays II 1. 解题思路2. 代码实现 题目链接:2972. Count the Number of Incremovable Subarrays II 1. 解题思路 这道题需要注意的是&#xff0c;题目要求只能删除一个连续子串&#xff0c;使得剩余的元素变成一个递增…

【Vue3】Vue3使用video-player实现视频播放

一、video-player 介绍 video-player 是一个基于 video.js 的视频播放器组件&#xff0c;它提供了丰富的功能&#xff0c;包括视频播放、暂停、快进、快退、全屏、音量控制等。 video-player 的使用非常简单&#xff0c;如下安装即可。 npm install video.js videojs-player…

【数值分析】反幂法,matlab实现

反幂法20231226 一种求实矩阵 A {A} A 的按模最小的特征值&#xff0c;及其对应的特征向量 x i {x_i} xi​ 的方法&#xff0c;只能求一个。 要保证矩阵最小特征值只有一个&#xff0c;有 n {n} n 个线性无关的特征向量&#xff0c;矩阵可逆。 可以通过求矩阵 A − 1 {A^{…

【Web API系列】使用getDisplayMedia来实现录屏功能

文章目录 前言一、认识getD该处使用的url网络请求的数据。二、使用步骤1.使用方法一实现录屏2.使用方法二实现录屏3. 运行效果 延伸 前言 Web API经过长期的发展&#xff0c;尤其是最近&#xff0c;发展相当迅猛&#xff0c;现在已经支持很多功能了&#xff0c;一些原生就支持…

[Linux]——彻底学通权限

学习权限 一、权限概念二、权限管理2.1文件访问者分类&#xff08;人&#xff09;2.2文件类型和访问权限&#xff08;事物的属性&#xff09;2.3 文件访问权限的相关设置方法 三、目录的权限3.1、进入目录的权限3.2、粘滞位 四、关于权限的总结 一、权限概念 Linux下有两种用户…

【AI】Langchain-Chatchat搭建本地知识库-未完,先记录踩的坑

事先说一下&#xff0c;我本地的显卡4070只有12G显存&#xff0c;无法运行本地知识库&#xff0c;我把自己折腾的过程和遇到的坑先记录一下吧&#xff0c;后续如果有算力的话就再跑一遍试试。后续来了&#xff1a;【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库 …

阿赵UE学习笔记——4、新建关卡

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   之前介绍了虚幻引擎的常用窗口功能&#xff0c;这次开始创建游戏内的世界了。首先先从创建关卡开始。 一、创建新关卡 在使用UE引擎制作游戏&#xff0c;首先要有一个场景作为基础&#xff0c;这个场景在UE里面成为关卡。…

PHP面向对象基础之类、对象和基本特点

类就是同一类事物的划分&#xff0c;比如车&#xff0c;当然车还可以划分其他类&#xff0c;比如小轿车、大卡车等。通俗点&#xff0c;类就是指由变量和作用于变量的函数组成的集合。 对象是类的一个实例&#xff0c;比如车牌固定的一辆车。 面向对象编程的三个特点&#xff1…

带你认识 WIDGET、WINDOW 、FRAME和 FRAMEGROUP

1、概述 在 YonBuilder 移动开发中&#xff0c;开发者需要了解一些常用的概念术语&#xff0c;其中和App整体框架结构及页面层级组成相关最重要几个重要概念&#xff0c;就是 Widget、 Window 和 Frame、frameGroup。掌握了这几个概念&#xff0c;对于开发者开发 App 时的 API…

docker container 指定gpu设备

1&#xff0c; 在yaml中 Turn on GPU access with Docker Compose | Docker Docs Example of a Compose file for running a service with access to 1 GPU device: services:test:image: nvidia/cuda:12.3.1-base-ubuntu20.04command: nvidia-smideploy:resources:reserva…

linux离线安装jdk11

1. 下载java11&#xff0c;Java Downloads | Oracle 2. 文件安装 jdk11&#xff1a; mkdir /usr/lib/jvm/ 将下载的文件&#xff0c;解压到/usr/lib/jvm/下 tar -zxf jdk-11.0.21_linux-x64_bin.tar.gz -C /usr/lib/jvm/ 3. 将以下命令写入bashrc文件 export JAVA_HOME/us…

ARAM 中断实验

思路&#xff1a;按键->EXTI->GIC->CPU->异常向量表 //使能GPIOF时钟 //设置PF9管脚为输入(KEY1) //设置PF9作为EXTI9事件的输入(事件编号对应管脚号) //设置下降沿使能检测EXTI9事件 (也可设置上升沿没有下降沿严谨方便,不同场景不同选择) //设置EXTI9事件不…

26、湾湾国立阳明交通大学、湾湾长庚纪念医院提出:ALL Attention U-Net,独属头部CT分割的[玛格丽特]

本文由台湾国立阳明交通大学、台湾长庚纪念医院于2023年12月16日在arXiv<Image and Video Processing>发表。 论文地址&#xff1a; 2312.10483.pdf (arxiv.org) 0、Abstract 脑出血在 Head CT扫描中作为第一线工具&#xff0c;帮助专家诊断不同类型的出血。然而&…