一、文件上传

上传文件是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. 配置Excel的DCOM权限

    异常详细信息: System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-00000000004 ...

  2. Android ListView高度自适应和ScrollView冲突解决

    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...

  3. 利用 java.lang.Runtime.addShutdownHook() 钩子程序,保证java程序安全退出

    以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...

  4. 高难度(3)RenderScript

    RenderScript RenderScript is a framework for running computationally intensive tasks at high perform ...

  5. Space and GridLayout 教程

    Ice Cream Sandwich (ICS) sports two new widgets that have been designed to support the richer user i ...

  6. 让Eclipse和NetBeans共享同一个项目

    有的时候,我们会下载一些源代码来学习研究,但是下载下来的工程文件是eclipse的或者是NetBeans的.如果手头上没有eclipse或者没有 NetBeans,或只有其中一个怎么办?又或者,你习惯 ...

  7. 最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明

    Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y: ...

  8. bzoj2085

    首先看到k的范围就该知道这题不是倍增就是矩乘 首先肯定要求出任意一对串(a,b) a的后缀与b的前缀相同的最长长度是多少 考虑到kmp求出的失配指针是一个串最长后缀和前缀相等的长度 这里多个串我们只要 ...

  9. UVa 1262 (第k字典序) Password

    题意: 给出两个6行5列的字母矩阵,一个密码满足:密码的第i个字母在两个字母矩阵的第i列均出现. 然后找出字典序为k的密码,如果不存在输出NO 分析: 我们先统计分别在每一列均在两个矩阵出现的字母,然 ...

  10. Vagrant工具

    Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史. 我们可以通过 Va ...