JavaWeb 文件的上传和下载
JavaWeb 文件的上传和下载
这是一个简单的案例,让你快速了解JavaWeb中文件的上传和下载
文件的上传和下载是Web开发中非常常见和重要的功能,很多系统中都会经常使用文件的上传和下载。
如:博客头像的提交、邮箱中附件的上传和下载、OA系统中材料的审批
1.文件的上传
要有一个from标签,method=post请求
from标签的encType属性必须为multipart/form-data
在from标签中使用input type=file添加上传的文件
编写服务器代码用来接受解析处理数据
encType=multipart/form-data表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器
为了方便我们需要导入两个第三方jar包
commons-fileupload.jar
commons-io.jar
1.1文件提交页面
<%--Created by IntelliJ IDEA.User: 86182Date: 2020/5/20Time: 21:50To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传</title>
</head>
<body><from action="/uploadServlet" method="post" enctype="multipart/form-data">用 户 名 : <input type="text" name="username"/><br>头 像 : <input type="file" name="photo"/><br><input type="submit" value="上传"/><br></from></body>
</html>
1.2后台处理程序(用Servlet实现)
package com.zhh.servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
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.ServletInputStream;
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;/*** @author ascool_zh* @create 2020-05-21:59*/
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//先判断上传的数据是不是多段数据(只有多段数据才是文件上传)if(ServletFileUpload.isMultipartContent(req)){//创建FileItemFactory工厂实现类FileItemFactory fileItemFactory =new DiskFileItemFactory();//创建用于解析上传数据的工具类ServletFileUpload类ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);//解析上传的数据,得到每一个表单项FileItemtry {List<FileItem> list=servletFileUpload.parseRequest(req);//循环判断,每一个表单项,是普通类型,还是上传的文件for(FileItem fileItem:list){if(fileItem.isFormField()){//普通表单项System.out.println("表单项的name属性值:"+fileItem.getFieldName());//参数UTF-8,解决乱码问题System.out.println("表单项的value属性值"+fileItem.getString("UTF-8"));}else{//上传的文件System.out.println("表单项的name属性值:"+fileItem.getFieldName());//参数UTF-8,解决乱码问题System.out.println("上传的文件名"+fileItem.getName());fileItem.write(new File("WEB-INF/file"+fileItem.getName()));}}} catch (Exception e) {e.printStackTrace();}}}
}
2.文件的下载
- 客户端发请求告诉服务器需要下载的文件
- 获取要下载的文件名
- 读取要下载的文件内容
- 把下载的文件内容回传给客户端
- 在回传前,通过响应头告诉客户端返回的数据类型
- 还要告诉客户端收到的数据是用于下载使用(还是使用响应头)
package com.zhh.servlet;import org.apache.commons.io.IOUtils;import javax.servlet.ServletContext;
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.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;import static javax.xml.crypto.dsig.Transform.BASE64;/*** @author ascool_zh* @create 2020-05-23:22*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取要下载的文件名String downloadFileName="face.jpg";//2.读取要下载的文件内容ServletContext servletContext=getServletContext();//获取要下载的文件类型String mimeType = servletContext.getMimeType("/file/" + downloadFileName);//4.在回传前,通过响应头告诉客户端返回的数据类型resp.setContentType("mimeType");//5.还要告诉客户端收到的数据是用于下载使用(还是使用响应头)//attament表示附件,表示下载使用 filename表示下载的文件名if(req.getHeader("User-Agent").contains("Firefox")){resp.setHeader("Content-Disposition","attament;filename==?UTF-8?B?"+new BASE64Encoder().encode("哈哈.jpg"));}else {resp.setHeader("Content-Disposition", "attament;filename=downloadFileName" + URLEncoder.encode("哈哈.jpg", "UTF-8"));}/*** 斜杠被服务器解析为表示地址:http://ip:port/工程名/* 映射到代码的web目录*/InputStream resourceAsStream=servletContext.getResourceAsStream("/file/"+downloadFileName);//获取响应的输出流OutputStream outputStream=resp.getOutputStream();//读取输入流中的全部数据,复制给输出流,输出给客户端IOUtils.copy(resourceAsStream,outputStream);}
}
JavaWeb 文件的上传和下载相关推荐
- 手把手教你学javaweb(五)文件的上传和下载
javaweb项目文件的上传和下载 在进行文件的上传和下载之前,我们先把javaweb项目做一点点的改动,那就是将LoginServlet的跳转由原来的forward方式改为 redirect方式 ...
- javaWeb - 文件的上传下载
文件的上传和下载 <%--文件的上传和下载文件的上传和下载,是非常常见的功能.很多的系统中,或者软件中都经常使用文件的上传和下载.比如:QQ 头像,就使用了上传.邮箱中也有附件的上传和下载功能. ...
- SpringMVC实现文件的上传和下载
SpringMVC实现文件的上传和下载http://www.bieryun.com/1120.html 前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的 ...
- Akka实战:HTTP大文件断点上传、下载,秒传
2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...
- 初学Java Web(7)——文件的上传和下载
文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...
- SpringMVC实现文件的上传与下载
文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考.这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出.最后会把 ...
- java实现ftp文件的上传与下载
最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...
- FastDFS:Java客户都实现文件的上传、下载、修改、删除
FastDFS:Java客户都实现文件的上传.下载.修改.删除 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...
- 文件的上传和下载---学习笔记
文件上传原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的. JSP中上传文 ...
最新文章
- Udacity机器人软件工程师课程笔记(二十二) - 物体识别 - 色彩直方图,支持向量机SVM
- stm32 输出PWM
- 深入理解InnoDB(6)—独立表空间
- SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
- PHP游戏扫码登录器源码 支持一百多种热门游戏登录
- LKM:Linux Kernel Map(图解Linux内核)
- OpenGL基础50:HDR
- linux下esc退不出vi
- Android apk如何加固防止被破解(防止逆向编译)
- springboot——pom.xml 配置文件的设置
- Java并发编程实战 - 笔记
- 2022年最新《谷粒学院开发教程》:7 - 渲染前台页面
- 热血传奇客户端wil文件中文含义详解
- 基于JAVA+SpringBoot+Mybatis+MYSQL的应急值班值守管理系统
- 系统架构设计师考试学习目录
- 第13周 《C语言及程序设计》实践参考——定期存款利息计算器
- Android 实现 遮罩动画效果
- 实践《如何使用Seata保证Dubbo微服务间的一致性》
- -[XXXX encodeWithCoder:]: unrecognized selector sent to instance 0x12d931d10
- 发布包到maven公共仓库图文教程(1) --- 注册账号和提交申请
热门文章
- 客户价值和客户创利能力分析(基于改进RFM模型)
- 炉石传说 java_炉石传说 java实现
- VTK与Python实现机械臂三维模型可视化详解
- 【众说区块链】以太坊分片技术提升100倍处理效率,有多大作用?
- php免费短,简洁短网址生成源码-php在线短网址生成器带后台
- 基于Vue的拖拽插件的实战应用,但最后我还是选择了手写
- 晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(一)
- 苏州大学计算机组成原理,苏州大学计算机组成原理习题
- 开发小技巧-商品价格中间划价实现
- Mysqls数据库的表出现the table is full的问题