首页 > 编程语言 >Javaweb文件上传至服务器/从服务器下载

Javaweb文件上传至服务器/从服务器下载

时间:2023-04-12 19:47:29浏览次数:44  
标签:文件 Javaweb Content 服务器 上传 目录 下载 out

Javaweb文件上传至服务器/从服务器下载

思路图

image-20230412143522611

image-20230412143543516

文件上传思路:

也可以直接看代码

  1. 判断是不是文件表单(判断form的enctype是不是="multipart/form-data"),因为只有文件表单才能上传文件

  2. 创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象

  3. 创建一个解析上传数据的工具对象servletFileUpload

  4. 关键的地方, servletFileUpload 对象可以把表单提交的数据 text / 文件,将其封装到为 FileItem 类型的List中,然后就可以遍历,并分别处理表单中的每一个提交的数据

  5. 判断数据是一个text还是文件然后分别进行处理

  6. 如果是一个文件,就把这个上传到 服务器的 temp 下的文件保存到你指定的目录

  7. 指定一个在我们网站工作目录下的目录,(相对于当前 Web 应用程序的虚拟路径)

  8. 获取到指定的虚拟目录的物理实际路径,因为我们上传文件不可能是在一个虚拟的地方

  9. 创建这个指定的目录

  10. 将文件拷贝到该目录

以下是完整代码:放在servlet的dopost/get函数里,为了美观已省略try-catch,为了保证代码美观最好请用电脑全屏观看

//1. 判断是不是文件表单(判断form的enctype是不是="multipart/form-data"),因为只有文件表单才能上传文件
if (ServletFileUpload.isMultipartContent(request)) {
            //2. 创建 DiskFileItemFactory 对象, 用于构建一个解析上传数据的工具对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //3. 创建一个解析上传数据的工具对象
            ServletFileUpload servletFileUpload =
                    new ServletFileUpload(diskFileItemFactory);
            //解决接收到文件名是中文乱码问题
            servletFileUpload.setHeaderEncoding("utf-8");
            //4. 关键的地方, servletFileUpload 对象可以把表单提交的数据text / 文件,将其封装到 FileItem 文件项中
                List<FileItem> list = servletFileUpload.parseRequest(request);
                //遍历,并分别处理
                for (FileItem fileItem : list) {
                    //判断是不是一个文件
                    if (fileItem.isFormField()) {                   //如果是true就是文本 input text
                        String name = fileItem.getString("utf-8");    //想要获取input text要通过getString方法获取到
                        System.out.println("家具名=" + name);
                    } else {                //是一个文件
                        //获取上传的文件的名字
                        String name = fileItem.getName();
                        System.out.println("上传的文件名=" + name);
​
                        //把这个上传到 服务器的 temp下 的文件保存到你指定的目录
​
                        //1.指定一个目录 , 但是这个目录是相对于这个web应用的路径,相当于以xxx_war_exploded这个目录为参照
                        //写一个相对路径表示你要创建的目录
                        String filePath = "/upload/";       //最后一个斜杠表示这个路径指向一个目录,而不是一个文件
                        //2. 获取到指定的虚拟目录的物理路径,request.getServletContext()获取到一个ServletContext,然后它可以调用                                          getRealPath(filePath),将filePath转换为物理的实际路径
                        //因为我们知道我们的web应用其实一直是一个放在设定好的application context目录下的一个虚拟路径里。
                        //所以我们要调用getRealPath()将其转换成一个物理上的真实路径,这样才能真实的保存一个文件。
                        //一句话概括这个过程发生了什么呢,其实就是以xxx_war_exploded这个web应用目录为基础,在上一级目录下建一个文件夹叫upload
                        
                        String fileRealPath = request.getServletContext().getRealPath(filePath);
                      // fileRealPath=E:fileupdown\out\artifacts\fileupdown_war_exploded\xupload\
​
                        //3. 创建fileRealPath这个已指定好的用于上传的实际目录
                        File fileRealPathDirectory = new File(fileRealPath);
                        // fileRealPathDirectory=E:fileupdown\out\artifacts\fileupdown_war_exploded\xupload\2023\4\12
                        if (!fileRealPathDirectory.exists()) {      //不存在,就创建
                            fileRealPathDirectory.mkdirs();         //创建
                        }
                        
                        //4. 将文件拷贝到fileRealPathDirectory目录
                        //   构建一个上传文件的完整路径 :目录+文件名
                        //   对上传的文件名进行处理, 前面增加一个前缀,保证是唯一即可
                        name = UUID.randomUUID().toString() + "_" +System.currentTimeMillis() + "_" + name;
                        String fileFullPath = fileRealPathDirectory + "/" +name;
 //fileFullPath=E:\JavaProject\hspedu_javaweb\fileupdown\out\artifacts\fileupdown_war_exploded\upload\yyyy\mm\dd/name
                        fileItem.write(new File(fileFullPath));
                        
                        //5. 提示信息
                        response.setContentType("text/html;charset=utf-8");
                        response.getWriter().write("上传成功~");
                    }
                }
        } else {
            System.out.println("不是文件表单...");
        }

