JavaWeb

JavaWeb
文件的上传和下载
就用servlet来实现把,就当复习喽(其实这个也为了我以后省的去网上找来找去,费时间~~)

文件的上传
首先具备以下几个条件:

  • 1.要有一个form标签,method=post请求
  • 2.form标签的enType属性值必须为multipart/form-data值
  • 3.在form标签中使用input type=file添加上传的文件
  • 4.编写服务器代码接受,处理上传的数据

开撸:
新建maven项目,并添加web框架支持,也就是web.xml。

导入依赖

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload.wso2/commons-fileupload -->
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
  </dependencies>

a). 来一个简单的页面

<%--
  Created by IntelliJ IDEA.
  User: 大美妞
  Date: 2022/12/10
  Time: 20:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--enctype="multipart/form-data"以二进制流的形式提交--%>
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username" /><br>
        头像:<input type="file" name="photo"><br>
         <input type="submit" value="上传">
</form>


</body>
</html>

b).去写个controller

package com.oracle.controller;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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.IOException;
import java.util.List;

/**
 * 文件的上传
 * 1.要有一个form标签,method=post请求
 * 2.form标签的enType属性值必须为multipart/form-data值
 * 3.在form标签中使用input type=file添加上传的文件
 * 4.编写服务器代码接受,处理上传的数据
 */

public class UploadController extends HttpServlet {
    /**
     * 用来处理上传的数据
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 先判断上传的数据是否是多段的(只有是多段的数据,才是文件上传的)
        if (ServletFileUpload.isMultipartContent(request)) {
            // 用于创建FileItemFactory工厂实现类
            FileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            // 创建用于解析上传数据的工具类ServletFileUpload类
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            try {
                // 解析上传的数据,得到每一个表单项FileItem
                List<FileItem> list = servletFileUpload.parseRequest(request);
                // 循环判断,每一个表单项,是普通类型还是上传的文件
                for (FileItem fileItem : list) {
                    if (fileItem.isFormField()) { // 普通类型
                        System.out.println("表单项的name属性值:" + fileItem.getFieldName());
                        System.out.println("表单项的value属性值:" + fileItem.getString("UTF-8")); // 解决含有中文乱码问题
                    } else {  // 上传到哪呢?d盘
                        System.out.println("表单项的name属性值:" + fileItem.getFieldName());
                        System.out.println("上传的文件名:" + fileItem.getName());

                        fileItem.write(new File("d:\\" + fileItem.getName()));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>uploadServlet</servlet-name>
        <servlet-class>com.oracle.controller.UploadController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>uploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
</web-app>

然后见控制台打印信息:
在这里插入图片描述

途中报了个错:

10-Dec-2022 22:27:16.639 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method manageApp

这个错误:可用以下方式解决上述异常

如果在上传时:遇到自己图片的名字为中文的,直接在都dopost方法开始的第一行加上如下代码:

 req.setCharacterEncoding("UTF-8"); // 解决上传时名字为中文的乱码问题

最后–文件上传用到的几个类:
*ServletFileUpload
*FileItemFactory
*ServletFileUpload

文件的下载
先来分析:
客户端(浏览器)
发请求,告诉服务器要干什么?

服务端(Tomcat)
1.获取要下载的文件名。
2.读取要下载的文件内容。
3.把下载的文件内容回传给客户端。
4.在回传前,还要告诉客户端返回的是什么数据类型的。
5.还要告诉客户端接受的数据是用于下载还是使用呢(这块用响应头来实现)

开撸~
再去new一个controller:

package com.oracle.controller;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
 * 下载
 */
public class DownloadController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取要下载的文件名。
        String downloadFileName = "1.png";
//        2.读取要下载的文件内容。
        ServletContext servletContext = getServletContext();
        // 获取要下载的文件类型
        String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
        System.out.println("获取要下载的文件类型:" + mimeType);
        //        4.在回传前,还要告诉客户端返回的是什么数据类型的。
        resp.setContentType(mimeType);
//        5.还要告诉客户端接受的数据是用于下载还是使用呢(这块用响应头来实现)
        /**
         * Content-Disposition:响应头,表示收到的数据怎么处理
         * attachment:附件,表示下载使用
         * filename= 表示下载的指定文件名
         */
        resp.setHeader("Content-Disposition", "attachment; filename="+downloadFileName);
        /**
         * 第一个“/”被服务器解析表示地址为http://ip:port/工程名/ 映射到 代码的web项目
         */
        InputStream inputStream = servletContext.getResourceAsStream("/file/" + downloadFileName);
        // 获取响应的输出流,把下载的文件内容回传给客户端,就是把输入流的数据,复制给输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        IOUtils.copy(inputStream, outputStream);


    }
}

再去配一个地址:

<servlet>
        <servlet-name>downloadController</servlet-name>
        <servlet-class>com.oracle.controller.DownloadController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>downloadController</servlet-name>
        <url-pattern>/downloadfile</url-pattern>
    </servlet-mapping>

然后输入地址看效果:http://localhost:8080/downloadfile,注意看网页左下角
在这里插入图片描述
成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值