文件的上传与下载_文件传与下载实验结果分析-程序员宅基地

技术标签: 算法  c++  软件质量保证+Java web技术课程实验  贪心算法  

一、实验目的
掌握Servlet的HttpServletRequest对文件上传的支持;
能够理解文件上传的原理,掌握文件上传与下载的步骤
二、实验要求
1. 基于Servlet的文件上传。
2. 文件的下载。
3. 熟练使用MYEclipse开发
三、实验内容
1、单文件上传
代码:
uploadHttpOne.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="${
    pageContext.request.contextPath}/uploadHttpOneServlet">
    <table>
        <tr>
            <td>文件描述:</td>
            <td><input type="text" name="fileDiscription"></td>
        </tr>
        <tr>
            <td>请选择文件:</td>
            <td><input type="file" name="resPath"></td>
        </tr>
        <tr>
            <td align="right"><input type="reset" value="重置"></td>
            <td><input type="submit" value="上传"></td>
        </tr>
    </table>
</form>
</body>
</html>

UploadHttpOneServlet.Java

import util.GetFN;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
@MultipartConfig(maxFileSize = 10 * 1024 * 1024)
@WebServlet(value = "/uploadHttpOneServlet")
public class UploadHttpOneServlet extends HttpServlet {
    
    private static final long serialVersionUID = 1L;
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //设置响应的内容类型
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html:charset=utf-8");
       
        //获取输出对象
        PrintWriter out = response.getWriter();
        //获取Part对象
        Part part = request.getPart("resPath");
        String fileDiscription = request.getParameter("fileDiscription");
        out.write("输入的文件描述:" + fileDiscription + " <br> ");
        //指定上传的文件保存到服务器的uploadFiles目录中
        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        if (!uploadFileDir.exists()) {
    
            uploadFileDir.mkdir();
        }
        //获得原始文件名
        String oldName = GetFN.getFileName(part);
        out.println("上传文件的原始名:" + oldName + " <br> ");
        out.println("上传文件的大小:" + part.getSize() + " <br> ");
        if (oldName != null) {
    
            //上传到服务器的uploadFiles目录中
            part.write(uploadFileDir + File.separator + oldName);
        }
        out.println("文件上传到:" + uploadFileDir + File.separator + oldName + " <br> ");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        this.doPost(request, response);
    }
}

执行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、多文件上传
代码:
uploadHttpMulti.jsp

import util.GetFN;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
@MultipartConfig(maxFileSize = 10 * 1024 * 1024)
@WebServlet(value = "/uploadHttpOneServlet")
public class UploadHttpOneServlet extends HttpServlet {
    
    private static final long serialVersionUID = 1L;
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //设置响应的内容类型
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html:charset=utf-8");
       
        //获取输出对象
        PrintWriter out = response.getWriter();
        //获取Part对象
        Part part = request.getPart("resPath");
        String fileDiscription = request.getParameter("fileDiscription");
        out.write("输入的文件描述:" + fileDiscription + " <br> ");
        //指定上传的文件保存到服务器的uploadFiles目录中
        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        if (!uploadFileDir.exists()) {
    
            uploadFileDir.mkdir();
        }
        //获得原始文件名
        String oldName = GetFN.getFileName(part);
        out.println("上传文件的原始名:" + oldName + " <br> ");
        out.println("上传文件的大小:" + part.getSize() + " <br> ");
        if (oldName != null) {
    
            //上传到服务器的uploadFiles目录中
            part.write(uploadFileDir + File.separator + oldName);
        }
        out.println("文件上传到:" + uploadFileDir + File.separator + oldName + " <br> ");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        this.doPost(request, response);
    }
}

UploadHttpMultiServlet.java

import util.GetFN;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
/**
 * Servlet implementation class UploadHttpMultiServlet
 */
@MultipartConfig(maxFileSize = 100*1024)
@WebServlet(value = "/uploadHttpMultiServlet")
public class UploadHttpMultiServlet extends HttpServlet {
    
