Servlet文件的上传与下载详解

目录
  • 文件的上传和下载
    • 1. 文件上传细节
    • 2. 文件上传
    • 3. 文件下载

文件的上传和下载

1. 文件上传细节

要有一个 form 标签,method-post请求 (因为get有长度限制)

form标签的属性 encType 值必须为 multipart/form-data

表示提交的数据以多端(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器

在 form 标签中使用 input type="file" 添加上传的文件

编写服务器代码 (Servlet接收),接受处理上传的数据

文件上传http请求信息:

请求头:Content-Type: multipart/form-data; boundary=------WebKitFormBoundaryCd3g75eOt35olUs7

解析:

  • Content-Type 表示提交的数据类型
  • multipart/form-data 表示以流的形式分段提交服务器
  • boundary 表示每段数据的分隔符,值:----WebKitFormBoundarylXiF4fEzpo9c8L4p 是浏览器每次随机生成的,它就是每段数据的分界符。在每段里面 第一行是对表单项的描述,然后有个空行,下面是提交的值。

请求体:

------WebKitFormBoundaryCd3g75eOt35olUs7
Content-Disposition: form-data; name="username"

zhu
------WebKitFormBoundaryCd3g75eOt35olUs7
Content-Disposition: form-data; name="photo"; filename="head.jpg"
Content-Type: image/jpeg

文件的信息(很长这里省略了)
------WebKitFormBoundaryCd3g75eOt35olUs7--

因为客户端是以按流的方式提交是,所以我们要按流的方式获取,不能这样: req.getParameter("username");

正确用法:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("上传成功");
    ServletInputStream inputStream = req.getInputStream(); // 先得到 字节输入流
    byte[] buffer = new byte[1024]; // 缓冲区
    int readCount = 0;
    while ((readCount = inputStream.read(buffer)) != -1) { // 打印出来的就是上面全部的请求体
        System.out.println(new String(buffer, 0, readCount));
    }
}

2. 文件上传

这种文件上传(常用)有很多第三方提供好的API我们使用进行了,可以帮我们对收到的数据进行解析。