文件下载思路:

  1. 先准备要下载的文件[假定这些文件是公共的资源],

    重要: 保证当我们的tomcat启动后,在工作目录out下有download文件夹, 并且有可供下载的文件!!

  2. 获取到要下载的文件的名字

  3. 给http响应设置响应头文件格式 Content-Type,就是文件的MIME

  4. 给http响应设置响应头 Content-Disposition来指定下载的数据的展示形式,attachment 则使用文件下载方式,复制以下代码即可

            //(1)如果是Firefox 则中文编码需要 base64
            //(2)Content-Disposition 是指定下载的数据的展示形式 , 如果attachment 则使用文件下载方式
            //(3)如果是其他(主流ie/chrome) 中文编码使用URL编码
            if (request.getHeader("User-Agent").contains("Firefox")) {
                // 火狐 Base64编码
                response.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
                        new BASE64Encoder().encode(downLoadFileName.getBytes("UTF-8")) + "?=");
            } else {
                // 其他(主流ie/chrome)使用URL编码操作
                response.setHeader("Content-Disposition", "attachment; filename=" +
                        URLEncoder.encode(downLoadFileName, "UTF-8"));
            }
  5. 读取下载的文件数据,返回给客户端/浏览器

接下来走一下代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 先准备要下载的文件[假定这些文件是公共的资源]
        //   重要: 保证当我们的tomcat启动后,在工作目录out下有download文件夹, 并且有可供下载的文件!!
        //   如果你没有看到你创建的download在工作目录out下 rebuild project -> restart, 就OK
​
        //2. 获取到要下载的文件的名字
        request.setCharacterEncoding("utf-8");
        String downLoadFileName = request.getParameter("name");
        //System.out.println("downLoadFileName= " + downLoadFileName);
​
        //3. 给http响应,设置响应头文件格式 Content-Type , 就是文件的MIME
        //   通过servletContext 来获取
        ServletContext servletContext = request.getServletContext();
        String downLoadPath = "/download/"; //下载目录从 web工程根目录计算
        String downLoadFileFullPath = downLoadPath + downLoadFileName;   //  /download/1.jpg
        String mimeType = servletContext.getMimeType(downLoadFileFullPath);
        System.out.println("mimeType= " + mimeType);
        response.setContentType(mimeType);
​
        //4. 给http响应,设置响应头 Content-Disposition
        //(1)如果是Firefox 则中文编码需要 base64
        //(2)Content-Disposition 是指定下载的数据的展示形式 , 如果attachment 则使用文件下载方式
        //(3)如果是其他(主流ie/chrome) 中文编码使用URL编码
        if (request.getHeader("User-Agent").contains("Firefox")) {
            // 火狐 Base64编码
            response.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
                    new BASE64Encoder().encode(downLoadFileName.getBytes("UTF-8")) + "?=");
        } else {
            // 其他(主流ie/chrome)使用URL编码操作
            response.setHeader("Content-Disposition", "attachment; filename=" +
                    URLEncoder.encode(downLoadFileName, "UTF-8"));
        }
