Java+jsp+Servlet实现文件上传和下载
来源:互联网 发布:计算软件有哪些 编辑:程序博客网 时间:2024/06/06 00:03
文件的上传和下载---学习笔记
2016-06-26 22:26 502人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
- 文件上传原理
- 文件下载原理
- 使用SmartUpload实现文件的上传和下载
文件上传原理
在TCP/IP中,最早出现的文件上传机制是FTP。它是将文件由客户端发送到服务器的标准机制。
但是JSP编程中不能使用FTP方法来上传文件,这是由JSP运行机制所决定的。
JSP中上传文件的解决方式:
通过为表单元素设置
Method = “post”
enctype = “multipart/form-data”
属性,让表单提交的数据以二进制编码的方式提交,在接受此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
表单中enctype属性说明:
enctype属性的值有三种:
- application/x-www-form=urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
- multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
- text/plain:这种方式主要适用于直接通过表单发送邮件的方式
文件上传的实现步骤:
- 环境搭建:配置web.xml创建UploadServlet
- 前台页面配置:Form的method设置为post,enctype设置为multipart/form-data
- 后台Servlet实现:保存上传文件
上传文件的后台实现的具体步骤:
- 获取request当中的流信息,保存到临时文件
- 从临时文件当中得到上传的文件名及文件内容起止位置
- 根据文件起止位置,读取上传文件内容,保存到本地
文件的上传:
//文件上传 private void uploadFile(HttpServletRequest request, HttpServletResponse response) throws IOException, FileNotFoundException, ServletException { // 从request当中获取流信息 InputStream is = request.getInputStream(); // 在本地创建临时文件 String tempFileName = "C:\\Users\\Administrator\\Desktop\\tempFile"; File tempFile = new File(tempFileName); // 将request请求中的所有信息写入临时文件中 FileOutputStream fos = new FileOutputStream(tempFile); byte[] b = new byte[1024]; int n; while ((n = is.read(b)) != -1) { fos.write(b, 0, n); } fos.close(); is.close(); // 获取临时文件中的上传文件的文件名 RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r"); randomFile.readLine();// 读取第一行数据 String str = randomFile.readLine();// 读取第二行的内容 int beginIndex = str.lastIndexOf("\\") + 1; System.out.println("开始位置:"+beginIndex); int endIndex = str.lastIndexOf("\""); String filename = str.substring(beginIndex, endIndex); System.out.println("文件名:"+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 = randomFile.getFilePointer()-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"; System.out.println("上传文件的路径:"+realPath); 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(); } //关闭输入输出流、删除临时文件 randomFile.close(); randomAccessFile.close(); tempFile.delete(); request.setAttribute("result", "上传成功!"); RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/01.jsp"); dispatcher.forward(request, response); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
文件下载原理
文件下载的步骤:
- 需要通过HttpServletResponse.setContentType方法设置Content-Type头字段的值,位浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如:“application/octet-stream”或“application/x-msdownload”等。
- 需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为“attachment;filename=”文件名””。
- 读取下载文件,调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入附件文件内容。
实现步骤:
- 前台页面开发:通过超链接的方式发起文件下载请求
- 配置web.xml文件:配置web.xml,创建DownloadServlet
- 后台Servlet实现:设置响应类型及响应头输出流写入文件内容
批量文件下载:
// 批量下载文件 private void downMore(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("application/x-msdownload"); resp.setHeader("Content-Disposition", "attachment;filename=test.zip"); String path = getServletContext().getRealPath("/") + "images/"; String[] filenames = req.getParameterValues("filename"); String str = ""; String rt = "/r/n"; ZipOutputStream zos = new ZipOutputStream(resp.getOutputStream()); for (String filename : filenames) { str += filename + rt; File file = new File(path+filename); zos.putNextEntry(new ZipEntry(filename)); FileInputStream fis = new FileInputStream(file); byte[] b = new byte[1024]; int n = 0; while ((n = fis.read(b)) != -1) { zos.write(b, 0, n); } zos.flush(); fis.close(); } zos.setComment("download success:" + rt + str); zos.flush(); zos.close(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
单文件下载:
// 下载一个文件 private void downOne(HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException, ServletException { // 获取文件下载路径 String path = getServletContext().getRealPath("/") + "images/"; System.out.println("要下载的文件路径地址:" + path); String filename = request.getParameter("filename"); File file = new File(path + filename); if (file.exists()) { // 设置响应类型 response.setContentType("application/x-msdownload"); // 设置头信息(作用:以附件的形式打开我们的下载文件,并且指定了附件的名称,这样下载的时候文件名就是这里设置的文件名称了) response.setHeader("Content-Dispostion", "attachment;filename=\"" + filename + "\""); InputStream is = new FileInputStream(file); ServletOutputStream sos = response.getOutputStream(); byte[] b = new byte[1024]; int n; while ((n = is.read(b)) != -1) { sos.write(b, 0, n); } // 关闭流释放资源 sos.close(); is.close(); } else { request.setAttribute("errorResult", "文件不存在,下载失败!"); RequestDispatcher dispatcher = request.getRequestDispatcher("jsp/01.jsp"); dispatcher.forward(request, response); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
使用SmartUpload实现文件的上传和下载
1.使用该组件可以轻松的实现上传文件类型的限制,也可以轻易的取得文件上传的名称、后缀、大小等。
2.SmartUpload本身也是一个系统提供的jar包,直接将此包放到classpath下即可,也可以拷贝到tomcat_home\lib目录中
使用SmartUpload实现文件的批量上传:
private void uploadFiles(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置上传文件保存路径 String filePath = getServletContext().getRealPath("/")+"images"; System.out.println("上传到的文件路径地址:"+filePath); File file = new File(filePath); if(!file.exists()){ file.mkdir(); } String result = "上传成功!"; SmartUpload su = new SmartUpload(); //初始化对象 su.initialize(getServletConfig(), request, response); //设置上传文件的大小(10M) su.setMaxFileSize(1024*1024*10); //设置上传的所有文件的大小(100M) su.setTotalMaxFileSize(1024*1024*100); //设置上传文件的的类型 su.setAllowedFilesList("txt,jpg,gif"); //设置禁止上传文件的类型 try { su.setDeniedFilesList("rar,jsp,js"); //上传文件 su.upload(); //将上传文件保存在文件夹中(返回的是上传的文件的个数) int count = su.save(filePath); System.out.println("上传成功了"+count+"个文件!"); } catch (Exception e) { result = "上传失败!"; if(e.getMessage().indexOf("1015")!=-1){ result = "上传失败:上传文件类型不正确!"; }else if(e.getMessage().indexOf("1010")!=-1){ result = "上传失败:上传文件的类型不正确!"; }else if(e.getMessage().indexOf("1105")!=-1){ result = "上传失败:上传文件的大小大于允许上传的最大值!"; }else if(e.getMessage().indexOf("1110")!=-1){ result = "上传失败:上传文件的总大小大于允许上传的最大值!"; } e.printStackTrace(); } //通过SmartUpload获得上传文件的其他属性 for(int i=0;i<su.getFiles().getCount();i++){ org.lxh.smart.File tempFile = su.getFiles().getFile(i); System.out.println("----------------------"); System.out.println("上传的文件名:"+tempFile.getFileName()); System.out.println("上传的文件的大小:"+tempFile.getSize()); System.out.println("上传的扩展名:"+tempFile.getFileExt()); System.out.println("上传的文件的全名:"+tempFile.getFilePathName()); System.out.println("----------------------"); } request.setAttribute("result", result); request.getRequestDispatcher("jsp/02.jsp").forward(request, response); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
使用SmartUpload实现文件的下载(单文件下载):
//下载一个文件 private void downOne(HttpServletRequest request, HttpServletResponse response) { String filename = request.getParameter("filename"); SmartUpload su = new SmartUpload(); try { su.initialize(getServletConfig(), request, response); su.downloadFile("/images/" + filename); } catch (Exception e) { e.printStackTrace(); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
项目完整代码的Github地址:
- 顶
- 0
- 踩
- 0
- 上一篇常用工具类的积累
- 下一篇java中volatile关键字---学习笔记
相关文章推荐
- • php学习笔记(十)文件的上传与下载
- • Struts2学习笔记(七)之文件的下载
- • Java web 中实现简单的文件上传与下载——学习笔记
- • ThinkPHP学习笔记(十四)上传文件
- • Struts2学习笔记13:Struts2的文件上传和下载
- • Struts2.x 学习笔记 之 文件上传和下载
- • MonoRail学习笔记十五:文件上传
- • hadoop学习笔记之hdfs的文件上传下载
- • OA (ssh) 基本实现(poi 生成 Excel , struts2动态下载 mysql数据库文件) 学习笔记(含源代码)
- • Flask--学习笔记--上传、下载文件
阅读全文
0 0
- Java+jsp+Servlet实现文件上传和下载
- Servlet和Jsp实现原生的上传与下载文件
- jsp+servlet实现文件的上传和下载
- Jsp/Servlet:实现文件上传与下载
- jsp+servlet实现文件上传与下载
- Jsp/Servlet:实现文件上传与下载
- Jsp/Servlet:实现文件上传与下载
- Jsp/Servlet:实现文件上传与下载
- Jsp/Servlet:实现文件上传与下载
- 文件上传和下载(一)--【jsp+servlet】
- JSP和Servlet实现文件上传
- servlet实现文件上传和下载
- servlet实现文件的上传和下载
- 【ZT】Jsp/Servlet:实现文件上传与下载【一】
- 【ZT】Jsp/Servlet:实现文件上传与下载【二】
- 【ZT】Jsp/Servlet:实现文件上传与下载【三】
- 使用jsp/servlet简单实现文件上传与下载
- servlet+jsp实现的文件上传与下载
- unix://localhost:80: Permission denied 问题解决
- C语言实现单链表面试题--基础篇
- h5做app和原生app有什么区别?
- java反射1—获取class文件对象
- EXPDP&IMPDP搬移表空间-笔记
- Java+jsp+Servlet实现文件上传和下载
- git图形化工具GitKraken的使用——Stash和Pop
- MyBatis Generator自动生成代码
- 复杂链表的复制
- xStream完美转换XML、JSON
- PHP新手该怎么学习
- Hadoop集群配置
- cocos2d-x游戏开发的一些问题
- C++类型转换函数(类型转换运算符函数)