首页 > 其他分享 >第07章 文件上传和下载

第07章 文件上传和下载

时间:2024-04-05 20:32:29浏览次数:23  
标签:文件 07 html png 上传 我们 下载 图片

在之前的章节中,我们介绍了客户端浏览器向服务器端发起get/post请求,但是这些请求数据还局限在“文本”字符串形式。如果我们需要向服务器端提交文件,例如一张图片,该如何处理?很早之前,处理文件上传需要借助第三方组件,例如commons fileupload等等。但是,在Servlet 3.0之后提供了@MultipartConfig注解和Request.getPart方法,可以方便的处理文件上传。

接下来,我们创建“FileDemo”工程演示如何进行图片的上传。如何创建JavaWeb工程请查看前几章节的内容。工程创建完毕后,我们创建UploadServlet类,对应的请求映射为“/upload”,如下所示

接下来,我们修改UploadServlet类的doGet方法

		// 得到文件对象,参数为<input type="file">的name属性值
		Part part = request.getPart("img_file");
				
		// 获取文件全名称,包含文件类型后缀
		// 请求头的格式:form-data; name="file"; filename="html.png"
		String header = part.getHeader("content-disposition");
		String[] tempArr1 = header.split(";");
		String[] tempArr2 = tempArr1[2].split("=");
		String realName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
		System.out.println("文件名称:" + realName);
		
		// 获取 WebContent 绝对路径
		String realPath = request.getServletContext().getRealPath("/");
		System.out.println("WebContent路径:" + realPath);
		
		// 文件保存全路径
		part.write(realPath + realName);
		
		// 返回图片地址
		String webPath = request.getContextPath() + "/" + realName;
		request.setAttribute("imgAddress", webPath);
		request.getRequestDispatcher("/upload.jsp").forward(request, response);

上述代码我们简单介绍一下。首先,前端页面需要使用“<input type="file" name="img_file">”进行文件上传,后端使用“Part part = request.getPart("img_file");”就可以获取文件对象,其中getPart方法的参数就是“<input type="file"”标签的name属性。接下来,我们获取上传文件的真正名称realName。这里我们要上传一个名称为“html.png”的图片,因此这里获取的realName就是“html.png”。接下来,我们需要将图片保存到WebContent根目录下,所以我们需要获取该目录的绝对路径realPath。有了realPath绝对路径和realName图片名称,我们就可以将其保存了。最后,我们要返回上传图片的Web访问路径,也就是webPath。

接下来,我们创建“index.jsp”文件,代码如下

<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">

	<p>上传图片:<input type="file" name="img_file"></p>
	
	<p><input type="submit" value="上传"></p>
	
</form>

接下来,就是图片文件上传成功后的显示页面“upload.jsp”

<img src="${requestScope.imgAddress}" />

我们运行项目,

点击“选择文件”按钮,选择我们的“html.png”图片文件

点击“上传”按钮

正确显示我们上传的图片,访问地址为:/FileDemo/html.png
我们在Eclipse中查看控制台

我们之前介绍过,Eclipse下的项目运行目录是在工作空间下的“.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps”目录。这里打印出了它的完整路径是“E:\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileDemo”。我们去这个目录下查看一下。

这里我们说明一下图片保存路径的问题。我们为什么要将其保存到WebContent根目录下,因为这个目录是对用户访问时开放的。也就是说,我们将“html.png”放置在WebContent根目录下后,就可以通过“http://localhost:8080/FileDemo/html.png”访问到这张图片。

我们还可以在WebContent下创建一个“images”目录,然后将图片保存到这里。那么我们访问的地址就是“http://localhost:8080/FileDemo/images/html.png”,这个也没有问题。但是,如果我们将图片保存到“WEB-INF”下,我们就不能通过“http://localhost:8080/FileDemo/WEB-INF/html.png”访问到了,因为“WEB-INF”目录是受保护的,不允许用户直接访问。或者说,我们干脆将图片保存到Tomcat之外的目录,那么用户就更无法直接访问了。注意,我只的是“直接访问”,而不是无法访问。因为,有时候,我们需要对文件做权限限制,允许部分身份的用户可以访问,其他则不行。显然这种情况下,我们不可以将图片直接保存到WebContent根目录下或其子目录下。那怎么办呢?很简单,用户不能直接访问,但是我们可以通过java代码读取并返回给用户啊。

接下来,我们将“html.png”放置到“WEB-INF”下,

我们无法通过“http://localhost:8080/FileDemo/WEB-INF/html.png”访问到它。

但是它的确存在于“WEB-INF”目录

接下来,我们创建DownloadServlet类,对应的请求映射为“/download”