	 private static final long serialVersionUID=1L;
	    @Override
	    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
	        this.doPost(request, response);
	    }
	    @Override
	    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
	        //设置响应的内容类型
	        response.setContentType("text/html;charset=utf-8");
	        //获得输出对象
	        PrintWriter out = response.getWriter();
	        request.setCharacterEncoding("utf-8");
	        String fileDiscription1 = request.getParameter("fileDiscription1");
	        out.println("输入的文件1描述:"+fileDiscription1+"<br>");
	        String fileDiscription2 = request.getParameter("fileDiscription2");
	        out.println("输入的文件2描述:"+fileDiscription2+"<br>");
	        //指定上传的文件保存到服务器的uploadFiles目录中
	        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
	        if(!uploadFileDir.exists()){
    
	            uploadFileDir.mkdir();
	        }
	        //获得Part集合
	        Collection<Part> parts = request.getParts();
	        for (Part part : parts) {
    
	            //没有选择文件不是文件域
	            if(part==null||!part.getName().contains("resPat")){
    
	                continue;
	            }
	            //获取原始文件名
	            String oldName = GetFN.getFileName(part);
	            out.println("上传文件的原始名:" + oldName + "<br>");
	            out.println("上传文件的大小:" + part.getSize() + "<br>");
	            if (oldName != null) {
    
	                //上传到服务器的uploadFiles目录中
	                part.write(uploadFileDir+File.separator+oldName);
	            }
	            out.println("文件上传到:" + uploadFileDir + File.separator + oldName + "<br>");
	        }
	    }

}

执行结果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、上传文件的大小限定
在UploadHttpMultiServlet页面添加@MultipartConfig注解来限定上传文件的大小
此处限定100kb的文件,即100*1024字节
在这里插入图片描述
运行后当两个文件中只要有一个文件超过限定大小,两个文件都会上传失败,结果如下
其中第一个文件的大小为300kb,第二个文件的大小为0b。
在这里插入图片描述

当两个文件的大小都小于限定大小,才能上传成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、实现文件的下载功能,并解决下载乱码问题
ShowDownServlet.java

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.IOException;
/**
 * Servlet implementation class ShowDownServlet
 */
@WebServlet("/ShowDownServlet")
public class ShowDownServlet extends HttpServlet {
    
	private static final long serialVersionUID = 1l;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        this.doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //指定从服务器的uploadFiles目录中下载文件
        File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        //获得目录中的文件
        File[] list = downLoadFileDir.listFiles();
        for (File file : list) {
    
            System.out.println(list.length);
        }
        request.setAttribute("fileList",list);
        request.getRequestDispatcher("/showInfo.jsp").forward(request,response);
    }
}

showInfo.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <table border="1">
        <tr bgcolor="#f0f8ff">
            <th>文件名称</th>
            <th>下载课件</th>
        </tr>
        <c:forEach var="afile" items="${fileList}">
            <tr>
                <td>${
    afile.name}</td>
                <td align="center"><a href="${
    pageContext.request.contextPath}/downloadServlet?resPath=${
    afile.name}" style="text-decoration:none">下载</a></td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

通过地址http://localhost/showDownServlet运行ShowDownServlet,跳转到showInfo.jsp页面。其中需要添加三个jar包。
在这里插入图片描述

乱码问题的解决需要对下载的文件名安装utf-8进行编码。
首先要新建一个工具类ToUTF8,实现一个静态字符编码转换方法toUTF8String()

DownloadServlet.java

