首页 > 编程语言 >JavaWeb-文件的上传和下载

JavaWeb-文件的上传和下载

时间:2023-11-25 14:57:08浏览次数:42  
标签:文件 JavaWeb 上传 jakarta import servlet 下载

文件上传
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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("文件上传");
}
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.pero.file.file_upload.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>
</web-app>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2023/3/15
Time: 23:08
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>
<form action="http://localhost:8080/file_Upload/uploadServlet" 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>

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

常用类:

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

FileItem类:表示每一个表单项

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

public List<FileItem> 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 {
@Override
protected 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);
//解析上传的数据得到每一个表单项Item
try {
List<FileItem> 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);
}
}
}
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0">
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.pero.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>
</web-app>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2023/3/15
Time: 23:08
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>
<form action="http://192.168.42.31:8080/Upload_Web/uploadServlet" 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>

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

常用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 {
@Override
public 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);
}

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-name>Download</servlet-name>
<servlet-class>com.pero.servlet.download_web.Download</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
</web-app>

 

参考文章:http://blog.ncmem.com/wordpress/2023/11/25/javaweb-%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd/

欢迎入群一起讨论

 

 

标签:文件,JavaWeb,上传,jakarta,import,servlet,下载
From: https://www.cnblogs.com/songsu/p/17855503.html

相关文章

  • TVBOX下载配置及本地包使用教程
    本文以电视上使用为准。【TVBOX软件下载】https://qiqi2020.lanzouq.com/b09svqv1cTVBOX有各种改版,这里推荐下载影视仓_5.0.13.apk,因为它支持“多仓”:【软件安装】打开电视上的“当贝助手”,用它来上传软件安装包,其它可以传文件到电视的软件也可以。选择文件快传:电脑浏览......
  • JavaWeb实现文件上传和下载
    环境配置:导入依赖jar包。commons-fileupload-1.4.jarcommons-io-2.6.jar上传表单的enctype属性enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。语法<formenctype="value">1属性值值 描述application/x-www-form-urlencoded 在发送前编码所有字符(默认)multi......
  • Java Web 实现文件上传和下载接口功能
    1.上传java代码实现@ResponseBody@PostMapping("/upload")publicResponseVoupload(@RequestParam(value="file",required=false)MultipartFilemultipartFile){Filefile=newFile("上传到服务器的文件地址");try{......
  • 【开源】基于JavaWeb的快乐贩卖馆管理系统 毕业设计
    一、摘要1.1项目介绍基于JAVA+Vue+SpringBoot+MySQL的快乐贩卖馆管理系统,包含了视频模块、视频收藏模块、视频打分模块、视频交友模块、视频购物车模块和视频订单模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础......
  • 【开源】基于JavaWeb的智慧家政系统 毕业设计
    一、摘要1.1项目介绍基于微信小程序+JAVA+Vue+SpringBoot+MySQL的智慧家政系统,包含了地址管理模、订单管理、家政分类管理、家政服务管理、用户反馈管理模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,基于微......
  • Java Web实现文件下载的几种方式
    文件下载可以说是网站的基础功能,要实现最下载功能,有一种最基本的方法,那就是将超链接的href属性指向对应的资源文件。如下面连接指向了百度首页的图片:​ ​I'mtheindexofBaidu​​但这种方式的缺陷也是很明显的,目录信息被获取,不利于信息安全。其实信息安全还是其次,主要还是......
  • JavaWeb中的文件的上传和下载
    文件上传1.要有一个form标签,method=post请求2.form标签的encType属性的值必须为multipart/form-data值3.在from标签中使用inputtype=file添加上传的文件4.编写服务器代码接收上传的数据Content-Type:表示提交的数据类型enctype="multipart/form-data":表示提交的数据,以多段(每......
  • Quarto不完全指北 第一节 下载
    Quarto不完全指北·第一节下载Quarto是R语言开发团队Posit开发的新一代开源出版工具,用于替换Rmarkdown,并且在一定程度上具有学术写作的能力,甚至可以它创建一个网站,基于Pandoc和Deno(你可以在Quarto的安装目录里找到这两个工具)。不仅对于R的支持良好,而且对于Py......
  • java 超大文件上传_Java+超大文件上传
    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需求,都能得到满足。小小开心了一把。但无论插件再怎么灵活,也难以应付所有的需求,比如,你要上......
  • java 实现断点续传的上传功能
    下面是一个简单的实现Java断点续传上传功能的代码示例,其中使用了HttpURLConnection和RandomAccessFile类:publicclassResumableUploader{privatestaticfinalintBUFFER_SIZE=4096;privatestaticfinalStringFILE_PATH="yourFilePath";privatestaticfi......