jsp文件上传、下载
一、文件上传
上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等。。。。。要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类。
在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件。但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp 运行机制所决定的。
下面是上传文件的jsp页面:
- <form action="file?file=upload" method="post" enctype="multipart/form-data">
- 请选择你要上传的文件:<input type="file" name="upload" siez="16"><br>
- <input type="submit" value="提交">
- </form>
对于文件上传表单处理其中method必须为post,也要增加类型enctype="multipart/form-data"。这样就可以把文件中的数据作为流式数据上传。当然无论是什么文件格式,均可以。。。
下面是servlet 处理程序:
- //接收上传文件内容中临时文件的文件名
- String tempFileName = new String("tempFileName");
- //tempfile 对象指向临时文件
- File tempFile = new File("D:/"+tempFileName);
- //outputfile 文件输出流指向这个临时文件
- FileOutputStream outputStream = new FileOutputStream(tempFile);
- //得到客服端提交的所有数据
- InputStream fileSourcel = request.getInputStream();
- //将得到的客服端数据写入临时文件
- byte b[] = new byte[1000];
- int n ;
- while ((n=fileSourcel.read(b))!=-1){
- outputStream.write(b,0,n);
- }
- //关闭输出流和输入流
- outputStream.close();
- fileSourcel.close();
- //randomFile对象指向临时文件
- RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
- //读取临时文件的第一行数据
- randomFile.readLine();
- //读取临时文件的第二行数据,这行数据中包含了文件的路径和文件名
- String filePath = randomFile.readLine();
- //得到文件名
- int position = filePath.lastIndexOf('\\');
- CodeToString codeToString = new CodeToString();
- String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1));
- //重新定位读取文件指针到文件头
- randomFile.seek(0);
- //得到第四行回车符的位置,这是上传文件数据的开始位置
- long forthEnterPosition = 0;
- int forth = 1;
- while((n=randomFile.readByte())!=-1&&(forth<=4)){
- if(n=='\n'){
- forthEnterPosition = randomFile.getFilePointer();
- forth++;
- }
- }
- //生成上传文件的目录
- File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad");
- fileupLoad.mkdir();
- //saveFile 对象指向要保存的文件
- File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
- RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
- //找到上传文件数据的结束位置,即倒数第四行
- randomFile.seek(randomFile.length());
- long endPosition = randomFile.getFilePointer();
- int j = 1;
- while((endPosition>=0)&&(j<=4)){
- endPosition--;
- randomFile.seek(endPosition);
- if(randomFile.readByte()=='\n'){
- j++;
- }
- }
- //从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中
- randomFile.seek(forthEnterPosition);
- long startPoint = randomFile.getFilePointer();
- while(startPoint<endPosition){
- randomAccessFile.write(randomFile.readByte());
- startPoint = randomFile.getFilePointer();
- }
- //关闭文件输入、输出
- randomAccessFile.close();
- randomFile.close();
- tempFile.delete();
其中CodeToString()方法是一个中文字符处理的方法。如果文件不进行编码转换,则上传后的文件名将会是乱码,接收的文件数据也会是乱码:
下面是CodeToString()源代码:
- //处理中文字符串的函数
- public String codeString(String str){
- String s = str;
- try {
- byte[] temp = s.getBytes("utf-8");
- s = new String(temp);
- return s ;
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- return s;
- }
- }
二:文件下载 实现文件下载的最简单的方法就是使用超链接。假设在服务器上web目录下地upload子目录存在user.doc这个文档。如:
- <a href="http://localhost:8080/upload/user.doc">下载user.doc</a>
当单击这个超级链接时,将会在浏览器中直接打开这个文档,就像是把word软件嵌入在浏览器中一样。
打开文档后就可以实现另存为了。当然在web上,最常见的方式是单击链接后,出现“另存为”对话框:
- //获取要下载的文件名
- String filename = request.getParameter("name");
- //得到想客服端输出的输出流
- OutputStream outputStream = response.getOutputStream();
- //输出文件用的字节数组,每次向输出流发送600个字节
- byte b[] = new byte[600];
- //要下载的文件
- File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
- //客服端使用保存文件的对话框
- response.setHeader("Content-disposition", "attachment;filename="+filename);
- //通知客服文件的MIME类型
- response.setContentType("application/msword");
- //通知客服文件的长度
- long fileLength = fileload.length();
- String length = String.valueOf(fileLength);
- response.setHeader("Content_length", length);
- //读取文件,并发送给客服端下载
- FileInputStream inputStream = new FileInputStream(fileload);
- int n = 0;
- while((n=inputStream.read(b))!=-1){
- outputStream.write(b,0,n);
- }
在该程序中,response对象的setContentType()用来定义服务器发送给客服端内容的MIME类型。这里对MIME就不特别介绍了。事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型。在与服务器的交互中,浏览器就是对html、jsp等文件浏览器直接将其打开。对于word、excel等浏览器自身不能打开的文件则调用相应的方法。对于没有标记MIME类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。
jsp文件上传、下载的更多相关文章
- JSP 文件上传下载系列之二[Commons fileUpload]
前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是: 让添加强壮,高性能的文件到你的se ...
- jsp文件上传下载组件
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- jsp+servlet实现文件上传下载
相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)
SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- SpringMVC文件上传下载
在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...
- commons-fileupload实现文件上传下载
commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例 上传页面,注意设置响应头 <body> ...
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- JAVA Web 之 struts2文件上传下载演示(二)(转)
JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
随机推荐
- C++异常以及异常与析构函数
1. 抛出异常 1.1 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常. 该语句的格式为: throw 表达式; 如果在try语句 ...
- 整理了一份招PHP高级工程师的面试题
1. 基本知识点 HTTP协议中几个状态码的含义:1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 100 (继续) 请求者应当继续提出请求. 服务器返回此代码 ...
- How to install JDK (Java Development Kit) on Linux
This tutorial will guide you on how to install JDK (Java Development Kit) on Linux. Since I use Cent ...
- ZOJ 3607 Lazier Salesgirl(贪心)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3607 题意:一个卖面包的小姑娘,给第i个来买面包的人的价格是pi, ...
- Activity的加载模式及Intent.setFlags
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity.可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity. ...
- BZOJ2482: [Spoj1557] Can you answer these queries II
题解: 从没见过这么XXX的线段树啊... T_T 我们考虑离线做,按1-n一个一个插入,并且维护区间[ j,i](i为当前插入的数)j<i的最优值. 但这个最优值!!! 我们要保存历史的最优值 ...
- Java [Leetcode 190]Reverse Bits
题目描述: everse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...
- make menuconfig 出错
运行 #make menuconfig HOSTLD scripts/kconfig/mconf scripts/kconfig/mconf.o: In function `main': mconf. ...
- Liunx 配置IDE
如果你还没装编译环境或自己不确定装没装,不妨先执行 sudo apt-get install build-essential 如果你已经了解一些 vim 的知识,而且想用它来编辑源代码,那么我们不妨装 ...
- Using Open Source Static Libraries in Xcode 4
Using Open Source Static Libraries in Xcode 4 Xcode 4.0.1 allows us to more easily create and use th ...