文件上传与下载

对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

文件上传流程:

1、jsp页面上传文件

2、后台获取文件流(原理都是一样的,实现方式有所不同。

sevelet一般用ServletFileUpload从HttpServletRequest获取;

struts2会自动将文件流封装为File对象;springmvc则是MultipartFile)

3、获取输出流,在相应目录生成文件

文件上传页面index.jsp代码

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2
 3     pageEncoding="UTF-8"%>
 4
 5 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 6
 7
 8
 9 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
10
11 <html>
12
13 <head>
14
15 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
16
17 <title>Insert title here</title>
18
19 </head>
20
21 <body>
22
23     <h1>test file upload</h1>
24
25     <form action="fileUpload" method="post" enctype="multipart/form-data">
26
27         <input type="hidden" name="method" value="upload"/>
28
29         <input type="file" name="file"/>
30
31         <input type="submit" value="upload"/>
32
33     </form>
34
35 </body>
36
37 </html>

文件处理类代码

  1 package com.updown.controller;
  2
  3 import java.io.BufferedInputStream;
  4 import java.io.BufferedOutputStream;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.InputStream;
  8 import java.io.OutputStream;
  9 import java.text.SimpleDateFormat;
 10 import java.util.Date;
 11 import java.util.List;
 12 import java.util.UUID;
 13
 14 import javax.annotation.Resource;
 15 import javax.servlet.http.HttpServletRequest;
 16 import javax.servlet.http.HttpServletResponse;
 17 import org.springframework.stereotype.Controller;
 18 import org.springframework.web.bind.annotation.RequestMapping;
 19 import org.springframework.web.multipart.MultipartFile;
 20 import org.springframework.web.multipart.MultipartHttpServletRequest;
 21
 22 import com.updown.entity.Content;
 23 import com.updown.service.ContentService;
 24
 25 @Controller
 26 public class FileOperateController{
 27
 28     /**
 29      * 上传文件
 30      * @param request
 31      * @param model
 32      * @return
 33      */
 34     @Resource(name = "contentService")
 35      private ContentService contentService;
 36     @RequestMapping
 37     public String toUpload(){
 38         return "index";
 39     }
 40
 41     @RequestMapping( value="fileUpload")
 42     public String upload(HttpServletRequest request) throws Exception{
 43
 44         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
 45         SimpleDateFormat dateformat = new SimpleDateFormat("yyyy/MM/dd/HH");
 46         //构建保存的目录
 47         String fileRelativePath = "/files"+ dateformat.format(new Date());
 48         //得到保存目录的真实路径
 49         String fileRealPath = request.getSession().getServletContext().getRealPath(fileRelativePath);
 50         //根据真实路径创建目录
 51         File saveFile = new File(fileRealPath);
 52         if(!saveFile.exists())
 53             saveFile.mkdirs();  //mkdirs()返回当且仅当创建的目录,以及所有必需的父目录
 54         //页面控件的文件流,返回此请求中上传文件的内容加上说明,或者如果它不存在则返回空
 55         MultipartFile multipartFile = multipartRequest.getFile("file");
 56         //获取文件的后缀,getOriginalFilename返回到原来的文件名在客户端的文件系统
 57         String suffix = multipartFile.getOriginalFilename().substring
 58                         (multipartFile.getOriginalFilename().lastIndexOf("."));
 59         //文件白名单
 60         String[] fileType={"gif","jpg","jpeg","png","bmp","doc","docx","pdf","xls","xlsx","txt","zip","rar"};
 61         //循环查找字符串数组中的每个字符串中是否包含所有查找的内容
 62         for(int i=0;i<fileType.length;i++){
 63                if(fileType[i].indexOf(suffix.substring(1))!=-1){
 64
 65         String uuid = UUID.randomUUID().toString();
 66         String fileName = multipartFile.getOriginalFilename();
 67         //拼成完整的文件保存路径加文件
 68         String fileAbsolutePath = fileRealPath + File.separator   + fileName;
 69         File file = new File(fileAbsolutePath);
 70
 71             multipartFile.transferTo(file);
 72
 73             Content content=new Content();
 74             content.setPath(fileRelativePath);
 75             content.setDate(dateformat.format(new Date())+ uuid );
 76             content.setTitle(fileName);
 77         //数据库操作
 78         int up_result=contentService.addContent(content);
 79         List<Content> list=contentService.listAllDepartment();
 80         request.setAttribute("list",list);
 81         }
 82                }
 83         return "/success";
 84     }
 85
 86     /**
 87      * 下载文件
 88      * @param request
 89      * @param response
 90      * @return
 91      */
 92     @RequestMapping(value = "download")
 93     public void download(HttpServletRequest request,HttpServletResponse response)throws Exception{
 94
 95         String title=request.getParameter("title");
 96         Content content=contentService.getContentByTitle(title);
 97         String fileSqlSavePath = content.getPath();
 98         String fileServerPath=request.getSession().getServletContext().getRealPath(fileSqlSavePath);
 99         String fileAbsolutePath=fileServerPath+"\\"+title;
100         File file = new File(fileAbsolutePath);
101         // 取得文件的后缀名
102         String suffix = title.substring(title.lastIndexOf("."));
103         // 以流的形式下载文件
104         InputStream fis = new BufferedInputStream(new FileInputStream(fileAbsolutePath));
105         //public int available() throws IOException{}返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值
106         byte[] buffer = new byte[fis.available()];
107         //这个方法从输入流读取buffer.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1
108         fis.read(buffer);
109         fis.close();
110         // 清空response
111         response.reset();
112         // 设置response的Header
113         response.addHeader("Content-Disposition", "attachment;filename=" + new String(title.getBytes("gb2312"),"iso8859-1"));
114         response.addHeader("Content-Length", "" + file.length());
115         OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
116         response.setContentType("application/octet-stream");
117         toClient.write(buffer);
118         toClient.flush();
119         toClient.close();
120     }
121 }