接下来,我们直接修改DownloadServlet类的doGet方法

		// 获取图片流
		InputStream in = getServletContext().getResourceAsStream("/WEB-INF/html.png");

		// 图片响应头信息
		response.setContentType("image/png");

		// 输入文件内容(二进制)
		OutputStream out = response.getOutputStream();
		int len = 0;
		byte[] buffer = new byte[1024];
		while((len = in.read(buffer)) != -1){
			out.write(buffer, 0, len);
		}
		in.close();
		out.close();

代码中给出了一部分注释,其实就是读取文件内容,以“流”的形式返回给客户端浏览器。但是,需要大家注意的是,我们需要指定返回客户端的内容类型为“image/png”图片格式。

接下来,我们就可以直接使用“http://localhost:8080/FileDemo/download”访问图片了。

由于是代码控制图片文件的输出,因此我们可以增加自己的业务逻辑代码,控制用户是否有权访问这张图片。关于图片的上传和下载就简单介绍到这里了。

标签:文件,07,html,png,上传,我们,下载,图片
From: https://blog.csdn.net/richieandndsc/article/details/137408107

相关文章

  • 写文章 点击打开程序员子龙的主页 java全套电子书分享(可直接下载)
    books经典的编程书单大全简介:这里汇集如下主题的经典书籍:编程语言、操作系统、计算机网络、系统架构、设计模式、程序员数学、测试、中间件、前端开发、后台开发、网络编程、Linux使用及内核、求职面试、算法与数据结构、数据库、Redis、消息中间件等编程学习书籍。......
  • 07 | Swoole 源码分析之 Channel 通道模块
    原文首发链接:Swoole源码分析之Channel通道模块大家好,我是码农先森。引言通道,用于协程间通讯,支持多生产者协程和多消费者协程。底层自动实现了协程的切换和调度。通道与PHP的Array类似,仅占用内存,没有其他额外的资源申请,所有操作均为内存操作,无IO消耗。底层使用......
  • STM32F103通过labview上位机上传温湿度数据到OneNET物联网平台
    资料下载地址:STM32F103通过labview上位机上传温湿度数据到OneNET物联网平台本实验通过两个STM32单片机设备分别测量室内外的温湿度,并把数据发送到上位机上传到ONENET物联网平台。大体数据传输流程如下:首先是注册OneNET平台账号,进入https://open.iot.10086.cn/ 从开发者......
  • 如何不安装客户端下载百度网盘的文档(以PDF为例)
    百度网盘是目前使用比较广泛的网盘,很多方面,人们都会使用百度网盘来传输资料,由于不占用本地空间,因此比较方便,但是,令我们比较头疼的方面就是,只要文件大一点,便会出现如下情景:这种强制下载给用户的体验感十分不好,那么有什么办法绕过呢?方法是有的,作者不久前摸索出,以下内容,以pdf文件为......
  • P4329 [COCI2006-2007#1] Bond
    原题链接题解二进制dpetc:令\(dp[00110]\)代表前两个任务选23两个人出战的最大成功率则\(dp[00110]=max(dp[00010]+a[3][2],dp[00100]+a[2][3])\)code#include<bits/stdc++.h>usingnamespacestd;doublea[25][25]={0};doubledp[1<<22]={0};intcal(intnow){......
  • 信息学奥赛一本通题目解析:1938:【07NOIP普及组】奖学金(排序)
    【题目描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前55名学生发奖学金。期末,每个学生都有33门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学......
  • 鸿运(通天星CMSV6车载)主动安全监控云平台inspect_file/upload存在任意文件上传漏洞
    声明:本文仅用于技术交流,请勿用于非法用途由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。简介鸿运(通天星CMSV6车载)主动安全监控云平台实现对计算资源、存储资源、网络资源、云应用服务进行7*24小时......
  • CCIE-07-OSPF-TS
    目录实验条件网络拓朴逻辑拓扑实现目标环境配置开始Troubleshooting问题1.R22的e0/0接口配置了网络类型问题2.R22和R21之间的IP地址子网掩码长度不一致问题3.R21的e0/0口配置了被动接口问题4.R3配置了不一致的hello-time问题5.R3汇总了134.56.78.0的网段路由。问题......
  • FL Studio 24.0.99.4077中文版Crack With Keygen {Latest 2024} Free Download
    FLStudio24.0.99.4077中文版是最新、最具影响力的音乐制作工具。它可以与所有类型的音乐一起工作,以产生伟大的音乐。它提供了一个相对简单且易于使用的集成开发环境(IDE)。这个完整的音乐工作站是由比利时公司ImageLine开发的。它的创新理念有助于初学者和专业人士创作、组织......
  • 全能数字音乐工作站(DAW)FL Studio 24.0.99.4077中文版
    期待下一个版本21.3的FLStudio用户可能会惊讶地看到引入了新的版本号。DAW,以前称为“FLStudio21”,显然将在其下一个即将发布的版本中更名为“FLStudio2024”(目前正在进行公开测试)。此前,此版本的测试版曾被公开称为“v21.3betax”,...但截至目前”v21.3测试版3“,I......