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 文件的上传和下载相关推荐

  1. 手把手教你学javaweb(五)文件的上传和下载

    javaweb项目文件的上传和下载 ​ 在进行文件的上传和下载之前,我们先把javaweb项目做一点点的改动,那就是将LoginServlet的跳转由原来的forward方式改为 redirect方式 ...

  2. javaWeb - 文件的上传下载

    文件的上传和下载 <%--文件的上传和下载文件的上传和下载,是非常常见的功能.很多的系统中,或者软件中都经常使用文件的上传和下载.比如:QQ 头像,就使用了上传.邮箱中也有附件的上传和下载功能. ...

  3. SpringMVC实现文件的上传和下载

    SpringMVC实现文件的上传和下载http://www.bieryun.com/1120.html 前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的 ...

  4. Akka实战:HTTP大文件断点上传、下载,秒传

    2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...

  5. 初学Java Web(7)——文件的上传和下载

    文件上传 文件上传前的准备 在表单中必须有一个上传的控件 <input type="file" name="testImg"/> 因为 GET 方式 ...

  6. SpringMVC实现文件的上传与下载

    文件的上传与下载可以说是工作中经常使用的功能,现在整理一下,希望能够给大家一个参考.这里以 Maven 的形式来创建项目,相关的配置文件会把主要的内容列出来,其他头文件信息不再一一全部的列出.最后会把 ...

  7. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  8. FastDFS:Java客户都实现文件的上传、下载、修改、删除

    FastDFS:Java客户都实现文件的上传.下载.修改.删除 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  9. 文件的上传和下载---学习笔记

    文件上传原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的. JSP中上传文 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(二十二) - 物体识别 - 色彩直方图,支持向量机SVM
  2. stm32 输出PWM
  3. 深入理解InnoDB(6)—独立表空间
  4. SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件
  5. PHP游戏扫码登录器源码 支持一百多种热门游戏登录
  6. LKM:Linux Kernel Map(图解Linux内核)
  7. OpenGL基础50:HDR
  8. linux下esc退不出vi
  9. Android apk如何加固防止被破解(防止逆向编译)
  10. springboot——pom.xml 配置文件的设置
  11. Java并发编程实战 - 笔记
  12. 2022年最新《谷粒学院开发教程》:7 - 渲染前台页面
  13. 热血传奇客户端wil文件中文含义详解
  14. 基于JAVA+SpringBoot+Mybatis+MYSQL的应急值班值守管理系统
  15. 系统架构设计师考试学习目录
  16. 第13周 《C语言及程序设计》实践参考——定期存款利息计算器
  17. Android 实现 遮罩动画效果
  18. 实践《如何使用Seata保证Dubbo微服务间的一致性》
  19. -[XXXX encodeWithCoder:]: unrecognized selector sent to instance 0x12d931d10
  20. 发布包到maven公共仓库图文教程(1) --- 注册账号和提交申请

热门文章

  1. 客户价值和客户创利能力分析(基于改进RFM模型)
  2. 炉石传说 java_炉石传说 java实现
  3. VTK与Python实现机械臂三维模型可视化详解
  4. 【众说区块链】以太坊分片技术提升100倍处理效率,有多大作用?
  5. php免费短,简洁短网址生成源码-php在线短网址生成器带后台
  6. 基于Vue的拖拽插件的实战应用,但最后我还是选择了手写
  7. 晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(一)
  8. 苏州大学计算机组成原理,苏州大学计算机组成原理习题
  9. 开发小技巧-商品价格中间划价实现
  10. Mysqls数据库的表出现the table is full的问题