JSP网站开发基础总结《十四》
对于JSP的知识总结,已经为大家分享的差不多了,本篇就为大家做一下最后总结,本篇总结的主题是文件上传和下载,在之前的随笔中也有为大家分享过文件上传和下载的知识,不过都是通过JAVA提供的上传下载类实现的,本篇将通过文件输入输出流的方式为大家精讲一下文件的上传和下载实现,我相信当你了解了底层的实现后,会很方便你对于文件的上传和下载进行拓展。好了废话不多说,下面我们开始本篇的总结。
1、上传分析:
文件上传就是,我们通过Form表单中的input属性,向后台发送用户需要上传的文件,后台当发现用户发送的请求后,首先将用户上传的文件保存到一个临时文件中,为接下来我们获取上传文件名和上传文件内容做准备。
2、jsp页面要求:
form的method="post"一定要设置为post方式,因为get方式传输,首先他是一种不安全的传输,其次它传输的内容大小有限,不能传输大量的数据。然后我们要修改enctype="multipart/form-data",默认值为:application/x-www-form-urlencoded。具体的代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>上传文件</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<center>
<h1>文件上传</h1>
<form action="<%=request.getContextPath() %>/servlet/ShangChuan" method="post" enctype="multipart/form-data">
选择上传文件:<input type="file" name="file" id="file"/><input type="submit" value="上传"><span style="color: red">${news }</span>
</form>
</center>
</body>
</html>
3、后台servlet:
第一步:把用户上传的文件保存的一个临时文件
InputStream fileSource = request.getInputStream();
String tempFileName = "F:/cnblogs/text"; File tempFile = new File(tempFileName);
FileOutputStream outputStream = new FileOutputStream(tempFile);
byte [] b = new byte[2048];
int n;
while((n = fileSource.read(b))!=-1){
outputStream.write(b, 0, n);
}
//关闭输入、输出流
outputStream.flush();
outputStream.close();
fileSource.close();
第二步:通过获取临时文件中的内容来捕获用户上传文件的名字和内容区域的位置
//获取上传文件的名称
RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r");
randomFile.readLine();
String str = randomFile.readLine();
int beginIndex = str.lastIndexOf("=\"")+2;
int endIndex = str.lastIndexOf("\"");
String fileName = str.substring(beginIndex, endIndex);
System.out.println("fileName:"+fileName);
//重新定位文件指针到文件头
randomFile.seek(0);
long startPosition = 0;
int i = 1;
//获取文件内容开始位置
while((n=randomFile.readByte())!=-1&&i<=4){
if(n=='\n'){
startPosition = randomFile.getFilePointer();
i++;
}
}
startPosition = startPosition-1;
//获取文件内容到结束位置
randomFile.seek(randomFile.length());
long endPosition = randomFile.getFilePointer();
int j = 1;
while(endPosition>=0&&j<=2){
endPosition--;
randomFile.seek(endPosition);
if(randomFile.readByte()=='\n'){
j++;
}
}
endPosition = endPosition-1; //设置保存文件的路径
String realPath = getServletContext().getRealPath("/")+"images";
File fileupload = new File(realPath);
if(!fileupload.exists()){
fileupload.mkdir();
}
File saveFile = new File(realPath, fileName);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile, "rw");
//从临时文件当中读取文件内容(根据起止位置获取)
randomFile.seek(startPosition);
while(startPosition<endPosition){
randomAccessFile.write(randomFile.readByte());
startPosition = randomFile.getFilePointer();
}
//关闭输入、输出流,删除临时文件
randomAccessFile.close();
randomFile.close();
tempFile.delete();
request.setAttribute("news", "文件上传成功");
request.getRequestDispatcher("/index.jsp").forward(request, response);
这里是通过String类的LastIndexOf()方法和subString()方法来获得我们需要的内容。到这里我们的上传就实现了,下面我们来一起学习一下下载的工程。
4、下载的JSP页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>文件下载</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<center>
<h1>文件下载操作</h1>
<a href="<%=request.getContextPath() %>/servlet/download?filename=text.txt" >Text.txt</a><span style="color: red">${news }</span>
</center>
</body>
</html>
5、后台servlet:
public class download extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取文件下载路径
String path = getServletContext().getRealPath("/")+"images/";
String filename = request.getParameter("filename");
File file = new File(path+filename);
if(file.exists()){
//设置相应的类型
response.setContentType("application/x-msdownload");
//设置头信息
response.setHeader("content-Disposition", "attachment;filename=\""+filename+"\"");
InputStream input = new FileInputStream(file);
ServletOutputStream output = response.getOutputStream();
byte[] b = new byte[2048];
int n;
while((n=input.read(b))!=-1){
output.write(b, 0, n);
}
//关闭流对象
output.close();
input.close();
}else{
request.setAttribute("news", "文件不存在,下载失败。");
request.getRequestDispatcher("/MyJsp.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这下我们的文件上传和下载已经实现了,当然这些都是最基本的东西,大家可以发挥自己脑力进行拓展,到今天关于JSP的总结为大家分享完毕了,大家如有疑问请留言讨论。
JSP网站开发基础总结《十四》的更多相关文章
- JSP网站开发基础总结《二》
有了上一篇的学习,我相信大家对于JSP一定有了一定的认识,从今天开始我们真正开启JSP模式,如果你有HTML的基础,那学起JSP来也就方便了很多了,首先JSP做为网站开发语言,它与HTML有很多相似的 ...
- JSP网站开发基础总结《一》
经过JAVASE的学习相信大家对JAVA已经不再陌生,那么JAVA都可以干什么呢?做算法.应用程序.网站开发都可以,从今天开始为大家奉上JAVAEE之JSP动态网站开发基础总结. 既然是动态网站开发, ...
- JSP网站开发基础总结《八》
JSP的学习总结到本篇已经八篇了,内容比较多,但都是实战,本篇最后为大家介绍一个小效果:百度分页.就是当我们遍历的数据对象较多时,这时我们就会看到了这个效果了,那他是如何实现的呢?下面我们就一起学习一 ...
- JSP网站开发基础总结《七》
按照计划本篇将为大家总结搜索功能的两种实现:确定搜索与模糊搜索.所谓精确搜索便是指,根据用户的输入的搜索内容,在数据库中寻找具有一一对应的关系的数据,一般都是用户在数据库中的主键值.而模糊搜索,是一种 ...
- JSP网站开发基础总结《十二》
前两篇已经简单为大家介绍了一下,有关Filter接口的知识,本篇就让我们以一个登录小功能,来具体实现一下过滤器的作用,便于大家掌握.具体为大家介绍一下如何使用Filter对访问进行过滤,及如何防止中文 ...
- JSP网站开发基础总结《四》
经过前几篇的摸爬滚打,下面我们就开始我们真正的数据库操作了,本篇重点在于如何在网站端编写数据库操作语句,内容不多,就是我们常见的增删改查. 0.数据库对象创建: 在JAVASE基础知识总结时,就为大家 ...
- JSP网站开发基础总结《十三》
继上一篇为大家补充过滤器类后,本篇为大家简单介绍一下如何实现验证码效果.验证码的作用是什么呢?1.防止恶意注册2.防止恶意提交3.防止盗取账户等等,总的来说验证码的存在就是为了,防止非人为的操作,不过 ...
- JSP网站开发基础总结《九》
本篇属于附加篇,在之前的总结中给大家提到过一个关于登录状态验证的效果,当时是通过Session对象完成的,今天我查了一下,JSP为我们封装了一个用于过滤用的过滤器类Filter,通过它我们就可以非常轻 ...
- JSP网站开发基础总结《六》
对于本篇需要总结的内容,量估计有点大,大家好好看哈,绝对全是干货,代码的已经运行测试,不存在问题,大家可以参考学习,下面开始本篇的内容. 1.添加数据到数据库: 如何用户在JSP页面的填写的信息输入到 ...
- JSP网站开发基础总结《九》(转)
本篇属于附加篇,在之前的总结中给大家提到过一个关于登录状态验证的效果,当时是通过Session对象完成的,今天我查了一下,JSP为我们封装了一个用于过滤用的过滤器类Filter,通过它我们就可以非常轻 ...
随机推荐
- GetRelevantAnimTimeRemainingFraction节点Bug
初始设置: 动画状态机: MoveStop->Idle的条件: 使用该节点的目的: 在动画蓝图的过渡条件中使用该节点,保证上一个状态的动作完成后进入下一个动作.需求是MoveStop动作完成后才 ...
- 不常用的toLocaleString()方法
在javascript中所有的对象都具有toLocaleString().toString()和valueOf()方法. 其中,很多情况调用toString()和valueOf方法会返回相同的值,但是 ...
- strncpy和memcpy的区别
今天不小心在该用memcpy的时候,用了strncpy使自己吃了亏,所以写出这个博文. memcpy就是纯字节拷贝,而strncpy就不同了,字符串是以'\0'结尾的.如果一个字符buffer长度为6 ...
- tableindex
在写代码的时候,失焦的第一反应便是ng-blur,没想到在一个标签上其作用了,多加了几个标签没反应,于是发现了tableindex,写的代码列子如下,希望可以帮助你: <img src='{{a ...
- MFC学习随笔(1)
最近在学习用MFC编写一个简单的界面.其实MFC并不是十分复杂的,经过一段时间的熟悉就可以实现许多基础功能.但是在编写的过程中,经常会遇到林林总总的bug,让人摸不到头脑.今天记录一个过去没有注意过的 ...
- iOS一些关于日历的问题
int CalculateDays(int ys, int ms, int ds, int ye, int me, int de) { int days = CalcYearRestDays(ys, ...
- Constructing Roads In JGShining's Kingdom(HDU1025)(LCS序列的变行)
Constructing Roads In JGShining's Kingdom HDU1025 题目主要理解要用LCS进行求解! 并且一般的求法会超时!!要用二分!!! 最后蛋疼的是输出格式的注 ...
- linux-15基础命令之-用户与用户组(useradd,userdel,usermod,passwd,groupadd)
1.useradd 命令用于创建新的用户,格式为:useradd[选项] 用户名 useradd参数 参数 作用 -d 指定用户的家目录(默认/home/username) -D 展示默认值 -e 帐 ...
- 【转载】关于.NET里的内存泄漏
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中..Net 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.虽然.N ...
- SQL Server认证培训与考试
Microsoft 技术专员 (MTA) - 数据库 https://www.microsoft.com/zh-cn/learning/mta-certification.aspx MCSA: SQL ...