栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【JavaWeb】]Servlet实现文件上传与下载

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【JavaWeb】]Servlet实现文件上传与下载

✅作者简介:正在学习java全栈,有兴趣的可以关注我一起学习
个人主页:ConderX(摸鱼)的主页
系列专栏:JavaWeb专栏
如果觉得博主的文章还不错的话,请三连支持一下博主哦爛

文章目录
    • 文件上传和下载
      • 项目准备
      • 文件上传
        • 前台页面
        • 后台实现
      • 文件下载
        • 资源准备
        • 超链接下载
        • 后台实现下载

文件上传和下载

​ 在上网的时候我们常常遇到文件上传的情况,例如上传头像、上传资料等;当然除了上传,遇见下载的情况也很多,接下来看看我们 servlet 中怎么实现文件的上传和下载。

项目准备

idea:2020.1

jdk:1.8

tomcat:10

项目模板:java Enterprise–>Web Application

文件上传

​ 文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保存文件,这才是一个完整的文件上传。

前台页面

​ 在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的请求方式为 POST;其次我们的 form 表单的 enctype 必须设为"multipart/form-data",即 enctype=“multipart/form-data”,意思是设置表单的类型为文件上传表单。默认情况下这个表单类型是 “application/x-www-form-urlencoded”, 不能用于文件上传。只有使用了multipart/form-data 才能完整地传递文件数据。




    
    文件上传



姓名:
文件:
后台实现

​ 使用注解 @MultipartConfig 将一个 Servlet 标识为支持文件上传。 Servlet 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作。

package formServlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;

import java.io.IOException;


@WebServlet("/upLoadServlet")
@MultipartConfig  //文件上传注解
public class UploadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上传");
        //设置请求编码格式
        req.setCharacterEncoding("UTF-8");
        //获取普通表单元素
        String uname=req.getParameter("uname");
        System.out.println("uname:"+uname);
        //获取part对象
        Part part=req.getPart("myfile");
        //通过part对象获得上传文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("file:"+fileName);
        //得到文件存放路径
        String filePath = req.getServletContext().getRealPath("/");
        System.out.println("filePath:"+filePath);
        //上传文件到指定路径
        part.write(filePath+"/"+fileName);
    }
}

提交表单后查看控制台打印结果

文件上传
uname:张三
file:exception.jpg
filePath:E:bdqnJavaWebservletoutartifactsservlet_war_exploded
文件下载

​ 文件下载,即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。第一种是通过超链接本身的特性来下载;第二种是通过代码下载。

资源准备

在web目录下新建文件夹存放下载资源,通过tomcat配置添加Deployment到服务器中

超链接下载

​ 当我们在 HTML 或 JSP 页面中使用a标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的资源时会自动下载;当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如 txt、png、jpg 等。当然我们也可以通过 download 属性规定浏览器进行下载。但有些浏览器并不支持。




    
    文件下载




文本文件
图片文件

压缩文件


文本文件下载
图片文件下载



​ download 属性可以不写任何信息,会自动使用默认文件名。如果设置了download属性的值,则使用设置的值做为文件名。当用户打开浏览器点击链接的时候就会直接下载文件。

后台实现下载

实现步骤

  1. 需要通过 response.setContentType 方法设置 Content-type 头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,例 如 “application/octet-stream” 或 “application/x-msdownload” 等。

  2. 需要通过 response.setHeader 方法设置 Content-Disposition 头的值 为 “attachment;filename=文件名”

  3. 读取下载文件,调用 response.getOutputStream 方法向客户端写入附件内容。

package formServlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件下载...");
        //设置请求编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        //获取参数(下载文件名)
        String fileName = req.getParameter("fileName");
        System.out.println(fileName);
        //参数非空判断 trim():去除字符串的前后空格
        if(fileName==null||"".equals(fileName.trim())){
            //参数为空,写入浏览器提示
            resp.getWriter().write("请输入要下载的文件名!");
            resp.getWriter().close();  //关闭流
            return; //退出当前
        }
        //得到文件存放路径
        String filePath=req.getServletContext().getRealPath("/download/");
        //通过路径得到file对象
        File file = new File(filePath + fileName);
        //判断文件对象是否存在并且是标准文件
        if(file.exists()&&file.isFile()){
            //设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型)
            resp.setContentType("application/x-msdownload");
            //设置响应头
            resp.setHeader("Context-Disposition","attachment;filename="+fileName);
            //得到file文件输入流
            FileInputStream fis = new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream sos=resp.getOutputStream();
            //定义byte数组
            byte[] bytes=new byte[1024];
            //定义长度
            int len=fis.read(bytes);
            //循环输出
            while (len!=-1){
                sos.write(bytes,0,len);
            }
            //关闭资源 先打开的后关闭
            sos.close();
            fis.close();
        }else {
            resp.getWriter().write("文件不存在,请重试!");
            resp.getWriter().close();
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836642.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号