由uploadfive看servlet
一、uploadfive的使用
上传工具是程序设计中最常用的功能,其中,uploadfive插件使用比较多,此处该插件进行文件的上传操作。该插件是基于HTML5的,因此PC端和移动端都可以使用。
使用:
1、下载uploadfive插件,解压缩到项目中;
2、在程序中调用;
HTML代码
<div> <input id="file_upload" type="file" name="file_upload" /> </div>
JS代码
$('#file_upload').uploadifive({ 'uploadScript' : '/PersonalSystem/upload' , //处理文件上传的服务器端脚本,可根据自己的项目环境修改 //'auto':false, //是否自动上传,默认true //'fileObjName' : 'upload', //服务器端获取的文件对象的名称 'buttonText' : '上传照片', //上传按钮文字 // 'queueID' : 'tip-queue1', //进度条的显示位置 // 'fileType' : 'image/*', //上传文件类型 //'multi' : false, //是否多文件上传 // 'fileSizeLimit' : 5242880, //限制上传文件的大小 //'uploadLimit' : 1, //一次可以上传的最大文件数 //'queueSizeLimit' : 1, //允许队列中存在的最大文件数 // 'removeCompleted':false, //隐藏完成上传的文件,默认为false 'height':50, 'width':80, //上传按钮的宽度与高度只能通过这两个属性进行修改 'onUploadComplete' : function(file, data) { debugger//onUploadComplete:文件上传完成时触发; 回调参数 file:上传完的文件对象;data:服务器端(uplodify.php)返回的信息 alert('图片' + file.name + '成功上传'); } })
其中,uploadScript属性是服务器端脚本,插件自带uploadfive.php脚本,在此基础上,创建servlet代替原有的PHP文件。 'uploadScript' : '/PersonalSystem/upload',是servlet的访问路径,在web.xml进行配置。
二、为什么使用servlet
首先要知道servlet是用Java编写的服务器端小程序,在程序中是 Java 编程语言中的一个类,在整个架构中是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它被用来扩展服务器的性能。其工作原理如图:
三、servlet的使用
创建servlet
1、创建一个servlet的Java类(也可以直接创建servlet),创建Java类后,根据需要添加doGet()和doPost()等函数;
2、配置web.xml
web.xml中的配置代码
<servlet> <description>专门用来处理上传操作的servlet</description> <servlet-name>UploadServlet</servlet-name> <servlet-class>pers.mengb.persys.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping>
其中servlet-name是servlet名,servlet-class是报名加servlet名,url-pattern为映射路径,可以随意起名字,设置成功后可以直接在系统URL后面加上该映射路径,即可访问该servlet。
文件上传servlet
将两个zip解压缩去除jar包放在lib文件夹下
然后在servlet编写上传代码即可,注意文件上传的提交方式必须是post方式
package pers.mengb.persys.servlet; import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * @author Administrator * 文件上传 * 具体步骤: * 1)获得磁盘文件条目工厂 DiskFileItemFactory (要导包) * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同 * 3)对 DiskFileItemFactory 对象设置一些 属性 * 4)高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory); * 目的是调用 parseRequest(request)方法 获得 FileItem 集合list , * * 5)在 FileItem 对象中 获取信息, 遍历, 判断 表单提交过来的信息 是否是 普通文本信息 另做处理 * 6) * 第一种. 用第三方 提供的 item.write( new File(path,filename) ); 直接写到磁盘上 * 第二种. 手动处理 * */ request.setCharacterEncoding("utf-8"); //设置编码 DiskFileItemFactory factory = new DiskFileItemFactory(); //获得磁盘文件条目工厂 String path = this.getServletContext().getRealPath("uploadDir"); //获取文件需要上传到的路径 //String path = request.getRealPath("/upload"); //该方法不推荐使用啦 //如果没以下两行设置的话,上传大的 文件 会占用 很多内存, //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 /* * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 * 然后再将其真正写到 对应目录的硬盘上 */ factory.setRepository(new File(path)); factory.setSizeThreshold(1024*1024) ; //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 ServletFileUpload upload = new ServletFileUpload(factory); //高水平的API文件上传处理 try { List<FileItem> list = upload.parseRequest(request); for(FileItem item : list) { String name = item.getFieldName(); //获取表单的属性名字 //如果获取的 表单信息是普通的 文本 信息 if(item.isFormField()) { //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的 String value = item.getString() ; request.setAttribute(name, value); } //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些 else { /* * 以下三步,主要获取 上传文件的名字 */ String value = item.getName() ; //获取路径名 int start = value.lastIndexOf("\\"); //索引到最后一个反斜杠 String filename = value.substring(start+1);//截取 上传文件的 字符串名字,加1是 去掉反斜杠, request.setAttribute(name, filename); //真正写到磁盘上 //它抛出的异常 用exception 捕捉 //item.write( new File(path,filename) );//第三方提供的 //手动写的 OutputStream out = new FileOutputStream(new File(path,filename)); InputStream in = item.getInputStream() ; int length = 0 ; byte [] buf = new byte[1024] ; System.out.println("获取上传文件的总共大小为:"+item.getSize()+"字节"); // in.read(buf) 每次读到的数据存放在 buf 数组中 while( (length = in.read(buf) ) != -1) { //在 buf 数组中 取出数据 写到 (输出流)磁盘上 out.write(buf, 0, length); } in.close(); out.close(); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block //e.printStackTrace(); } //request.getRequestDispatcher("filedemo.jsp").forward(request, response); } }
四、servlet扩展知识点
Servlet是线程安全吗?
uploadfive 使用强烈建议查看官网文档