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

JavaWeb中的文件的上传和下载

时间:2023-11-24 16:13:42浏览次数:39  
标签:name 上传 jakarta import servlet 下载 JavaWeb

文件上传

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"/>       头像:<input type="file" name="photo"/>       <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>  

到此这篇关于JavaWeb中的文件的上传和下载的文章就介绍到这了

 

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

欢迎入群一起讨论

 

 

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

相关文章

  • 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......
  • js 大文件切片,中止上传,上传进度,断点续传
    大文件切片上传背景介绍:当涉及大文件上传时,一种有效的方法是将大文件分割成小切片并逐个上传。这种技术不仅可以减轻服务器的负担,还可以避免上传过程中的中断和内存问题。本文将介绍如何使用JavaScript实现大文件切片上传,并解释如何处理断点续传、并发控制以及上传取消等问题,用到的......
  • 详解vue大文件视频切片上传的处理方法
    前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端配合做了一个切片的功能,接下来就详细的给大家介绍一下vue大文件视频切片上传的处理方法,需要的朋友可以参考下 前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端......
  • java实现大文件的分片上传与下载(springboot+vue3)
    1.1项目背景对于超大文件上传我们可能遇到以下问题•大文件直接上传,占用过多内存,可能导致内存溢出甚至系统崩溃•受网络环境影响,可能导致传输中断,只能重新传输•传输时间长,用户无法知道传输进度,用户体验不佳1.2项目目标对于上述问题,我们需要对文件做分片传输。分片传输就是......
  • .Net Core MVC超大文件上传
    后端控制器://用于保存的文件夹staticreadonlystringuploadFolder="UploadFolder";//目录分隔符,兼容不同系统staticreadonlychardirSeparator=Path.DirectorySeparatorChar;stringGetTmpChunkDir(stringfileName)=>HttpContext.Session.TryGet......
  • Springboot文件上传代码笔记
    1.在src下创建filter包,包内Class名UploadFilterpackagecom.gd.filter;importorg.apache.catalina.servlet4preview.http.HttpServletRequest;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletResponse;impor......
  • react开发 jest写单元测试 如何借助mock模拟实现接口返回文件流的下载测试
    要借助mock模拟实现接口返回文件流的下载测试,可以使用以下步骤:1.创建一个用于接收文件流的虚拟DOM元素,例如通过`document.createElement('a')`创建一个`<a>`元素。2.使用`URL.createObjectURL()`方法将文件流转换为URL。3.设置创建的虚拟DOM元素的`href`属性为URL,同时设置`dow......
  • java 实现文件夹上传(springBoot 框架)
    java实现文件夹上传(springBoot框架)有时我们后台管理等服务可能会有这样一个简单需求,就是根据文件夹将整个文件夹下的所有资源都上传到我们的服务器上,本人也是搜索了大量资料,最终以最简单便捷的方式实现该功能,具体操作步骤如下一、前端如何设置上传组件并将资源上传到后台服务这......