文件上传下载

文章目录

  • 文件上传下载
    • 文件上传
    • 文件下载

文件上传下载

HTTP请求会包含一个请求头,其中"Content-Type"字段告诉服务器正在发送什么类型的数据。根据发送的数据类型,浏览器和服务器会采取适应的处理方式。

"multipart/form-data"是一种常见的POST数据提交的方式。当表单中使用文件上传字段时,经常需要使用这个值。表单以multipart/form-data方式发送的数据必须以一种特殊编码方式进行编码,使得多个部分可以作为一个整体发送。这种情况常出现在同时发送文件和其他表单数据时。

表单类型有三种常见的MIME类型:

  • “application/x-www-form-urlencoded”,这是默认类型,适合发送简单的文本数据。
  • “multipart/form-data”,适合发送包含所有类型的数据,包括文件数据。
  • “text/plain”,虽不常用,但有其特殊用途,用于发送未经编码的文本数据。

文件上传

在HTML表单中,如果要提交的数据包含文件类型(如:图片,文档等),“enctype"属性需要被设置为"multipart/form-data”。

1)导入依赖:

<dependency><groupId>com.liferay</groupId><artifactId>org.apache.commons.fileupload</artifactId><version>1.2.2.LIFERAY-PATCHED-1</version>
</dependency>

2)前端界面:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>demo</title><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("prevView");//获取文件对象let file = event.files[0];//获取文件阅读器let reader = new FileReader();reader.readAsDataURL(file);reader.onload = function () {//给 img 的 src 设置图片 urlimg.setAttribute("src", this.result);}}</script></head><body><!-- 表单的 enctype 属性要设置为 multipart/form-data --><form action="/zzz" enctype="multipart/form-data" method="post">家居图: <img alt="" height="200" id="prevView" width="200"><input id="" name="pic" onchange="prev(this)" type="file"/>家居名: <input name="name" type="text"><br/><input type="submit" value="上传"/></form></body>
</html>

3)后端接收并保存:

package com.lhs;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;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.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.UUID;public class myServlet02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {// 检查请求的enctype标头是否为multipart/form-data,这意味着请求包含上载的文件if (ServletFileUpload.isMultipartContent(req)) {// 创建一个新的文件项工厂和文件上传对象DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);// 设置请求头的字符编码为UTF-8,解决中文乱码问题servletFileUpload.setHeaderEncoding("utf-8");try {// 解析请求,将每个表单字段和文件作为单独的项目List<FileItem> list = servletFileUpload.parseRequest(req);System.out.println(list);// 迭代这些项目for (FileItem fileItem : list) {// 查看项目是否是一个表单字段还是一个文件 if (!fileItem.isFormField()) {// 定义要上传文件的路径String filePath = "/upload/";// 计算出文件应该被保存的绝对路径String realPath = req.getServletContext().getRealPath(filePath);System.out.println(realPath);// 如果文件路径不存在,那么就创建文件路径if (!Files.isDirectory(Path.of(realPath))) {Files.createDirectory(Path.of(realPath));}// 获取文件的原名String name = fileItem.getName();// 指定文件的新名字,然后写入磁盘fileItem.write(new File(realPath + "/" + UUID.randomUUID() + "_" + name));// 设置响应类型和编码,然后将成功消息写入响应resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("上传成功");}}} catch (Exception e) {throw new RuntimeException(e);}} else {System.out.println("不是表单");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

4)文件按日期分组存储:

//获取当前本地日期
LocalDate localDate = LocalDate.now();//从日期中获取年份
int year = localDate.getYear();//从日期中获取月份
int month = localDate.getMonth().getValue();//从日期中获得日期
int day = localDate.getDayOfMonth();//通过年、月、日构造文件路径字符串
String filePath = "/upload/" + year + "/" + month + "/" + day + "/";//获取此文件路径的真实路径
String realPath = req.getServletContext().getRealPath(filePath);if (!Files.isDirectory(Path.of(realPath))) {//创建该路径下的所有目录Files.createDirectories(Path.of(realPath));
}

文件下载

在Http响应中,当Content-Disposition的值设置为"attachment",那么浏览器通常会尝试下载并保存的响应数据,而不是直接在浏览器中显示它。