import util.ToUTF8;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet(value = "/downloadServlet")
public class DownloadServlet extends HttpServlet {
    
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        this.doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        //要下载的文件路径
        File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        String aFileName = null;//要下载的文件名
        FileInputStream in = null;//输入流
        ServletOutputStream out =null;//输出流
        try {
    
            aFileName=request.getParameter("resPath");
            //设置下载文件使用的抱头
            response.setHeader("Content-Type","application/x-msdownload");
            //使用工具类解决文件名下载的文件名中中文字符乱码问题
            response.setHeader("Content-Disposition","attachment;filename="+ ToUTF8.toUTF8String(aFileName));
            //读入文件
            in=new FileInputStream(downLoadFileDir+File.separator+aFileName);
            //得到响应对象的输出流,用于向客户端输出二进制数据
            out = response.getOutputStream();
            out.flush();
            int aRead=0;
            byte[] bytes = new byte[1024];
            while ((aRead = in.read(bytes)) != -1 & in != null) {
    
                out.write(bytes,0,aRead);
            }
            out.flush();
            in.close();
            out.close();
        } catch (Throwable e) {
    
            e.printStackTrace();
        }
    }
}

四、心得体会:
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_52014276/article/details/121371499

智能推荐

eclipse提示SyntaxError: Non-UTF-8 code starting with '\xc4' in file C:\Users\ 怎么解决_syntaxerror: non-utf-8 code starting with '\xc8' i-程序员宅基地

文章浏览阅读9.9k次,点赞2次,收藏9次。一、第一种方法首行增加,已测试可用。# coding=gbk程序中出现中文,运行的时候出现如下错误:SyntaxError: Non-UTF-8 code starting with 'xc1' in file C:...xxx.py on line 8, but no encoding declared; see http://python.org/dev/peps/pep-0263/ _syntaxerror: non-utf-8 code starting with '\xc8' in file c:\users\26743\desk

JAVA笔试代码找错_京东笔试括号匹配问题(代码找错)-程序员宅基地

