文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Servlet文件的上传与下载怎么实现

2023-07-02 10:30

关注

本文小编为大家详细介绍“Servlet文件的上传与下载怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Servlet文件的上传与下载怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

文件的上传和下载

1. 文件上传细节

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

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

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

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

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

文件上传http请求信息:

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

解析:

请求体:

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

正确用法:

@Overrideprotected 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

关键的类:

//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 类:

@Overrideprotected 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文件的上传与下载怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