首页 > 其他分享 >文件的上传和下载

文件的上传和下载

时间:2022-10-15 09:00:20浏览次数:71  
标签:文件 request fileName import 上传 response 下载

文件的上传和下载

学习链接:038-Servlet-文件上传-后台代码实现_哔哩哔哩_bilibili

一、文件上传

1.前台页面

  需要一个表单作为上传文件的界面,表单请求方式为 POST,在form 表单的enctype必须设置为"multipart/form-data",意思是设计表单的类型为文件上传表单。

  注意:默认情况下表单的类型是"application/x-www-form-urlencoded",不支持文件上传,只有使用 multiparty/form-data才能完整的传递文件数据。

<!--
文件上传:
    1.准备表单
    2.设置表单提交类型POST
    3.设置表单类型为文件上传表单enctype="multipart/form-data"
    4.设置文件提交的地址 action
    5.准备表单元素
        1)普通表单项     type="text"
        2)文件表单项     type="file"
    6.表单提交一定要设置name属性值,否则后台无法收到数据
-->
    <form  method="post" enctype="multipart/form-data" action="uploadServlet">
        姓名:<input type="text" name="uname"><br>
        文件:<input type="file" name="myfile"><br>
        <button>提交</button>
    </form>

2.后台实现

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

  因为前台设置的enctype="multipart/form-data",如果不写@MultipartConfig注解,不仅仅是文件不能上传,连普通的值也是无法拿到的

@WebServlet("/uploadServlet")
@MultipartConfig //文件上传必须要设置此注解
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件上传");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        //获取普通参数
        String uname = request.getParameter("uname");//name属性值
        System.out.println("uname: "+uname);
        //获取Part对象
        Part part = request.getPart("myfile");//name属性值
        //获取上传的文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上传文件名:"+fileName);
        //获取文件的存放路径
        String filePath = request.getServletContext().getRealPath("/");
        System.out.println("文件存放的路径:"+filePath);
        //上传文件到指定目录
        part.write(filePath+"/"+fileName);
    }
}

 

 

 在对应的路径下,可以看到被上传的文件

 

 

 二、文件下载

1.超链接下载

标签<a></a>

<!--
通常情况下,浏览器能够识别txt、png文件,可以进行查看,而像压缩文件这种浏览器不会识别,就会进行下载
通过设置download属性规定浏览器进行下载,如果download属性不屑任何消息,会使用默认的文件名,润泽就会使用设置的值作为文件名
-->
    <a href="download/text.txt">文本文件</a>
    <a href="download/picture.png">图片文件</a>
    <a href="download/test.rar">压缩文件</a>
<!--下载浏览器能够识别的资源-->
    <hr>
    <a href="download/text.txt" download>文本文件</a>
    <a href="download/picture.png" download="图片.png">图片文件</a>
<!--下载的文件名为  图片.png  -->

2.通过代码下载(后台实现)

downloadServlet.java

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.InputStream;

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("文件下载...");
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //获取下载的文件名(参数)
        String fileName = request.getParameter("fileName");
        //***参数的非空判断  trim():去除字符串的前后空格
        if(fileName==null||"".equals(fileName.trim())){
            response.getWriter().write("请输入要下载的文件名");
            //关闭流
            response.getWriter().close();
            return;
        }
        //获取路径   注意这个资源要放在哪里的,如要放在 download 目录下的,则要写"/download/"
        String path = request.getServletContext().getRealPath("/download/");
        //通过路径得到一个file对象'
        File file = new File(path+fileName);
        //注意:要判断文件是否存在并且是一个标准文件(不标准文件:文件夹)
        if(file.exists()&& file.isFile()){
            //开始下载
            //1.设置响应类型(浏览器无法去激活的一个响应类型)
            response.setContentType("application/x-msdownload");
            //2.设置响应头
            response.setHeader("Content-Disposition","attachment;filename="+fileName);
            //3.得到 file 文件的输入流
            InputStream in = new FileInputStream(file);
            //4.得到输出流
            ServletOutputStream out = response.getOutputStream();
            //5.输出资源
            byte[] bytes = new byte[1024];
            int len=0;//定义长度
            //循环输出
            while((len = in.read(bytes))!=-1){
                out.write(bytes,0,len);//输出:长度从 0 开始到 len 结束
            }
            //关闭资源
            out.close();
            in.close();
        }else{
            response.getWriter().write("文件不存在,请重试");
            response.getWriter().close();
        }
    }
}

download.html

<body>
<!--
通常情况下,浏览器能够识别txt、png文件,可以进行查看,而像压缩文件这种浏览器不会识别,就会进行下载
通过设置download属性规定浏览器进行下载,如果download属性不屑任何消息,会使用默认的文件名,润泽就会使用设置的值作为文件名
-->
    <a href="download/text.txt">文本文件</a>
    <a href="download/picture.png">图片文件</a>
    <a href="download/test.rar">压缩文件</a>
<!--下载浏览器能够识别的资源-->
    <hr>
    <a href="download/text.txt" download>文本文件</a>
    <a href="download/picture.png" download="图片.png">图片文件</a>

    <hr>
    <form action="downloadServlet">
        文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">
        <button>下载</button>
    </form>

</body>

 

 

 

 

 

 

标签:文件,request,fileName,import,上传,response,下载
From: https://www.cnblogs.com/hmy22466/p/16793553.html

相关文章

  • 【教程】重启Windows文件资源管理器
    【教程】重启Windows文件资源管理器打开任务管理器以下方法任选其一:方法一:组合键Win+X(或右键Windows徽标)==>选择任务管理器(或键盘按下T)方法二:组合键Ctr......
  • Python Flask 返回html文件
    1、在templates文件夹建立一个html文件<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Index</title></head><body><h2>This is i......
  • 在Visual Studio中添加属于自己的头文件(附万能头文件的代码)
    首先我们先找到VisualStudio编辑器中的“解决方案”,右键点击并在下拉菜单中找到属性并点击。点击后会出现一个弹窗,在里面找到“调试源文件”,在右边列表中找到include文件......
  • DEMO:Excel 下载
    效果:......
  • 批量提取文件夹内的文件名,可动态更新可点击跳转!
    Excel情报局职场联盟Excel生产挖掘分享Excel基础技能Excel爱好者大本营用1%的Excel基础搞定99%的职场问题做一个超级实用的Excel公众号Excel是门手艺玩转需要勇气数万Excel......
  • JDownloader下载工具的安装
    JDownloader下载工具的安装JDownloader是一个免费的、开放源码的下载管理工具,它有一个庞大的交流社区。用户可以启动,停止或暂停下载,设置带宽限制,自动提取档案等等。个人......
  • python 文件的写操作
    1写操作快速入门打开文件f=open("python.txt","w")文件写入f.write("helloworld")内容刷新f.flush()注意:直接调用write,内容并未真正写入文件,而是会积攒在程......
  • python 文件练习
    题目通过Windows的文本编辑器软件,将如下内容,复制并保存到:word.txt,文件可以存储在任意位置itheimaitcastpythonitheimapythonitcastbeijingshanghaiitheimas......
  • 工具:代码下载程序
    REPORTZLM_DOWN.*reportzdown.*======================================================================================================================*DirectD......
  • 工具:代码下载程序 (新版)
    群里朋友提供了一版新版的代码下载程序。对比:左边是新程序,添加了一些东西,*============================================*Massdownloadversion1.5.5.*---------------......