java common file_common-fileupload组件实现java文件上传和下载

简介:文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到本地。对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

文件上传

(1)文件上传前端界面(fileupload.jsp)

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

文件上传

8

9

10

11

用户名:

12

密    码:

13

14

15

16

17

[注]:在文件上传的页面要用enctype="multipart/form-data" method="post"来表示进行文件上传

(2)文件上传细节

上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意的:

(2.1)、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。

(2.2)、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

(2.3)、为防止一个目录下面出现太多文件,要使用hash算法打散存储。

(2.4)、要限制上传文件的最大值。

(2.5)、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

(3)处理文件上传的servlet

1 packagecom.etc.utils;2

3 importjava.io.File;4 importjava.io.IOException;5 importjava.io.PrintWriter;6 importjava.util.List;7 importjava.util.UUID;8

9 importjavax.servlet.ServletException;10 importjavax.servlet.annotation.WebServlet;11 importjavax.servlet.http.HttpServlet;12 importjavax.servlet.http.HttpServletRequest;13 importjavax.servlet.http.HttpServletResponse;14

15 importorg.apache.commons.fileupload.FileItem;16 importorg.apache.commons.fileupload.disk.DiskFileItemFactory;17 importorg.apache.commons.fileupload.servlet.ServletFileUpload;18

19 @WebServlet("/FileUpload")20 public class FileUpload extendsHttpServlet {21 private static final long serialVersionUID = 1L;22

23 publicFileUpload() {24 super();25 }26

27 protected voiddoGet(HttpServletRequest request, HttpServletResponse response)28 throwsServletException, IOException {29 request.setCharacterEncoding("UTF-8");30 response.setCharacterEncoding("UTF-8");31 response.setContentType("text/html;charset=UTF-8");32 PrintWriter out =response.getWriter();33 String filedName = "";34

35 //1、创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory();

36 DiskFileItemFactory factory = newDiskFileItemFactory();37 //2、创建解析器:ServletFileUpload upload=new ServletFileUpload(factory);

38 ServletFileUpload upload = newServletFileUpload(factory);39 upload.setHeaderEncoding("UTF-8");40

41 //设置缓冲区大小与临时文件目录

42 factory.setSizeThreshold(1024 * 1024 * 10);43 File fileDir = new File("e:\\upload");44 if (!fileDir.exists())45 fileDir.mkdirs();46 //设置文件存储仓库

47 factory.setRepository(fileDir);48 //设置单个文件大小限制

49 upload.setFileSizeMax(1024 * 1024 * 10);50 //设置所有文件总和大小限制

51 upload.setSizeMax(1024 * 1024 * 100);52

53 //3、使用解析器解析request对象:List list=upload.parseRequest(request);

54 /**

55 * FileItem56 * String getFieldName():获取表单项的name的属性值。57 * String getName():获取文件字段的文件名。如果是普通字段,则返回null58 * String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。59 * String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。60 * long getSize():获取字段内容的大小,单位是字节。61 * boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。62 * InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流63 */

64 try{65 List list =upload.parseRequest(request);66 System.out.println(list);67 for(FileItem fileItem : list) {68 /*

69 * 对文件进行处理70 */

71 if (!fileItem.isFormField() && fileItem.getName() != null && !"".equals(fileItem.getName())) {72 String fileName =fileItem.getName();73 String uuid =UUID.randomUUID().toString();74 //获取文件的后缀名75 //String suffix = fileName.substring(fileName.lastIndexOf("."));76 //获取文件上传目录路径,在项目部署路径下的upload目录里。若想让浏览器不能直接访问到图片,可以放在WEB-INF下

77 String uploadPath = request.getSession().getServletContext().getRealPath("/upload");78 File file = newFile(uploadPath);79 file.mkdirs();80 //将文件写入对应路径,并对文件进行重命名

81 fileItem.write(new File(uploadPath, uuid + "_"+fileName));82 }83 /*

84 * 对表中的普通字段进行处理85 */

86 if(fileItem.isFormField()) {87 filedName =fileItem.getFieldName();88 String username = null;89 String pwd = null;90 if("username".equals(filedName)) {91 username = fileItem.getString("UTF-8");92 out.println("用户名:" +username);93 }94 if("pwd".equals(filedName)) {95 pwd = fileItem.getString("UTF-8");96 out.println("\t密码:" +pwd);97 }98 }99 }100 } catch(Exception e) {101 //TODO Auto-generated catch block

102 e.printStackTrace();103 }104

105 }106 protected voiddoPost(HttpServletRequest request, HttpServletResponse response)107 throwsServletException, IOException {108 doGet(request, response);109 }110 }

文件下载

(1)列出提供下载的文件资源

要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文件。

1 packagecom.etc.utils;2

3 importjava.io.File;4 importjava.io.IOException;5 importjava.util.HashMap;6 importjava.util.Map;7

8 importjavax.servlet.ServletException;9 importjavax.servlet.annotation.WebServlet;10 importjavax.servlet.http.HttpServlet;11 importjavax.servlet.http.HttpServletRequest;12 importjavax.servlet.http.HttpServletResponse;13

14 @WebServlet("/FileDownLoad")15 public class FileDownLoad extendsHttpServlet {16 private static final long serialVersionUID = 1L;17 publicFileDownLoad() {18 super();19 }20

21 protected voiddoGet(HttpServletRequest request, HttpServletResponse response)22 throwsServletException, IOException {23 response.getWriter().append("Served at: ").append(request.getContextPath());24 //获取上传文件的目录

25 String uploadFilePath = this.getServletContext().getRealPath("/upload");26 //储存要下载的文件名

27 Map fileMap = new HashMap();28 //递归遍历fileMap目录下的所有文件和目录,将文件储存到map集合中

29 fileList(newFile(uploadFilePath),fileMap);30 //将Map集合发送到listfile.jsp页面进行显示

31 request.setAttribute("fileMap", fileMap);32 request.getRequestDispatcher("/listfile.jsp").forward(request, response);33 }34

35 public void fileList(File file, MapfileMap) {36 //如果file代表的不是一个文件而是一个目录

37 if (!file.isFile()) {38 File[] files =file.listFiles();39 for(File file2 : files) {40 fileList(file2, fileMap);41 }42 } else{43 /**

44 * 处理文件名,上传后的文件是以uuid_文件名的形式去重新命名的,去除文件名的uuid_部分45 * file.getName().indexOf("_")检索字符串中第一次出现"_"字符的位置,如果文件名类似于:9349249849-88343-8344_timer.avi46 * 那么file.getName().substring(file.getName().indexOf("_")+1)处理之后就可以得到timer.avi部分47 */

48 String realName = file.getName().substring(file.getName().lastIndexOf("_")+1);49 System.out.println(realName);50 fileMap.put(file.getName(), realName);51 }52 }53

54 protected voiddoPost(HttpServletRequest request, HttpServletResponse response)55 throwsServletException, IOException {56 doGet(request, response);57 }58 }

(2)创建显示文件列表的jsp界面(listfile.jsp)

1

2 pageEncoding="UTF-8"%>

3

4

5

6

7

8

9

下载文件显示界面

10

11

12

13

14

文件下载列表

15

16

17

18

19

20

21

${me.value}下载

22

23

24

25

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值