例如:commons-fileupload-1.2.1.jar (依赖于 commons-io-1.4.jar

  • 导入两个jar包
  • 解析

关键的类:

  • ServletFileUpload 类:用于解析上传的数据
  • FileItem 类:每一个表单项
//ServletFileUpload中的方法
// 判断当前上传的数据是否是多端的格式,不是解析不了
public boolean ServletFileUpload.isMultipartContent(HttpServletRequest req)
// 解析上传的数据,FileItem表示每一个表单项
public List<FileItem> parseRequest(HttpServletRequest req)
//FileItem中方法
// 判断当前这个表单项是普通的表单项还是文件上传的类型,true表示普通的
public boolean isFormField()
// 获取表单项name属性值
public String getFieldName()
// 获取当前表单项的值
public String getString() // 可传入字符集,防止乱码,一开始req.setCharacterEncoding("UTF-8");也行
// 获取上传的文件名
public String getName()
// 将上传的文件写道 参数file所指向的磁盘位置
public void write(File file)

Servlet上传文件示例:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8"); // 防止乱码
    resp.setContentType("text/html; charset=utf-8");
    String savePath = getServletContext().getRealPath("/WEB-INF/uploadFile"); //保存的路径
    // 首先判断上传的数据是否是多段的数据
    if (ServletFileUpload.isMultipartContent(req)) {
        FileItemFactory fileItemFactory = new DiskFileItemFactory(); // 创建FileItemFactory工厂的实现类,
        // 创建用于解析上传数据的工具类
        ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
        try {
            List<FileItem> list = servletFileUpload.parseRequest(req); // 解析,得到每一个表单项
            for (FileItem fileItem : list) {
                if (fileItem.isFormField()) { // 普通表单项
                    System.out.print("表单项的name属性值:" + fileItem.getFieldName());
                    System.out.println("  表单项的value:" + fileItem.getString("UTF-8"));
                } else { // 文件类型
                    System.out.print("文件的name属性值:" + fileItem.getFieldName());
                    System.out.println("  上传的文件名:" + fileItem.getName());
                    // 一般会保存到用户访问不能直接访问的目录下 File.separator是系统默认路径分隔符,win下是 /
                    // (下面这是保存到了部署的真是目录下,保存到了服务器中)
                    // 可以用UUID保证文件名的唯一性,防止文件覆盖。
                    // 防止单个目录文件过多影响读写速度,还可以使用目录生成算法分散储存
                    fileItem.write(new File(savePath + File.separator + fileItem.getName()));
                    //fileItem.delete(); //关闭资源
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 文件下载

客户端 ->(发送请求告诉服务器我要下载什么文件) -> 服务器

服务器干的内容:

  • 获取要下载的文件名
  • 读取要下载的文件内容
  • 通过响应头告诉客户端返回的数据类型是什么 (和要下载的类型一致)
  • 告诉的客户端收到的数据是用于下载使用(还是用响应头设置)
  • 把下载的的文件内容回传给客户端下载

这个也能用 commons-io-1.4.jar 的IOUtils 类:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8"); // 防止乱码
    resp.setCharacterEncoding("UTF-8");
    //1.获取要下载的文件名路径名,并通过ServletContext读取读取文件
    String downloadFileName = "head.jpg"; // 我们这里写死了
    ServletContext servletContext = getServletContext();
    String savePath = servletContext.getRealPath("/WEB-INF/upload"); //以前上传文件保存的目录
    String downloadPath = savePath + File.separator + downloadFileName;
    //2.告诉客户端返回的类型
    String downloadType = servletContext.getMimeType(downloadPath); //获取要下载文件的类型 (这个是image/jpeg)
    resp.setContentType(downloadType); // (和要下载的类型一样)
    //3.告诉客户端收到的数据是用于下载的,不是直接显示在页面的
    // Content-Disposition表示收到的数据怎么处理,attachment表示附件下载使用,filename表示下载文件的名字
    // filename名可以不和本地的名字一样,当有中文时会乱码,因为http协议设置的的时候不支持中文,需要进行url编码
    /resp.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
    resp.setHeader("Content-Disposition",
                   "attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));
    InputStream resourceAsStream = servletContext.getResourceAsStream(downloadPath);
    // getResourceAsStream() 传入文件路径,读取文件!!!!!!!!!!!!!
    // 4.commons-io-1.4.jar中有IOUtils我们可以直接用,不用自己read() write()了
    ServletOutputStream outputStream = resp.getOutputStream(); // 获取响应的输出流
    IOUtils.copy(resourceAsStream, outputStream);
    // 读取输入流的信息复制给输出流,输出给客户端,传入一个输入流和输出流 (字节字符流都行)
}

到此这篇关于Servlet文件的上传与下载详解的文章就介绍到这了,更多相关Servlet上传下载文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • servlet实现文件上传、预览、下载、删除功能

    servlet实现文件上传,预览,下载和删除,供大家参考,具体内容如下 一.准备工作: 1.1 文件上传插件:uploadify: 1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar 1.3 将数据转成JSON对象需要jar包:commons-beanutils-1.8.3.jar.commons-collections-3.2.1.jar.commons-lang-2.6.jar.commons-logging-1.1.

  • JavaWeb Servlet实现文件上传与下载功能实例

    目录 前言 项目准备 文件上传 前台页面 文件下载 资源准备 超链接下载 后台实现下载 总结 前言 在上网的时候我们常常遇到文件上传的情况,例如上传头像.上传资料等:当然除了上传,遇见下载的情况也很多,接下来看看我们 servlet 中怎么实现文件的上传和下载. 项目准备 idea:2020.1 jdk:1.8 tomcat:10 项目模板:java Enterprise–>Web Application 文件上传 文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保

  • Servlet实现文件的上传与下载

    前言: 文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下 实现条件: 1.需要一个form标签,method为post请求 2.form的encType属性值为multipart/form-data 3.input标签的type=file 4.需要的jar包() 工程目录: 具体实现: UploadServlet.java(上传) import org.apache.commons.fileupload.FileItem; import org.apache

  • Java Servlet简单实例分享(文件上传下载demo)

    项目结构 src com servletdemo DownloadServlet.java ShowServlet.java UploadServlet.java WebContent jsp servlet download.html fileupload.jsp input.jsp WEB-INF lib commons-fileupload-1.3.1.jar commons-io-2.4.jar 1.简单实例 ShowServlet.java package com.servletdem

  • JavaServlet的文件上传和下载实现方法

    先分析一下上传文件的流程 1-先通过前段页面中的选择文件选择要上传的图片 index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 T

  • java基于servlet编写上传下载功能 类似文件服务器

    本人闲来无事,写了个servlet,实现上传下载功能.启动服务后,可以在一个局域网内当一个小小的文件服务器. 一.准备工作 下载两个jar包: commons-fileupload-1.3.1.jar commons-io-2.2.jar 二.创建一个web工程 我的工程名叫:z-upload 三.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht

  • servlet实现文件上传与下载功能

    本文实例为大家分享了servlet实现文件上传与下载的具体代码,供大家参考,具体内容如下 内容 我们分两大模块来进行讲解,即上传的实现,与下载的实现 上传的实现 注意了我们在写上传表单的时候必须声明提交方式为post类型,enctype="multipart/form-data",这样的话才能实现上传. 当我们提交表单的时候看看响应体中都有什么内容: 好了,我们有了数据了,接下来我们怎么提取数据呢,注意我们已经不能使用requeest.getParamter()方法来进行参数的提取了,

  • Servlet文件的上传与下载详解

    目录 文件的上传和下载 1. 文件上传细节 2. 文件上传 3. 文件下载 文件的上传和下载 1. 文件上传细节 要有一个 form 标签,method-post请求 (因为get有长度限制) form标签的属性 encType 值必须为 multipart/form-data 表示提交的数据以多端(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器 在 form 标签中使用 input type="file" 添加上传的文件 编写服务器代码 (Servlet接收

  • 大规格文件的上传优化思路详解

    在开发过程中,收到这样一个问题反馈,在网站上传 100 MB 以上的文件经常失败,重试也要等老半天,这就难为需要上传大规格文件的用户了.那么应该怎么做才能快速上传,就算失败了再次发送也能从上次中断的地方继续上传呢?下文为你揭晓答案~ 温馨提示:配合 Demo 源码一起阅读效果更佳 整体思路 第一步是结合项目背景,调研比较优化的解决方案. 文件上传失败是老生常谈的问题,常用方案是将一个大文件切片成多个小文件,并行请求接口进行上传,所有请求得到响应后,在服务器端合并所有的分片文件.当分片上传失败,可

  • 微信小程序 网络API 上传、下载详解

    微信小程序 网络API: 微信小程序 网络API发起请求 微信小程序 网络API 上传.下载 微信小程序 网络API Websocket wx.uploadFile(OBJECT) 将本地资源上传到开发者服务器.如页面通过 wx.chooseImage 等接口获取到一个本地资源的临时文件路径后,可通过此接口将本地资源上传到指定服务器.客户端发起一个HTTPS POST请求,其中 Content-Type 为 multipart/form-data . OBJECT参数说明: 参数 类型 必填 说

  • Java 文件上传的实例详解

    Java 文件上传的实例详解 java 文件上传 Java文件上传,介绍几种常用的方法,也是经过本人亲手调试过的 1.jspsmartupload 这个组件用起来是挺方便的,不过就是只适合小文件上传,如果大文件上传的话就不行,查看了一下他的代码,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];居然把整个上传文件都读到内存去了,那如果是上传几十M的文件,同时几个用户上传,服务器稳挂,不

  • 在SpringMVC框架下实现文件的上传和下载示例

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation=&

  • Bootstrap Fileinput文件上传组件用法详解

    最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到我们平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的input type='file',简直不忍直视. 2.不做任何装饰的bootstrap fileinput:(bootstrap fileinput初级进化) 3.bootstrap fileinput高级进化:中文化.可拖拽上传.文件扩展名校验(如果不是需要的文件,不让上传) 拖拽上传 上传中 4.boot

  • SpringMVC实现文件的上传和下载实例代码

    前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

  • JavaWeb 文件的上传和下载功能简单实现代码

    一.文件的上传和下载 1.文件上传的原理分析 1.文件上传的必要前提: a.提供form表单,method必须是post           b.form表单的enctype必须是multipart/form-data           c.提供input type="file"类的上传输入域 2.enctype属性 作用:告知服务器请求正文的MIME类型(请求消息头:Content-Type作用是一致的)      可选值: application/x-www-form-urlen

  • java eclipse 中文件的上传和下载示例解析

    文件的上传与下载(一) 在实现文件上传和下载之前我们需要做一些准备工作,在Apache官网去下载文件上传下载的两个组件,下载链接这里给出:common-fileupload组件下载:http://commons.apache.org/proper/commons-fileupload/ common-io组件下载:http://commons.apache.org/proper/commons-io/根据自己需求下载对应版本 一.创建工程 将所需要的两个开发包导入到工程项目中如图: 二.代码编写

随机推荐