时间: 2024-10-16 07:54:13

文件上传与下载的相关文章

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

深入分析JavaWeb Item40 -- 文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

文件上传与下载!

1.上传: 1.上传数据的类型:字符,字节 1.文本类型(字符):通过url网址的?:通过表单元素:AJAX. 2.文件类型(字节):通过表单元素(file). 2.上传文件的方式: 1.form表单实现文件上传:常用方式(上传文件用post,不用get,因为get方式对于上传量有限) 通过鼠标单击,在File标签中选择的文件,才能上传. 2.通过AJAX实现文件上传:禁用方式   AJAX的数据传递通过javascript脚本取值.如果传递文件,那么也需要通过javascript脚本获取文件内

springmvc和servlet下的文件上传和下载(存文件目录和存数据库Blob两种方式)

项目中涉及了文件的上传和下载,以前在struts2下做过,今天又用springmvc做了一遍,发现springmvc封装的特别好,基本不用几行代码就完成了,下面把代码贴出来: FileUpAndDown.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <head> <title>using commons Uplo

struts2中的文件上传和下载

天下大事,必做于细.天下难事,必作于易. 曾经见过某些人,基础的知识还不扎实就去学习更难的事,这样必然在学习新的知识会很迷惑结果 再回来重新学习一下没有搞懂的知识,这必然会导致学习效率的下降!我写的这篇上传和下载都很基础. 十分适合初学者! jsp:页面 <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data, 不然就会以二进制文本上传到服务器端--> <for

JavaWeb文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st

Linux 指令篇:文件上传和下载 lrzsz

[ "lrzsz"一般用于SecureCRT ssh中使用 ] 简介:rz,sz是早期Linux/Unix同Windows进行ZModem文件传输的命令行工具.rz ,sz 是非常古老的zmodem协议使用的上传下载命令,早就被抛弃了的东西,目前的发行版基本都不再预装. 优点:比ftp命令方便,而且服务器不用打开FTP服务. 命令sz:将选定的文件发送(send)到本地机器 命令rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器. lrzsz安装方法: [[e

FileUpload系列:(3)文件上传和下载示例

示例由1个Servlet和3个JSP组成. 1.FileServlet package com.rk.web.servlet; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.Has

JavaWeb学习总结,文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

java里面的文件上传与下载

文件的上传与下载主要用到两种方法:1.方法一:commons-fileupload.jar commons-io.jarapache的commons-fileupload实现文件上传,下载 [upload]package com.handson.bbs.servlet; import java.io.File;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.Se