文章浏览阅读111次。这一题,测试了好几种情况都通过了,例如:())(;((()));)))(((;(())));但是提交只能通过10%,我现在陷入死角了,求各位大佬帮忙;我这一题的思路是,遍历一遍字符串,假如最后结果栈中只有")("那么就判断一次交换可以成功,其他情况都不成功import java.util.Scanner;import java.util.Stack;/*** @Author: Taoyongpan..._笔试代码找错

pandas小记:pandas时间序列分析和处理Timeseries_x must be a pandas object-程序员宅基地

文章浏览阅读10w+次,点赞13次,收藏102次。http://blog.csdn.net/pipisorry/article/details/52209377pandas 最基本的时间序列类型就是以时间戳(TimeStamp)为 index 元素的 Series 类型。其它时间序列处理相关的包[P4J 0.6: Periodic light curve analysis tools based on Information Theory][p4_x must be a pandas object

vue中在哪个生命周期中dom被渲染_Vue.js 组件的生命周期-程序员宅基地

文章浏览阅读2.5k次。本文目录结构问题Vue组件的生命周期答案总共分为8个阶段创建前/后,载⼊前/后,更新前/后,销毁前/后创建前/后: 在 beforeCreate 阶段, vue 实例的挂载元素 el 和数据对象 data 都为undefined ,还未初始化。在 created 阶段, vue 实例的数据对象 data 有了,el还 没有载⼊前/后:在 beforeMount 阶段, vue 实例的 $el 和 ..._vue渲染dom是在哪个环节

服务器ubuntu18.04安装虚拟机并安装centos6.8系统---3(虚拟机安装centos6.8系统)_ubuntu18.4对应centos那个版本-程序员宅基地

文章浏览阅读1.2k次。前两篇在服务器上把远程界面和虚拟机都安装好了后,现在进入第一小节,安装操作系统,这里要安装的是centos6.8。 1、下载安装系统。 进入CentOS官方网站 https://www.centos.org,找到要下载的系统下载,怎么下载,这个网上有很多资料,就不赘述了,我本地网很慢,依然在服务器上下载了wget http://archive.kernel.org/centos-vau..._ubuntu18.4对应centos那个版本

ARL(灯塔)资产系统安装_灯塔安装-程序员宅基地

文章浏览阅读1.2w次,点赞10次,收藏46次。ARL灯塔是信息搜集的工具之一,一款基于Linux搭建的资源信息管理控制器,其作用就是搜集信息,可以快速侦察与目标关联的互联网资产,本次我们基于centos8.2进行搭建安装系统(目前暂不支持Windows)。前提:1.已经安装好docker //安装docker比较简单,不同系统安装命令略有差异,各位朋友自行百度安装即可2.已经安装好docker-compose安装docker-........._灯塔安装

随便推点

通用技术计算机辅助设计教案,高一通用技术课堂《设计的一般过程》的优秀教案...-程序员宅基地

文章浏览阅读263次。高一通用技术课堂《设计的一般过程》的优秀教案教学过程1. 引入新课多媒体投影展示几个新颖的设计,这些作品基于什么目的而设计的,它解决了什么问题?师:这些作品是怎么来的呢?生:设计出来的。师:我们要知道完成任何一件事情都有一个过程,须遵循一定的步骤,设计也不例外。通过前面的学习,我们已经知道,技术世界因设计而愈加精彩,设计是技术发展的关键。我们设计的最终目的是什么?就是为了解决人们的实际需要。那么同..._高一计算机技术与通用教案

POJ-3415-Common-Substring-后缀数组-并查集_并查集 poj 3415-程序员宅基地

文章浏览阅读172次。题目题目链接内容给两个字符串a,ba,ba,b ,和整数kkk 询问a,ba,ba,b的公共子串中长度大于等于kkk的个数分析对于一个长度为len(len>=k)len(len>=k)len(len>=k) 的公共子串,它对答案的贡献为len−k+1len-k+1len−k+1 ,我们构建后缀数组,将heightheightheight 数组排序,从大到小遍历hei..._并查集 poj 3415

linux脚本while死循环,shell编程之while死循环-程序员宅基地

文章浏览阅读2.5k次。在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环该怎么写呢?对于熟悉C语言的猿人们来说,最简单的死循环应该这样写:-------------------------------------------------------------------------while(1){//do something}---------------..._写一个死循环while(1)

成功人士的名言精选——看看你的名言是哪一句?你做到了吗?_brian tracy 名言-程序员宅基地

文章浏览阅读1k次。毋庸置疑,每个人都有自己的名言警句,因为有目标、因为有理想,我们都在拼命努地奋斗着、拼搏着,希望你的名言可以让你距离成功更进一步,相信自己! 1. Success is never a destination, it is a journey.—— Statenig St. Marie  成功不是终点,而是旅程。—— 斯塔特尼格·圣·玛_brian tracy 名言

python程序编译之后、找不到生成的pyc文件_浅谈python编译pyc工程--导包问题解决...-程序员宅基地

文章浏览阅读521次。利用python 编译工程,生产pyc文件pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样)所以可以将代码隐藏,便于商业价值,保护代码隐私还能和py文件一样可运行import compileallcompileall.compile_dir(r'/path')所以在一些情况下,需将源文件工程批量生成pyc文件来隐藏代码。上面代码即为 批量生成..._python 没有py文件调用pyc文件失败

抛弃格子衫和冲锋衣,程序员该如何穿?-程序员宅基地

文章浏览阅读111次。在众多人眼中,程序猿是最不会穿衣搭配的物种了,他们一年四季的标配就是格子衫加牛仔裤,冷的时候再加件冲锋衣。每到春夏,码农的大花格子衬衫就会在互联网公司的格子间遍地开花,如同冲锋衣是秋冬标配一样,格子衬衫就是程序员的夏季制服,一堆程序员在一起都不是连连看。人靠衣装,佛靠金装”这句话很多人都听过,但是放在心上的未必有几个,对于不善于穿衣打扮的程...序...员...来说,更是如此。根据聚能...