一、文件上传

上传文件是Web开发中经常要用到的功能:例如在基于B/S的人事信息管理系统中上传照片,在新闻发布系统中上传图片等等。。。。。要实现文件上传功能,就需要综合利用java中的文件输入和输出相关的类。

在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客服端发送到服务器的标准机制,能够考虑到跨平台的文本和二进制格式文件。但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp 运行机制所决定的。

下面是上传文件的jsp页面:

  1. <form action="file?file=upload" method="post" enctype="multipart/form-data">
  2. 请选择你要上传的文件:<input type="file" name="upload" siez="16"><br>
  3. <input type="submit" value="提交">
  4. </form>

对于文件上传表单处理其中method必须为post,也要增加类型enctype="multipart/form-data"。这样就可以把文件中的数据作为流式数据上传。当然无论是什么文件格式,均可以。。。

下面是servlet 处理程序:

  1. //接收上传文件内容中临时文件的文件名
  2. String tempFileName = new String("tempFileName");
  3. //tempfile 对象指向临时文件
  4. File tempFile = new File("D:/"+tempFileName);
  5. //outputfile 文件输出流指向这个临时文件
  6. FileOutputStream outputStream = new FileOutputStream(tempFile);
  7. //得到客服端提交的所有数据
  8. InputStream fileSourcel = request.getInputStream();
  9. //将得到的客服端数据写入临时文件
  10. byte b[] = new byte[1000];
  11. int n ;
  12. while ((n=fileSourcel.read(b))!=-1){
  13. outputStream.write(b,0,n);
  14. }
  15. //关闭输出流和输入流
  16. outputStream.close();
  17. fileSourcel.close();
  18. //randomFile对象指向临时文件
  19. RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
  20. //读取临时文件的第一行数据
  21. randomFile.readLine();
  22. //读取临时文件的第二行数据,这行数据中包含了文件的路径和文件名
  23. String filePath = randomFile.readLine();
  24. //得到文件名
  25. int position = filePath.lastIndexOf('\\');
  26. CodeToString codeToString = new CodeToString();
  27. String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1));
  28. //重新定位读取文件指针到文件头
  29. randomFile.seek(0);
  30. //得到第四行回车符的位置,这是上传文件数据的开始位置
  31. long  forthEnterPosition = 0;
  32. int forth = 1;
  33. while((n=randomFile.readByte())!=-1&&(forth<=4)){
  34. if(n=='\n'){
  35. forthEnterPosition = randomFile.getFilePointer();
  36. forth++;
  37. }
  38. }
  39. //生成上传文件的目录
  40. File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad");
  41. fileupLoad.mkdir();
  42. //saveFile 对象指向要保存的文件
  43. File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
  44. RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
  45. //找到上传文件数据的结束位置,即倒数第四行
  46. randomFile.seek(randomFile.length());
  47. long endPosition = randomFile.getFilePointer();
  48. int j = 1;
  49. while((endPosition>=0)&&(j<=4)){
  50. endPosition--;
  51. randomFile.seek(endPosition);
  52. if(randomFile.readByte()=='\n'){
  53. j++;
  54. }
  55. }
  56. //从上传文件数据的开始位置到结束位置,把数据写入到要保存的文件中
  57. randomFile.seek(forthEnterPosition);
  58. long startPoint = randomFile.getFilePointer();
  59. while(startPoint<endPosition){
  60. randomAccessFile.write(randomFile.readByte());
  61. startPoint = randomFile.getFilePointer();
  62. }
  63. //关闭文件输入、输出
  64. randomAccessFile.close();
  65. randomFile.close();
  66. tempFile.delete();

其中CodeToString()方法是一个中文字符处理的方法。如果文件不进行编码转换,则上传后的文件名将会是乱码,接收的文件数据也会是乱码:

下面是CodeToString()源代码:

  1. //处理中文字符串的函数
  2. public String codeString(String str){
  3. String s = str;
  4. try {
  5. byte[] temp = s.getBytes("utf-8");
  6. s = new String(temp);
  7. return s ;
  8. } catch (UnsupportedEncodingException e) {
  9. e.printStackTrace();
  10. return s;
  11. }
  12. }

