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,注意看网页左下角
成功!