文件的上传和下载学习小结
一、文件上传
客户端通过浏览器将文件上传至服务器。 对于我们写代码来说,就是IO操作。 二、实现文件上传 对表单有什么要求? 1. 提交方式必须为post 2. enctype="multipart/form-data" 3. <input type="file" name="photo"/> 对于服务器的servlet有什么要求? request.getParameter("name"); 不能用该方式获取表单数据了,若非要用,则返回null。 request.getInputStream(); 使用字节输入流获取数据了。 数据能够获取到了,但是需要解析。大神可以自己解析(就是一顿切割、取值)! 对于小小牛的我,使用 Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),它最主要的工作就是帮我们解析request.getInputStream()。 该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。 Commons-fileupload commons-fileupload.jar commons-io.jar
DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(); List<FileItem> fileItems = sfu.parseRequest(request); FileItem接口的方法: isFormFiled(); 判断当前字段是否是普通文本字段,如果返回false,则说明是文件字段。 getFileName(); 获取字段名,例如:< input type="text" name="username" />,返回的是username。 getString("UTF-8"); 获取字段值,并解决上传普通文本表单出的乱码问题,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件。 getInputStream(); 获取上传文件对应的输入流。 getName(); 获取文件字段的文件名称(如:a.txt)。 getContentType(); 获取上传的文件的MIME类型,例如:text/plain、image/pjpeg。 getSize(); 获取上传文件的大小。 write(File file) 把上传的文件保存到指定文件中。 delete(); 三、文件上传需要考虑的几个问题
a、保证服务器的安全 把保存上传文件的目录放在用户直接访问不到的地方。 b、避免文件被覆盖 让文件名唯一即可。 c、避免同一个文件夹中的文件过多 方案一:按照日期进行打散存储目录 方案二:用文件名的hashCode计算打散的存储目录:二级目录 d、限制文件的大小:web方式不适合上传大的文件 设置单个文件大小 设置总文件大小 e、上传字段用户没有上传的问题 通过判断文件名是否为空即可。 f、临时文件的问题 如果上传文件过大,就会有临时文件。 FileItem.delete(); 如果自己用IO流实现的文件上传,则要在流关闭后,清理临时文件。 FileItem.write(File file); 把上传的文件保存到指定文件,该方式会自动删除临时文件,注意:实际操作不能够自动删除临时文件,所以需要手动删除(即:使用 FileItem自带的方法上传文件)。
我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】