二:文件下载          实现文件下载的最简单的方法就是使用超链接。假设在服务器上web目录下地upload子目录存在user.doc这个文档。如:

  1. <a href="http://localhost:8080/upload/user.doc">下载user.doc</a>

当单击这个超级链接时,将会在浏览器中直接打开这个文档,就像是把word软件嵌入在浏览器中一样。

打开文档后就可以实现另存为了。当然在web上,最常见的方式是单击链接后,出现“另存为”对话框:

  1. //获取要下载的文件名
  2. String filename = request.getParameter("name");
  3. //得到想客服端输出的输出流
  4. OutputStream outputStream = response.getOutputStream();
  5. //输出文件用的字节数组,每次向输出流发送600个字节
  6. byte b[] = new byte[600];
  7. //要下载的文件
  8. File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
  9. //客服端使用保存文件的对话框
  10. response.setHeader("Content-disposition", "attachment;filename="+filename);
  11. //通知客服文件的MIME类型
  12. response.setContentType("application/msword");
  13. //通知客服文件的长度
  14. long fileLength = fileload.length();
  15. String length = String.valueOf(fileLength);
  16. response.setHeader("Content_length", length);
  17. //读取文件,并发送给客服端下载
  18. FileInputStream inputStream = new FileInputStream(fileload);
  19. int n = 0;
  20. while((n=inputStream.read(b))!=-1){
  21. outputStream.write(b,0,n);
  22. }

在该程序中,response对象的setContentType()用来定义服务器发送给客服端内容的MIME类型。这里对MIME就不特别介绍了。事实上,凡是浏览器能处理的所有资源都有对应的MIME资源类型。在与服务器的交互中,浏览器就是对html、jsp等文件浏览器直接将其打开。对于word、excel等浏览器自身不能打开的文件则调用相应的方法。对于没有标记MIME类型的文件。浏览器则根据其扩展名和文件内容猜测其类型。。。

jsp文件上传、下载的更多相关文章

  1. JSP 文件上传下载系列之二[Commons fileUpload]

    前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是:  让添加强壮,高性能的文件到你的se ...

  2. jsp文件上传下载组件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  3. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  4. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

  5. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  6. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

  7. commons-fileupload实现文件上传下载

    commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例 上传页面,注意设置响应头 <body> ...

  8. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  9. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  10. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

随机推荐

  1. Ajax省市联动

    以JQuery为JS,写的Ajax省市联动. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  2. Android Handler使用实例

    本文主要介绍Android中Handler的简单使用方法,Handler跟多线程,消息队列联系很紧密,在平常的实际程序开发中比较常见.本文分为4个简单的例子来学校handler Handler使用例1 ...

  3. 想要风投被你的融资 PPT 打动吗?别忘了你其实就是在想方设法卖出自己公司的部分股权

      硅谷,一个常常见诸于报端,看着很熟悉,但是又不那么被人所了解的未及之地.它不是一个严格限定的地理位置,一般来说是指旧金山和湾区,其中湾区又分为东湾(East Bay)和南湾(South Bay), ...

  4. PostgreSql中如何kill掉正在执行的sql语句

    虽然可以使用 kill -9 来强制删除用户进程,但是不建议这么去做. 因为:对于执行update的语句来说,kill掉进程,可能会导致Postgres进入到recovery mode 而在recov ...

  5. The type xxx cannot be resolved. It is indirectly referenced from required .class files

    项目A中引入一个jar包B,在项目A中调用项目B,出现如下错误提示:   大致意思是:这上面所需的包是间接引用的,即A项目调用B项目,B项目又引用了另外一个包C,而这个包现在不在你的A项目的引用中. ...

  6. SQLserver游标原理和使用方法

    在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录.那么如何解决这种问题呢 ...

  7. UVa 10870 (矩阵快速幂) Recurrences

    给出一个d阶线性递推关系,求f(n) mod m的值. , 求出An-dv0,该向量的最后一个元素就是所求. #include <iostream> #include <cstdio ...

  8. POJ 3090 (欧拉函数) Visible Lattice Points

    题意: UVa 10820 这两个题是同一道题目,只是公式有点区别. 给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 对于点(x, y), 若g = gcd(x, y) ...

  9. android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)

    在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助. android. ...

  10. I.MX6 git patch

    /********************************************************************** * I.MX6 git patch * 说明: * 之前 ...