​
        //5. 读取下载的文件数据,返回给客户端/浏览器
        //(1) 创建一个和要下载的文件,关联的输入流
        InputStream resourceAsStream = servletContext.getResourceAsStream(downLoadFileFullPath);
        //(2) 得到返回数据的输出流 [因为返回文件大多数是二进制(字节), IO java基础]
        ServletOutputStream outputStream = response.getOutputStream();
        //(3) 使用工具类,将输入流关联的文件,对拷到输出流,并返回给客户端/浏览器
        IOUtils.copy(resourceAsStream, outputStream);
    }

标签:文件,Javaweb,Content,服务器,上传,目录,下载,out
From: https://www.cnblogs.com/hanlinyuan/p/17310982.html

相关文章

  • JavaWeb技术栈图(web服务器+web容器是何物)
    JavaWeb技术栈图(web服务器+web容器是何物)两个重要概念web服务器+web容器什么是Web服务器?Tomcat服务器就是一个免费的开放源代码的Web应用服务器web服务实际上就是解析了客户端/浏览器发来的http请求,并将其做出一定的处理。比如说将请求头和请求体中的各个元素拆开打包成一......
  • JavaWeb之Servlet详解(以及浏览器调用 Servlet 流程分析图)
    Servlet1.什么是ServletServlet(java服务器小程序)他是由服务器端调用和执行的(一句话:是Tomcat解析和执行)他是用java语言编写的,本质就是Java类他是按照Servlet规范开发的(除了tomcat->Servletweblogic->Servlet)功能强大,可以完成几乎所有的网站功能2.开发......
  • JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么)
    JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么) 1开门见山新建一个tomcatweb项目,配置tomcat的虚拟目录,取默认值(/项目名_war_exploded)那么如果你的tomcat的默认站点(即http://localhost:8080)没有更改的话,这个项目的两个重要的根目录就出来了web站点根目......
  • javaweb-学习创建servlet
    Servlet创建、声明、映射,利⽤ServletContext统计⼀个⽹站的访问总量。1)、创建一个servelet选择要用到的方法2)、编辑serveletpackagecom.cont;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.ServletContext;importjavax.servlet.Ser......
  • 邮件服务器设置
    学习目标通过本单元的学习,您将能够:了解产品里支持发送邮件的一些功能。学会如何配置邮件服务器,并使用邮箱发送测试邮件。本课程以金蝶云星空企业版7.6为例,早期版本或标准版供参考应用场景支持发送邮件消息的应用场景比较多,如【监控方案】}支持【邮件消息】、工作......
  • 服务器安全监控是什么有什么作用
    服务器安全监控是什么有什么作用服务器安全监控有什么作用?当服务(HTTP、SMTP等)出现故障时,机房设备会收到警报。如果我们的服务器容易受到新软件错误的流量入侵,或者如果有人试图暴力入侵我们的密码,这时候服务器安全监控就尤为重要了通过监视服务器的安全事件,将能够防止安全问题,而......
  • 恒创科技:Linux 云服务器好用吗?(解读Linux云服务器的特点优势)
    ​如今,云计算越来越受欢迎,许多公司正在将业务转移到那里。企业向云过渡的主要原因是它提供的众多服务,包括安全和充足的存储、数据库、服务器和其他关键元素。作为相对前|沿的技术之一,云建立在虚拟服务器上。Linux服务器也可以放在云端。通过改变他们用作存储和服务器来托......
  • Windows11下载安装Git,并上传资源到gethub操作指南
    git官网下载地址:《https://git-scm.com/》下载完成后,进行安装…安装路径自选,普通安装即可安装完成后,右击任意文件都会出现git的图标,说明安装成功了......
  • 服务器节点之间 如何实现自动化文件同步?
    大数据、云计算、物联网的发展,使得企业能够拥有的数据急剧增加。面对快速变化和增长的庞大数据,如何高效地管理、利用数据对于企业来说至关重要。但是,数据传输模式单一、自动化程度低、传输效率低下等难题,阻碍着企业对其数字资产的管控和利用,也制约了企业运营效率的提升。 很显......
  • PHP上传大型视频文件到服务器,解决方案
    ​ PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错3.memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此......