1)前端界面:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>demo</title></head><body><h1>文件下载</h1><a href="/zzz?name=1.png">点击下载图片1</a><br/><br><a href="/zzz?name=2.png">点击下载图片2</a><br/><br></body>
</html>

2)将资源存放在web/download目录下

3)后端返回资源:

package com.lhs;import org.apache.commons.io.IOUtils;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;public class myServlet02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Exception {// 设置请求编码格式为utf-8req.setCharacterEncoding("utf-8");// 获取下载资源名String name = req.getParameter("name");// 构建文件的完整路径String fullPath = "/download/" + name;ServletContext servletContext = req.getServletContext();// 获取文件的MIME类型String mimeType = servletContext.getMimeType(fullPath);// 设置响应的内容类型resp.setContentType(mimeType);// 设置响应头,使得浏览器接收到这个响应后,会下载文件,而不是直接打开// filename参数指定下载后的文件名,这里需要进行URL编码,以防文件名有特殊字符resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(name));// 获取要下载的文件的输入流InputStream resourceAsStream = servletContext.getResourceAsStream(fullPath);// 获取响应的输出流ServletOutputStream outputStream = resp.getOutputStream();// 使用Apache的IOUtils工具类,把文件的输入流复制到响应输出流,实现文件下载IOUtils.copy(resourceAsStream, outputStream);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

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

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

相关文章

基于8B/10BGT收发器的PHY层设计(1)

一、PHY层简介 PHY层&#xff08;Physical Layer&#xff09;是OSI模型中最低的一层&#xff0c;也是最基本的一层&#xff0c;PHY是物理接口收发器&#xff0c;它实现物理层。包括MII/GMII&#xff08;介质独立接口&#xff09;子层、PCS&#xff08;物理编码子层&#xff09…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

SQL语言自用(持续更新)+实验记录

课本:《数据库原理及其应用教程》&#xff08;第四版&#xff09; (主编)黄德才&(副主编)陆亿红 实验&#xff1a;学校实验课材料 其他&#xff1a; [ ]表示可以被删除&#xff0c;也表示可以被替换&#xff0c;请自行判断。如果有一些截图或照片&#xff0c;是暂时懒得整…

5、LMDeploy 量化部署 LLMVLM实战(homework)

基础作业&#xff08;结营必做&#xff09; 完成以下任务&#xff0c;并将实现过程记录截图&#xff1a; 配置lmdeploy运行环境 由于环境依赖项存在torch&#xff0c;下载过程可能比较缓慢。InternStudio上提供了快速创建conda环境的方法。打开命令行终端&#xff0c;创建一…

富格林:专研正规技巧助力出金

富格林指出&#xff0c;现货黄金拥有诸多其他投资产品无法比拟的交易优势&#xff0c;如此一来吸引着越来越多投资者相继涌入现货黄金市场。但有不少投资者发现自己的出金效率与他人的有差异。为什么会这样呢&#xff1f;其实在现货黄金市场中需要有正规技巧的支持才可以更好地…

车牌校验正则表达式

1. 规则 传统车牌&#xff1a; 第一位为省份简称&#xff08;汉字&#xff09;&#xff0c;第二位为发牌机关代号&#xff08;A-Z的字母&#xff09;第3到第7位为序号&#xff08;由字母或数字组成&#xff0c;但不存在字母I和O&#xff0c;防止和数字1、0混淆&#xff0c;另外…

跨域问题CORS

所谓跨域访问&#xff0c;其底层就是访问是否同源的问题&#xff0c;跨域问题跟前端的关系不大&#xff0c;后台只要在服务器上配置好浏览器需要的 header 就可以解决跨域的问题。浏览器的请求为什么不能跨越&#xff0c;主要是为了安全&#xff0c;比如攻击者给用户发了一封邮…

鸿蒙开发快速入门

基本概念 ArkTS 因为ArkTS是基于Type Script扩展而来&#xff0c;是Type Script的超集&#xff0c;所以也可以关注一下Type Script的语法来理解ArkTS的语法 ArkUI HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架…

【日常记录】【CSS】SASS循环的使用

文章目录 1、引言2、安装3、举例4、参考链接 1、引言 目前在任何项目框架中&#xff0c;都会有css 预处理器&#xff0c;目前一般使用 sass、less 这俩其中之一&#xff0c;它可以简化css的书写 Sass 是一款强化 CSS 的辅助工具&#xff0c;它在 CSS 语法的基础上增加了变量 (v…

【深度学习实战(2)】如何使用matplotlib.pyplot模块记录自己的训练,验证损失

一、matplotlib库 在我们自己训练模型时&#xff0c;常常会使用matplotlib库来绘制oss和accuracy的曲线图&#xff0c;帮助我们分析模型的训练表现。 matplotlib库安装&#xff1a;pip install matplotlib 二、代码 import matplotlib.pyplot as plt import torch import to…

Leetcode 3116. Kth Smallest Amount With Single Denomination Combination

Leetcode 3116. Kth Smallest Amount With Single Denomination Combination 1. 解题思路2. 代码实现 题目链接&#xff1a;3116. Kth Smallest Amount With Single Denomination Combination 1. 解题思路 这一题思路上我一开始想的是直接法&#xff0c;但是没想到什么好的方…

设计模式-组合模式(Composite Pattern)

1. 概念 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树状的层次结构&#xff0c;用来表示“整体-部分”的关系。 2. 原理结构图 原理图 抽象角色&#xff08;Component&#xff09;&#xff1a;这是组合模式的核心&#xff0c;它定义了树叶和树枝构件的公…

vue3从精通到入门22:自定义 Hooks

自定义 Hooks 就是将可重用的逻辑抽象到一个函数中&#xff0c;这样你可以在不同的组件中重复使用这些逻辑&#xff0c;而不必重复编写相同的代码。 使用场景 1. 处理异步数据 当你需要在多个组件中处理异步数据时&#xff0c;可以创建一个自定义 Hook 来封装相关的逻辑。 …

【产品经理修炼之道】- 融资租赁相关业务介绍

一、什么是融资租赁&#xff1f; 根据《民法典》第735条的规定&#xff0c;融资租赁合同是出租人根据承租人对出卖人、租赁物的选择&#xff0c;向出卖人购买租赁物&#xff0c;提供给承租人使用&#xff0c;承租人支付租金的合同。 例如&#xff0c;A工厂因业务发展需要欲购置…

c/c++普通for循环学习

学习一下 for 循环的几种不同方式&#xff0c;了解一下原理及差异 完整的测试代码参考 GitHub &#xff1a;for 循环测试代码 1 常用形态 对于 for 循环来说&#xff0c;最常用的形态如下 for (表达式1; 表达式2; 表达式3) {// code }流程图如下&#xff1a; 编写测试代码…

stack和queue模拟实现

前言 上一期我们介绍了stack和queue的使用&#xff0c;本期我们来模拟实现一下他们&#xff01; 本期内容介绍 容器适配器 deque介绍 为什么stack和queue的底层选择deque为默认容器&#xff1f; stack 模拟现实 queue 模拟实现 什么是容器适配器&#xff1f; 适配器是一种设…

编程新手必看,Python推导式学习总结(16)

介绍&#xff1a; Python推导式是一种简洁、高效的创建列表、字典或集合的方法。它使用一种类似于数学公式的语法&#xff0c;通过一个表达式和一个循环来生成一个新的数据结构。 以下是一些常见的Python推导式&#xff1a; 列表推导式&#xff08;List Comprehension&#xf…

springboot抑郁症科普知识测试系统ssm-java

本系统设计了二种角色&#xff1a;管理员&#xff0c;用户。通过此系统&#xff0c;管理员可以在线视频、案例展示、、测试试卷、测试试题进行测试。以及在线对测试试卷进行批阅和批量删除&#xff0c;用户可以对自己的测试试卷进行测试&#xff0c;对管理员已经批阅过的试卷可…

MySQL——链表

主键&#xff1a;非空 唯一&#xff08;针对整列数据而言&#xff09; 为了方便管理一般主键都是设置为自增 外键&#xff1a;一张表中的一列的值是另一张表的主键&#xff0c;使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式&#xff1a;s…

Linux ln命令

ln 是 Linux 中的一个重要命令&#xff0c;用于创建硬链接或符号链接&#xff08;也称为软链接&#xff09;。链接在 Unix 和 Linux 系统中是文件系统中的一种对象&#xff0c;它引用另一个文件或目录。 以下是 ln 命令的基本用法和选项&#xff1a; 基本语法 ln [选项] 源文…