Erlo

Servlet p8 文件的上传和下载

2023-07-12 17:00:10 发布   88 浏览  
页面报错/反馈
已收藏 点赞

文件的上传和下载

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

文件上传

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

前台页面

在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并目表单的请求方式为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对上传的文件进行操作。

代码实现:

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

/**
 * @author: 86199
 * @date: 2023/7/3 15:34
 * Description: 文件上传后台代码
 */

@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对象(Servlet 会将 multipart/form-data 的Post请求封装成一个Part对象)
        Part part = req.getPart("myfile");

        //获取文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上传文件名 " + fileName);

        //文件存放路径
        String realPath = req.getServletContext().getRealPath("/");
        System.out.println("文件存放路径:" + realPath);

        //上传文件到指定目录
        part.write(realPath + "/" + fileName);
    }
}

文件下载

文件下载

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

超链接下载

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

默认下载:


文本文件

指定download属性下载:


文本文件

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

后台实现下载

实现步骤:

  1. 需要同通过 response.setContentType 方法设置 Content-typpe 头字段的值,让浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,例如 "application/octet-stream" 或 "application/x-msdownload" 等。
  2. 需要通过 response.setHeader 方法设置 Content-Disposition 头的值为 "attachment;filename=文件名"。
  3. 读取需要下载的文件,调用 response.getOutputStream 方法向客户端写入附件内容。

代码演示:

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author: 86199
 * @date: 2023/7/3 17:07
 * Description: 后台代码实现文件下载
 */

@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");

        //获取参数,获取要下载的文件名
        String fileName = req.getParameter("fileName");

        //trim() 去除字符串前后的空格
        if(fileName != null && "".equals(fileName.trim())){
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("请输入要下载的文件名");
            resp.getWriter().close();
            return;
        }

        //获取文件的存放路径
        String filePath = req.getServletContext().getRealPath("/download/");
        File file = new File(filePath + fileName);
        //判断文件是否存在,并且是一个标准文件
        if(file.exists() && file.isFile()){
            //设置响应类型为浏览器不能识别的
            resp.setContentType("application/x-msdownload");

            //设置响应头
            resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);

            //得到文件输入流
            FileInputStream in = new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream out = resp.getOutputStream();

            byte[] bytes = new byte[1024];
            int readLen = 0;
            while ((readLen = in.read(bytes)) != -1){
                out.write(bytes, 0, readLen);
            }
            in.close();
            out.close();

        }else {
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("文件不存在请重试...");
            resp.getWriter().close();
        }
    }
}

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

浏览 2967.05 万次 点击这里给我发消息

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认