javaweb开发之处理表单上传文件和文件下载

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、基于表单的上传文件

1. enctype属性

当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data。
在 form 元素的语法中,enctype 属性指定将数据发送到服务器时浏览器使用的编码类型。
  
enctype 属性取值: 
application/x-www-form-urlencoded:表单 enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用”%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非 ASCII 字符的文本来说,这种编码不能满足要求。
multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据 。

2. Commons-fileupload 组件

Commons-fileupload 组件是 Apache 开源代码组织用来处理表单文件上传的一个子项目,该组件性能优异,可以支持任意大小的文件的上传。
Commons-fileupload 组件从 1.1 版本开始依赖 Apache 的另一个项目:commons-io。

Commons-fileupload 组件上传的基本原理 
FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作。如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。

3. 示例

UploadServlet.java

package cn.heimar.upload;import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** 1,限制上传文件大小 2,限制上传文件类型 3,设置上传缓存大小*/
public class UploadServlet extends HttpServlet {private String[] allowedSuffix = new String[] { "JPG", "JPEG", "GIF","BMP", "PNG", "ICO" };@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 判断上传的确实是一个包含了文件域的表单boolean isMultipart = ServletFileUpload.isMultipartContent(req);if (isMultipart) {try {// 处理有文件的表单内容// Create a factory for disk-based file itemsDiskFileItemFactory factory = new DiskFileItemFactory();File folder = new File("C:\\uploadtemp");if(!folder.exists()){folder.mkdirs();}// 设置临时文件夹factory.setRepository(folder);// 设置缓存区大小factory.setSizeThreshold(3 * 1024 * 1024);// 创建一个上传处理器ServletFileUpload upload = new ServletFileUpload(factory);// 设置一次请求能够上传的文件总大小upload.setSizeMax(10 * 1024 * 1024);// 解析请求List<FileItem> items = upload.parseRequest(req);//FileItem:包装了普通表单域和文件域的统一对象for (FileItem item : items) {// isFormField是在判断当前FileItem是不是普通表单域if (item.isFormField()) {// item.getFieldName:表单属性名称String name = item.getFieldName();// item.getString:表单属性值String value = item.getString();System.out.println(name + "            " + value);} else {String fieldName = item.getFieldName();String fileName = item.getName();String contentType = item.getContentType();boolean isInMemory = item.isInMemory();long sizeInBytes = item.getSize();// 判断文件类型是否合法String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);if (Arrays.asList(allowedSuffix).contains(suffix.toUpperCase())) {String writeFileName = UUID.randomUUID().toString();String fp = this.getServletContext().getRealPath("/upload")+ File.separator+ writeFileName+ "."+ suffix;item.write(new File(fp));} else {System.out.println("文件类型不合法");}}}} catch (SizeLimitExceededException fx) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}} else {// 按照普通表单的方法处理}}
}

upload.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/upload" method="POST" enctype="multipart/form-data">
<table><tr><td>文件名称:</td><td><input type="text" name="name" /></td></tr><tr><td>文件:</td><td><input type="file" " name="filepath"/></td></tr><tr><td colspan="2"><input type="submit" value="上传" /></td></tr>
</table></form>
</body>
</html>

二、文件下载

情景:

在一些网络系统中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后在传送给客户端。

解决方案:

利用程序编码实现下载。
可以增加安全访问控制,只对经过授权认证的用户提供下载;
可以从任意位置提供下载的数据。

利用程序实现下载需要设置 2 个报头:

Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件。设置Content-Type 的值为:application/x-msdownload

Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type。

示例:

DownloadServlet.java

package cn.heimar.upload;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DownloadServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String filename = req.getParameter("file");/** 设置响应报头 contentType: application/x-msdownload -->* 告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件*/// response.setHeader("content-type", "application/x-msdownload");resp.setContentType("application/x-msdownload");/** 设置响应报头 Content-Disposition: attachment Web 服务器希望浏览器不直接处理相应的实体内容,* 而是由用户选择将相应的实体内容保存到一个文件中*/resp.setHeader("Content-Disposition", "attachment; filename=11111.zip");String filePath = this.getServletContext().getRealPath("/WEB-INF/download")+ File.separator + filename;BufferedInputStream is = new BufferedInputStream(new FileInputStream(filePath));BufferedOutputStream os = new BufferedOutputStream(resp.getOutputStream());byte[] buf = new byte[1024];int len = 0;while ((len = is.read(buf)) != -1) {os.write(buf, 0, len);}is.close();os.close();}}
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="${pageContext.request.contextPath }/download?file=test.zip">点击下载</a>
</body>
</html>


转载于:https://my.oschina.net/hongdengyan/blog/182123

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

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

相关文章

单片机预备知识(电平、进制转换、字节、数据类型)

参考&#xff1a;郭天祥十天带你精通51单片机 网址&#xff1a;https://www.bilibili.com/video/BV1DW411a7mz/?spm_id_from333.788.videocard.0 目录电平特性二进制进制转换1K字节等于多少字节基本数据类型电平特性 二进制 进制转换 也可参考这篇&#xff1a;进制问题和C语言…

c语言程序设计王新萍课后答案,C语言程序设计教程

C语言程序设计教程出版时间&#xff1a;2010年12月定  价&#xff1a;29.80I S B N &#xff1a;9787121116322所属分类&#xff1a;标  签&#xff1a;计算机技术 电子电脑 程序与语言本书由多年从事C语言教学的教师编写。全书共分11章&#xff0c;主要内容包括&#xf…

vue之filter用法

1、全局写法&#xff1a; 全局过滤器必须写在vue实例创建之前。 Vue.filter(testfilter, function (value,text) {// 返回处理后的值return valuetext}) 2、局部写法&#xff1a; 在组件实例对象里挂载。 filters: {changemsg:(val,text)>{return val text}}, 3、使用&…

[summary] 单调队列

2019独角兽企业重金招聘Python工程师标准>>> 很久没做单调队列了╮(╯_╰)╭ 已经不太会了.... 单调队列究其本质就是队列,加上队尾可以删除. 队列都是从队尾插入,队首输出.单调队列也一样. 以队尾到队首递增的单调队列为例,我们需要保证队列的单调性,所以当插入一…

判断同构数 c语言,基于visual Studio2013解决C语言竞赛题之0413同构数

JQuery的基础和应用1.什么是? DOM的作用:提供了一种动态的操作HTML元素的方法. jQuery是一个优秀的js库.用来操作HTML元素的工具. jQuery和DOM ...tomcat 8在win8&period;1中的配置配置jdk: 三个步骤: 1.环境变量>新建 JAVA_HOME C:\Program Files\Java\jdk1.…

段错误的调试方法(printf输出、GDB)

参考&#xff1a;段错误产生原因及简单的调试方法 参考&#xff1a;如何解决段错误 参考&#xff1a;C语言gdb调试之精髓&#xff08;常用命令、多进程、多线程、程序日志&#xff09; 网址&#xff1a;https://www.bilibili.com/video/BV1ei4y1V758?fromsearch&seid40373…

Sparse Feature Learning

1. learn feature from sparse codes (source codes) : http://homes.cs.washington.edu/~lfb/ 2. parse scene(source codes):http://www.cs.illinois.edu/homes/slazebni/转载于:https://www.cnblogs.com/stoneresearch/p/4336332.html

c语言中error c2601,C 语言   dd.cpp(46) : error C2601: 'main' : local function definitions are illegal...

C 语言 dd.cpp(46) : error C2601: main : local function definitions are illegal0#include#includestruct phone{int num;int count;};int convet(char *p){ int i;for(i0;*p!\0;p){switch(*p){ case A:case B:case C:{p[i]2;i;continue;}case D:case E:case F:{p[i]3;i;c…

STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)

参考&#xff1a;基于stm32软件IIC的oled显示温湿度 作者&#xff1a;ZPZ DayUp 发布时间&#xff1a; 2021-07-25 20:52:43 网址&#xff1a;https://blog.csdn.net/m0_56197680/article/details/119077076?spm1001.2014.3001.5501 目录软件模拟IIC时序(起始、停止、应答、发…

区块链:定义未来金融与经济新格局

区块链:定义未来金融与经济新格局 1 区块链是什么 区块链的本质 区块链的本质是一种去中心化的记账系统&#xff0c;区块链与比特币之间的关系就是凯恩斯所说的记账货币与货币之间的关系&#xff0c;区块链是一套由信用记录以及信用记录的清算构成的体系。共识机制与价值载体 共…

Linux出现NOKEY

rpm --import /etc/pki/rpm-gpg/RPM*转载于:https://blog.51cto.com/someos/1338354

at指令返回值检验c语言,学渣求指教,如何识别字符串中的AT命令并逐个输出,求程序!!!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Topic – to implement a parser to retrieve AT command line and print out (1) the tokensone by one and (2) the elapse time of each command line (processing).Please submit the solution in 48 hours.- The solution cou…

hdu 5730 Shell Necklace——多项式求逆+拆系数FFT

题目&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5730 可以用分治FFT。但自己只写了多项式求逆。 和COGS2259几乎很像。设A(x)&#xff0c;指数是长度&#xff0c;系数是方案。 \( A(x)^{k} \) 的 m 次项系数表示 k 个连续段组成长度为 m 的序列的方案数。 \( B(x)…

虚拟磁带库

虚拟磁带库(Virtual Tape Library&#xff0c;VTL)&#xff0c;是指以磁盘作为自身存储介质&#xff0c;并能仿真为物理磁带库的产品。简单的说&#xff0c;虚拟磁带库就是将磁盘空间虚拟为磁带空间&#xff0c;能够在传统的备份软件上实现和传统磁带库同样功能的产品。传统磁带…

w ndows7端口在哪里,win7电脑遇到端口被占用的情况该如何查看并将其关闭

Windows7操作系统的酷炫和强大已经深受用户们的喜欢了&#xff0c;这里根大家分享的是教你查看win7电脑端口是否被占用的技巧&#xff0c;端口是我们在进行远程或者打印机等都会遇到的&#xff0c;但是有很多用户会遇到端口被占用的情况&#xff0c;遇到这样的问题首先就要找出…

STM32F103五分钟入门系列(十三)独立看门狗IWDG

参考&#xff1a;STM32F103五分钟入门系列&#xff08;十三&#xff09;独立看门狗IWDG 作者&#xff1a;自信且爱笑‘ 发布时间&#xff1a;2021-07-31 19:50:28 网址&#xff1a;https://blog.csdn.net/Curnane0_0/article/details/119269391?utm_sourceapp&app_version…

session-cookie 和token登录验证

最近研究了下基于token的身份验证&#xff0c;并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesioncookie转向token校验。对比传统的校验方式&#xff0c;token确实有更好的扩展性与安全性。    传统的sessioncookie身份验证    由于HTTP是无状态的…

高效使用Bitmaps(一) 大Bitmap的加载

转自&#xff1a;http://my.oschina.net/rengwuxian/blog/182885 高效使用Bitmaps有什么好处&#xff1f; 我 们常常提到的“Android程序优化”&#xff0c;通常指的是性能和内存的优化&#xff0c;即&#xff1a;更快的响应速度&#xff0c;更低的内存占用。Android程序的性能…

android自动软键盘,Android自定义软键盘

MyKeyboardAndroid自定义键盘的使用实现步骤第一步&#xff1a;1、新建一个xml文件夹放在res目录下面&#xff0c;然后新建xml文件:money_keyboard.xml2、然后在XML文件中添加按钮布局&#xff0c;这个布局就是键盘的样子了android:horizontalGap"1dp"android:keyWid…

433M射频遥控灯、震动感应灯、WIFI避障小车

目录 433M射频遥控灯1. 433M射频灯的硬件连接2. 具体接线剖析3.课堂干货简述4. 准备工作之环境搭建KEIL_ISP_USBTOTTL驱动5. KEIL建立工程6.电子可编程开关继电器的原理7. 上电灯亮代码编写8. 烧写程序到单片机,实现灯一亮一灭9.遥控灯编程实现及效果验证震动感应灯1. 入门项目…