欢迎使用CSDN-markdown编辑器
来源:互联网 发布:淘宝木子禅佛珠怎么样 编辑:程序博客网 时间:2024/04/29 02:21
java之文件上传
1、文件上传
文件上传架构(B/S架构),是浏览器和服务器架构,浏览器发出请求,服务器给出响应。
- 1.1、浏览器部分代码实现
<!-- 设置一个form表单,设置请求方式为post,保证发送数据没有长度限制 --> <!-- 设置enctype="multipart/form-data" 用来提示当前是文件上传请求 --> <form action="${root }/upload" method="post" enctype="multipart/form-data"> <!-- 设置一个按钮,让用户可以选择要被上传的文件 --> 请选择要上传的文件:<input type="file" name="upload"> <input type="submit" value="确认上传"> </form>
-1.2、后台部分代码实现
准备工作:需要的一些jar包 需要使用fileupload组件完成文件上传,这时还需要下载commons-io 的jar包。下载:http://commons.apache.org/proper/commons-fileupload/ commons-fileupload-1.3.1.jar、commons-io-2.4.jar、commons-beanutils-1.8.3.jar、commons-logging-1.1.1.jar、commons-dbutils-1.6.jar代码部分:
public class UploadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用Fileupload工具,解析文件上传数据 //创建生产表单项的工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //创建解析request的对象 ServletFileUpload fileUpload = new ServletFileUpload(factory); //解决上传文件名乱码 upload.setHeaderEncoding("utf-8"); try { //解析请求对象,将数据解析成一个一个的FileItem List<FileItem> list = fileUpload.parseRequest(request); //需要将保存在FileItem中的数据,获取出来 for (FileItem item : list) { //判断,当前的input数据是text,还是file if(item.isFormField()){ //是text,需要展示数据 //获取name属性值 String fieldName = item.getFieldName(); //获取value属性值 String string = item.getString(); System.out.println("fieldName:"+fieldName); System.out.println("string:"+string); }else{ //表示当前是文件上传的数据,将数据保存到服务器硬盘 //先选择一个文件要保存的路径,后期所有的上传的数据,保存到upload文件夹中 //如何获取到upload文件加的路径? //C:/apache-tomcat-7.0.75/webapps/day24/upload String realPath = this.getServletContext().getRealPath("/upload"); //获取当前被上传文件的文件名 String fileName = item.getName(); //将数据输出到指定位置 item.write(new File(realPath,fileName)); } } } catch (Exception e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
2、commons-fileupload 详解(对核心类的API介绍)
- 2.1DiskFileItemFactory类(磁盘的文件项工厂类)
2.1.1设置缓存大小
缓存越大,效率越高。Byte[] buf = new byte[8192]缓存:内存中开辟的一个存储数据的空间内存读取效率高于硬盘,设置缓存,提高读取效率,缓存越大,效率越高。factory.setSizeThreshold(1024*1024*10);
2.1.2设置临时文件存储位置
被上传文件的大小,一定会出现超出缓存大小的情况,这些超出的数据,也需要找一个地方存储(临时)起来factory.setRepository(new File("G:/temp"));
//如何获取当前操作系统的临时文件存储位置://获取当前系统的默认临时文件存储位置 String property = System.getProperty("java.io.tmpdir");
2.2、ServletFileUpload类
- 2.2.1parseRequest方法,解析request对象,获取文件上传的数据的方法
- 2.2.2isMultipartContent方法,判断当前请求,是否,是一个文件上传的请求
- 2.2.3setHeaderEncoding方法,解决中文文件名乱码问题
2.3、FileItem类
- 2.3.1isFormField方法,判断当前input输入框是否是一个普通字段,true,是,false,不是
- 2.3.2getFieldName方法,获取input输入框中name属性值
- 2.3.3getString方法,获取input输入框中,用户输入的值(value值)的方法,getString(“utf-8”)这个方法是用来,处理中文乱码(用户输入的值(value值))
- 2.3.4getName方法,获取被上传文件的文件名
- 2.3.5getInputStream方法(不推荐使用),如果使用这个方法,先获取输入流,在获取输出流,继续写IO代码,代码太过繁琐,推荐使用原有的方法
item.write(new File(realPath,fileName));
//获取输入流// InputStream in = item.getInputStream();// //获取输出流// FileOutputStream out = new FileOutputStream(new File(realPath,fileName));// //设置缓存区// byte[] buf = new byte[1024];// int len = 0;// while( (len = in.read(buf)) != -1 ){// out.write(buf,0,len);// }
2.3.5 delete方法,删除临时文件的方法,临时文件会自动删除(item.write()),但是,如果发生异常,临时文件有可能没有删出,调用删除方法
- 2.3浏览器端js实现
<script type="text/javascript"> //用户自己添加input,用户点击一下,创建一个input function _addInput(){ //创建一个input输入框 var _input = document.createElement("input"); //设置文件上传相关属性 _input.setAttribute("type", "file"); _input.setAttribute("name", "upload"); //将input标签存入div中(id="_un") var _div = document.getElementById("_un"); _div.appendChild(_input); //再提供一个删除的按钮:点击一个删除按钮,删除一个input输入框 var _delete = document.createElement("input"); //设置删除按钮的相关属性 _delete.setAttribute("type", "button"); _delete.setAttribute("value", "删除"); //设置删除按钮的onclick事件,事件(启动一个js函数,执行删除操作) _delete.onclick = function(){ //执行删除的操作 //删除的内容有:文件上传输入框,删除按钮本身,换行符 //删除操作由父标签执行 //this:代表了当前这个标签对象_delete var _f = this.parentNode; //删除 文件上传输入框,先获取当前元素的前一个元素 var _p = this.previousSibling; _f.removeChild(_p); //删除 换行符,先获取当前元素的后一个元素 var _n = this.nextSibling; _f.removeChild(_n); //自杀 _f.removeChild(this); }; _div.appendChild(_delete); //在每一个input输入框之后,加上一个换行符 var _br = document.createElement("br"); _div.appendChild(_br); } </script> <body> <!-- 设置一个按钮,用来启动js函数,创建文件上传的input输入框 --> <input type="button" value="添加文件上传" onclick="_addInput();"><br/> <form action="${root }/upload3" method="post" enctype="multipart/form-data"> 文件描述:<input type="text" name="desc"><br/> <!-- 演示在页面中显示选择文件上传的按钮 --> 请选择要被上传的文件:<input type="file" name="upload"><br/> <!-- 当前这个div的位置,就是input标签要存放的位置,那么input标签,只要存放在div中,就是放对了位置 --> <div id="_un"> </div> <!-- 不要忘了添加表单的提交按钮 --> <input type="submit" value="文件上传"> </form> </body>
阅读全文
0 0
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 应届狗的自我修养--unix文件系统学习篇
- 2.使用synchronized关键字实现多线程的同步和互斥(不同线程同时读写同一数据)
- API学习java.lang.Object.getClass
- 【CSS 基础】08 背景
- POJ-1284-Primitive Roots
- 欢迎使用CSDN-markdown编辑器
- Python3.6(3.0以上)安装scrapy
- OpenStack octavia 详解
- jdk1.8 J.U.C并发源码阅读------AQS之独占锁的获取与释放
- API学习java.lang.Object.equals
- 百练1481:Maximum sum
- web.xml中servlet ,filter ,listener ,interceptor的作用与区别
- mysql多表操作2 多表查询
- [笔记]随手写写画画(1)