• JavaWeb 文件上传和下载


    文件的上传和下载
            文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的上传和下载。
    比如: QQ 头像,就使用了上传。
            邮箱中也有附件的上传和下载功能。
            OA 系统中审批有附件材料的上传。

    1. 文件的上传介绍

            1、要有一个 form 标签,method=post 请求
            2、form 标签的 encType 属性值必须为 multipart/form-data 值
            3、在 form 标签中使用 input type=file 添加上传的文件
            4、编写服务器代码(Servlet 程序)接收,处理上传的数据。
            encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务。

    1.1 文件上传,HTTP 协议的说明

     上传文件的数据 因为太多太乱,所以谷歌浏览器不显示,使用空行代替。

    1.2 commons-fileupload.jar 常用 API 介绍说明

    第一步,就是需要导入两个 jar 包:
            commons-fileupload-1.2.1.jar
            commons-io-1.4.jar
            commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
    commons-fileupload.jar commons-io.jar 包中,我们常用的类有哪些?
    ServletFileUpload 类,用于解析上传的数据。
    FileItem 类,表示每一个表单项

    boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
            判断当前上传的数据格式是否是多段的格式。

    public List parseRequest(HttpServletRequest request)

            解析上传的数据

    boolean FileItem.isFormField()
            判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
                    true 表示普通类型的表单项
                    false 表示上传的文件类型

    String FileItem.getFieldName()
            获取表单项的 name 属性值

    String FileItem.getString()

            获取当前表单项的值。

    String FileItem.getName();
            获取上传的文件名

    void FileItem.write( file );
            将上传的文件写到 参数 file 所指向抽硬盘位置 。

    1.3 fileupload 类库的使用

    上传文件的表单:
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>fileUploadtitle>
    6. head>
    7. <body>
    8. <form action="http://localhost:8080/12_file/myFileupload"
    9. method="post" enctype="multipart/form-data">
    10. 用户名:<input type="text" name="username"/><br/>
    11. 头像:<input type="file" name="photo"/><br/>
    12. <input type="submit" value="上传"/>
    13. form>
    14. body>
    15. html>

    解析上传的数据代码

    1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    2. System.out.println("表单数据传进来了。");
    3. //1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
    4. if(ServletFileUpload.isMultipartContent(request)){
    5. //创建 FileItemFactory 工厂实现类
    6. FileItemFactory fileItemFactory = new DiskFileItemFactory();
    7. // 创建用于解析上传数据的工具类 ServletFileUpload 类
    8. ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
    9. try {
    10. // 解析上传的数据,得到每一个表单项 FileItem
    11. List list = servletFileUpload.parseRequest(request);
    12. //循环判断,每一个表单项,是普通类型,还是上传的文件
    13. for (FileItem fileItem : list) {
    14. if (fileItem.isFormField()) {
    15. // 普通表单项
    16. System.out.println("普通表单项name的值:"+fileItem.getFieldName());
    17. // 参数 UTF-8.解决乱码问题
    18. System.out.println("普遍表单项value的值:" + fileItem.getString("UTF-8"));
    19. }else{
    20. // 文件
    21. System.out.println("表单项name的值:" + fileItem.getFieldName());
    22. System.out.println("上传文件名称:" + fileItem.getName());
    23. //上传文件
    24. fileItem.write(new File("E:\\java\\文件处理\\文件处理2\\"+fileItem.getName()));
    25. System.out.println("上传成功");
    26. }
    27. }
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }

    2. 文件下载

    2.1 步骤

    1. 获取要下载的文件名
    2.读取要下载的文件内容
    3.通过响应头告诉客户端返回的数据类型
    4.还要告诉客户端收到的数据是用于下载使用的
    5.把下载的文件内容回传给客户端

    2.2 代码
     

    1. @Override
    2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    3. // 1. 获取要下载的文件名
    4. String fileName = "1.jpg";
    5. // 2.读取要下载的文件内容(通过ServletContext对象可以读取)
    6. ServletContext servletContext = getServletContext();
    7. // 将文件转成以流的方式(即读取文件)
    8. InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + fileName);
    9. // 3.通过响应头告诉客户端返回的数据类型
    10. // 读取下载的文件路径,并返回文件的数据类型
    11. String mimeType = servletContext.getMimeType("/file/" + fileName);
    12. System.out.println("下载的文件类型:" + mimeType);
    13. // 通过响应头告诉客户端文件返回的数据类型
    14. response.setContentType(mimeType);
    15. // 4.还要告诉客户端收到的数据是用于下载使用的
    16. // Content-Disposition响应头,表示是收到的数据类型
    17. // attachment表示附件,表示下载使用
    18. // filename= 表示指定下载的文件名 若文件名为中文,则把中文名进行 UTF-8 编码操作。
    19. response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("美女图片.jpg", "UTF-8"));
    20. // 5.把下载的文件内容回传给客户端
    21. // 获取响应头的输出流
    22. ServletOutputStream outputStream = response.getOutputStream();
    23. // 读取输入流中的全部数据,复制给输出流,输出给客户端
    24. IOUtils.copy(resourceAsStream,outputStream);
    25. System.out.println("下载成功");
    26. }
  • 相关阅读:
    一文快速回顾 Session 和 Cookie
    排队打水( 贪心 + 排列不等式 )
    Cmake用户交互指南
    程序编译过程 & ELF格式
    数据结构里的一棵树
    decompose transformation matrix
    Nginx rtmp&&Centos FFmpeg安装配置
    代码随想录算法训练营第五十一天| 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,总结
    牛顿-拉夫森算法:用Python实现
    DFS与回溯专题:二叉树的最大深度
  • 原文地址:https://blog.csdn.net/weixin_65637841/article/details/126004791