技术标签: 算法 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请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
文章浏览阅读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
文章浏览阅读111次。这一题,测试了好几种情况都通过了,例如:())(;((()));)))(((;(())));但是提交只能通过10%,我现在陷入死角了,求各位大佬帮忙;我这一题的思路是,遍历一遍字符串,假如最后结果栈中只有")("那么就判断一次交换可以成功,其他情况都不成功import java.util.Scanner;import java.util.Stack;/*** @Author: Taoyongpan..._笔试代码找错
文章浏览阅读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
文章浏览阅读2.5k次。本文目录结构问题Vue组件的生命周期答案总共分为8个阶段创建前/后,载⼊前/后,更新前/后,销毁前/后创建前/后: 在 beforeCreate 阶段, vue 实例的挂载元素 el 和数据对象 data 都为undefined ,还未初始化。在 created 阶段, vue 实例的数据对象 data 有了,el还 没有载⼊前/后:在 beforeMount 阶段, vue 实例的 $el 和 ..._vue渲染dom是在哪个环节
文章浏览阅读1.2k次。前两篇在服务器上把远程界面和虚拟机都安装好了后,现在进入第一小节,安装操作系统,这里要安装的是centos6.8。 1、下载安装系统。 进入CentOS官方网站 https://www.centos.org,找到要下载的系统下载,怎么下载,这个网上有很多资料,就不赘述了,我本地网很慢,依然在服务器上下载了wget http://archive.kernel.org/centos-vau..._ubuntu18.4对应centos那个版本
文章浏览阅读1.2w次,点赞10次,收藏46次。ARL灯塔是信息搜集的工具之一,一款基于Linux搭建的资源信息管理控制器,其作用就是搜集信息,可以快速侦察与目标关联的互联网资产,本次我们基于centos8.2进行搭建安装系统(目前暂不支持Windows)。前提:1.已经安装好docker //安装docker比较简单,不同系统安装命令略有差异,各位朋友自行百度安装即可2.已经安装好docker-compose安装docker-........._灯塔安装
文章浏览阅读263次。高一通用技术课堂《设计的一般过程》的优秀教案教学过程1. 引入新课多媒体投影展示几个新颖的设计,这些作品基于什么目的而设计的,它解决了什么问题?师:这些作品是怎么来的呢?生:设计出来的。师:我们要知道完成任何一件事情都有一个过程,须遵循一定的步骤,设计也不例外。通过前面的学习,我们已经知道,技术世界因设计而愈加精彩,设计是技术发展的关键。我们设计的最终目的是什么?就是为了解决人们的实际需要。那么同..._高一计算机技术与通用教案
文章浏览阅读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
文章浏览阅读2.5k次。在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环该怎么写呢?对于熟悉C语言的猿人们来说,最简单的死循环应该这样写:-------------------------------------------------------------------------while(1){//do something}---------------..._写一个死循环while(1)
文章浏览阅读1k次。毋庸置疑,每个人都有自己的名言警句,因为有目标、因为有理想,我们都在拼命努地奋斗着、拼搏着,希望你的名言可以让你距离成功更进一步,相信自己! 1. Success is never a destination, it is a journey.—— Statenig St. Marie 成功不是终点,而是旅程。—— 斯塔特尼格·圣·玛_brian tracy 名言
文章浏览阅读521次。利用python 编译工程,生产pyc文件pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样)所以可以将代码隐藏,便于商业价值,保护代码隐私还能和py文件一样可运行import compileallcompileall.compile_dir(r'/path')所以在一些情况下,需将源文件工程批量生成pyc文件来隐藏代码。上面代码即为 批量生成..._python 没有py文件调用pyc文件失败
文章浏览阅读111次。在众多人眼中,程序猿是最不会穿衣搭配的物种了,他们一年四季的标配就是格子衫加牛仔裤,冷的时候再加件冲锋衣。每到春夏,码农的大花格子衬衫就会在互联网公司的格子间遍地开花,如同冲锋衣是秋冬标配一样,格子衬衫就是程序员的夏季制服,一堆程序员在一起都不是连连看。人靠衣装,佛靠金装”这句话很多人都听过,但是放在心上的未必有几个,对于不善于穿衣打扮的程...序...员...来说,更是如此。根据聚能...