JavaWeb学习-文件的上传和下载
创始人
2025-05-29 08:40:57
0

文件上传

1.要有一个form标签,method=post请求

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

3.在from标签中使用input type=file添加上传的文件

4.编写服务器代码接收上传的数据

Content-Type:表示提交的数据类型

enctype="multipart/form-data":表示提交的数据,以多段(每一个表单一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器

boundary:表示每段数据的分隔符

----WebKitFormBoundaryOZ1BoZwqflbGWUBH是由浏览器每次都随机生成,他就是每段数据的分界符

package com.pero.file.file_upload;import jakarta.servlet.*;
import jakarta.servlet.http.*;import java.io.IOException;public class UploadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("文件上传");}
}

UploadServletcom.pero.file.file_upload.UploadServletUploadServlet/uploadServlet
<%--Created by IntelliJ IDEA.User: AdministratorDate: 2023/3/15Time: 23:08To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Title


用户名:
头像:

常用API

导入commons-fileupload-1.3.3.jar和commons-io-2.6.jar包到项目lib目录下

常用类:

ServletFileUpload类:用于解析上传的数据

FileItem类:表示每一个表单项

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

public List parseRequest(HttpServletRequest request):解析上传数据

boolean isFormField():判断当前表单项是普通表单项还是上传的文件类型,true表示表单项,false表示上传的文件类型

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

String getString():获取当前表单项的值

String getName():获取上传的文件名

void write(File var1) throws Exception:将上传的文件写到参数file所指向的硬盘位置

文件上传测试

package com.pero.servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;import javax.servlet.ServletException;
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;public class UploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");//先判断上传数据是否为多段数据(只有多段数据才是文件上传的)if (ServletFileUpload.isMultipartContent(req)) {//创建FileItemFactory工厂实现类FileItemFactory fileItemFactory = new DiskFileItemFactory();//创建用于解析上传数据的工具类ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);//解析上传的数据得到每一个表单项Itemtry {List list = servletFileUpload.parseRequest(req);//循环判断每一个表单项是普通类型还是上传文件for (FileItem fileItem : list) {if (fileItem.isFormField()) {//普通表单项System.out.println("表单项的name属性值:" + fileItem.getFieldName());//参数UTF-8解决中文乱码System.out.println("表单项的value值:" + fileItem.getString("UTF-8"));} else {//上传文件System.out.println("表单项的name属性值:" + fileItem.getFieldName());System.out.println("上传文件名:" + fileItem.getName());fileItem.write(new File("G:\\test" + fileItem.getName()));}}} catch (Exception e) {throw new RuntimeException(e);}}}
}

UploadServletcom.pero.servlet.UploadServletUploadServlet/uploadServlet
<%--Created by IntelliJ IDEA.User: AdministratorDate: 2023/3/15Time: 23:08To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Title


用户名:
头像:

文件的下载

客户端发送请求告诉服务器需要下载什么文件,服务器过去要下载的文件名,读取要下载的文件内容,把下载的文件内容回传给客户端,再回传前,通过响应头告诉客户端返回的数据类型,还要通过响应头告诉客户端收到的数据是用于下载使用

常用API说明:

response.getOutputStream():获取响应输出流

servletContext.getResourceAsStream():用于读取要下载的内容(返回对象为输入流)

servletCOntext.getMimeType():获取要下载的文件类型

response.setContentType():在回传之前通过响应头告诉客户端返回的数据类型

response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("你好.png","UTF-8"));该响应头是告诉浏览器,这个文件是要下载的文件。attachment表示附件,也就是下载的文件,fileName=后面的表示下载的文件名

package com.pero.servlet.download_web;import jakarta.servlet.*;
import jakarta.servlet.http.*;
import org.apache.commons.io.IOUtils;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;public class Download extends HttpServlet {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取要下载的文件名String downloadFileName = "1.png";//2.读取要下载的文件内容(通过ServletContext对象读取)ServletContext servletContext = getServletContext();//获取要下载的文件类型String mimeType = servletContext.getMimeType("/file/" + downloadFileName);System.out.println("下载的文件类型:" + mimeType);//再回传之前通过响应头告诉客户端返回的数据类型response.setContentType(mimeType);//还要告诉客户端收到的数据是用于下载使用(还是使用响应头)//Content-Disposition响应头表示收到的数据怎么处理//attachment表示指定下载的文件名//url编码是把汉字转换成%xx%xx的格式response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("你好.png","UTF-8"));InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);//获取响应输出流OutputStream outputStream = response.getOutputStream();//把要下载的文件内容回传给客户端//读取输入流中全部的数据赋值给输出流,输出给客户端IOUtils.copy(resourceAsStream, outputStream);}@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

Downloadcom.pero.servlet.download_web.DownloadDownload/download

相关内容

热门资讯

已有12所985大学,海南还想... 本文来源:时代周报 作者:曾思怡受海南自贸港政策和制度优势吸引,已有一大波国内外高校奔赴海南开设分校...
新中式糖水正席卷年轻人:20一... 新消费导读深圳福田CBD的麦记牛奶公司,工作日晚间十点依然有人排队。点单率最高的不是奶茶,而是一碗需...
“火腿大王”二代接班,豪赌芯片... 从“火腿大王”到“牛散岳父”,再到“莆田卖车富豪”,这家“火腿第一股”的实控人座位,烫得没人能坐久。...
特斯拉,创历史新高 12月22日,特斯拉盘初快速拉升,截至发稿,股价涨超3%,创历史新高,最新市值1.7万亿美元。 编...
男子楼顶露台种树时不慎碰下树桩... 六旬男子韦某在自家楼顶露台移植树木时,起身过程中将一个17公斤重的树桩碰掉坠至楼下,刚好砸中一名17...
23亿“豪赌”!追觅老板为啥这... 有一位老板,他既搞家电、手机,又要造车对标布加迪,还发布了AI眼镜、戒指等。他不是雷军,我要说的, ...
MiniMax、智谱港股IPO... “大模型六小龙”中的MiniMax、智谱港股IPO获得中国证监会备案。12月22日,据中国证监会网站...
尼玛,羊毛越来越疯了 图:Paul Blow haha,今天有个事挺重要。 央妈 官宣了 信用修复政策。 如果过去六年你违...
一拖再拖!募投项目多次延期,天... “好人家”火锅底料的母公司天味食品(603317.SH)募投项目又延期了。近日,天味食品发布公告表示...
创识科技61岁实控人被留置立案... 红星资本局12月22日消息,今日下午,创识科技(300941.SZ)公告,公司于近日收到邹平市监察委...