JQuery专栏之十五————利用文件框控件file实现文件的上传

15. 利用文件框控件file实现文件的上传。

文件上传的方法有很多,jQuery也有许多文件上传控件。本例采用最基本的HTML文件框(<input type='file')实现文件上传,不限制上传文件的类型和大小。具体地,在表单myForm1中添加一个学生组合框,每个学生可以上传一个照片的图形文件到服务器端,图形文件以学号命名。点击“上传”按钮后,客户端调用服务器端程序Easyui_fileUpload.jsp文件。当文件上传成功后,通过调用 myresizeImage()函数将图形等比例缩放后在表单规定位置中显示出来。客户端程序实现的主要方法如下:

①使用jsp语句获取工程文件路径,在javascript中获取此值,以便设置照片上传后在服务器端存放的路径。

<%

         String path = request.getContextPath();

         String basePath = request.getScheme()+"://"+request.getServerName()+":"+

request.getServerPort()+path+"/";

%>

<script>

         var photopath='<%=basePath %>'+'mybase/students/';

</script>

②定义表单、学号组合框及图片等控件。

③在表单myForm1中添加一个文件选择框控件file1(input type="file"),同时添加一个“上传”按钮。绑定file1控件的change事件,只有当选择的文件为非空时,“上传”按钮才处理激活状态。编写“上传”按钮的点击事件,点击调用fnUpload()函数开始上传文件。

$("#myForm1").append('<input type="file" id="file1" style="position: absolute; top:260px; left:16px;

 width: 200px; padding-left: 4px;" />');

          myButton('btnupload','myForm1','上传',260,440,25,65,'uploadIcon','');

          $('#file1').bind('change',function(v){

                   var filename = $("#file1").val();

                   if (filename=='')  $("#btnupload").linkbutton('disable');

                   else $("#btnupload").linkbutton('enable');

          });

          $('#btnupload').bind('click',function(e){  //绑定“上传”按钮的点击事件

                   fnUpload();

          });

④编写fnUpload()程序。先获取文件扩展名并作判断,然后使用FormData()方法和XMLHttpRequest对象,调用后台服务器端程序system//Easyui_fileUpLoad.jsp,将目标文件名和照片文件存放路径两个参数传递给该程序。服务器端上传文件成功后,返回文件的有关信息(如文件大小、文件扩展名等),并将文件选择控件置空、“上传”按钮为未激活状态,结束文件上传过程。由于游览器缓存图片,新上传的图片不能马上在客户端显示出来,需要在图片地址src中添加一个时间戳(timestemp)。

var fileext=filename.substring(filename.lastIndexOf(".")+1,255).toLowerCase();//文件扩展名

          var fileObj = $("#file1")[0].files[0]; // 获取文件对象

          var form = new FormData();  // FormData 对象

          form.append("file", fileObj);// 文件对象

          var xhr = new XMLHttpRequest(); //XMLHttpRequest 对象

          xhr.open("post", "system//Easyui_fileUpLoad.jsp?targetname="+targetname+"&targetpath=mybase/students", true);

          xhr.onload = function () {

                   if(xhr.status == 200){   

                            var data = JSON.parse(xhr.responseText);  

                            if (data.error == 0) {        //上传成功

                                      var src=photopath+$("#stuid").combobox("getValue")+'.jpg?timestemp='+

new Date().getTime();

                                      $("#image1").attr('src',src);

resizeImage('image1',src,231,224);

$.messager.show({

        title:'系统提示',

                   width:200,

                   msg:'文件已经上传成功!',

                   timeout:2000,

                   showType:'slide'

          });

console.log('文件上传成功!'+src+',文件大小:'+data.filesize);

                            }else{

                                      $.messager.alert('系统提示','文件已上传失败!','error');

                                      console.log(data.message);                                 

                            }

                            $("#file1").val(' ');

}

};

xhr.send(form);

程序2-15. 文件上传服务器端程序Easyui_fileUpLoad.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ page import="java.io.*"%>

<%@ page import="net.sf.JSON.JSONObject"%>

<%@ page import="org.apache.commons.fileupload.FileItem"%>

<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>

<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>

<%

           String path = request.getContextPath();

           String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

           request.setCharacterEncoding("UTF-8");

           response.setCharacterEncoding("UTF-8");

           String targetpath = request.getParameter("targetpath");  //目标路径

           String targetname = request.getParameter("targetname");  //目标文件名称

           System.out.println("target="+targetpath);

           String savePath = this.getServletContext().getRealPath(targetpath);

           File file = new File(savePath);

           //判断上传文件的保存目录是否存在

           if (!file.exists() && !file.isDirectory()) {

                    System.out.println(savePath+"目录不存在,需要创建");

                    file.mkdir(); //创建目录

           }

           String message = ""; //消息提示

           int error = 0;

           String targetfilename="";

           String fileext="";

           long xsize=0;

           try{

                    //使用Apache文件上传组件处理文件上传步骤:

                    //1、创建一个DiskFileItemFactory工厂

                    DiskFileItemFactory factory = new DiskFileItemFactory();

                    //2、创建一个文件上传解析器

                    ServletFileUpload upload = new ServletFileUpload(factory);

                    //解决上传文件名的中文乱码

                    upload.setHeaderEncoding("UTF-8");

                    //3、判断提交上来的数据是否是上传表单的数据

                    if(!ServletFileUpload.isMultipartContent(request)){

                             //按照传统方式获取数据

                             return;

                    }

                    //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,

//每一个FileItem对应一个Form表单的输入项

                    List<FileItem> list = upload.parseRequest(request);  //compiler5.0级以上支持

                    for(FileItem item : list){

                             //如果fileitem中封装的是普通输入项的数据

                             if(item.isFormField()){

                                       String name = item.getFieldName();

                                       //解决普通输入项的数据的中文乱码问题

                                       String value = item.getString("UTF-8");

                                       //value = new String(value.getBytes("iso8859-1"),"UTF-8");

                                       System.out.println(name + "=" + value);

                             }else{//如果fileitem中封装的是上传文件

                                       //得到上传的文件名称和扩展名

                                       String filename = item.getName();

                                       fileext=filename.substring(filename.lastIndexOf(".")+1,filename.length()).toLowerCase();

                                       targetfilename=filename;

                                       if (!targetname.trim().equals("")) targetfilename=targetname+"."+fileext;  //目标文件名

                                       if(filename==null || filename.trim().equals("")){

                                                continue;

                                       }

//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt

                                       //处理获取到的上传文件的文件名的路径部分,只保留文件名部分

                                       filename = filename.substring(filename.lastIndexOf("\\")+1);

                                       //获取item中的上传文件的输入流

                                       InputStream in = item.getInputStream();

                                       //创建一个文件输出流

                                       //FileOutputStream out1 = new FileOutputStream(savePath + "\\" + filename);

                                       FileOutputStream out1 = new FileOutputStream(savePath + "\\" + targetfilename);

                                       //创建一个缓冲区

                                       byte buffer[] = new byte[1024];

                                       //判断输入流中的数据是否已经读完的标识

                                       int len = 0;

                                       //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据

                                       while((len=in.read(buffer))>0){

                     //使用FileOutputStream输出流

//将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中

                                                out1.write(buffer, 0, len);

                                       }

                                       in.close();  //关闭输入流

                                       out1.close();  //关闭输出流

                                       item.delete(); //删除处理文件上传时生成的临时文件

                                       message = "文件上传成功!";

                                       File xfile = new File(savePath + "\\" + targetfilename);

                                       xsize=xfile.length();

                             }

                    }

           }catch (Exception e) {

                    message= "文件上传失败!";

                    error = 1;

                    e.printStackTrace();

           }

           //确定返回内容JSON格式

           Map map = new HashMap();

           map.put("error", error);

           map.put("message", message);

           map.put("targetfilename", targetfilename);

           map.put("fileext", fileext);

           if (xsize<=1024) map.put("filesize", xsize+"B");

           else if (xsize<=1024*1000) map.put("filesize", xsize/1024.00+"KB");

           else map.put("filesize", xsize/1024/1024.00+"MB");

           JSONObject JSON = JSONObject.fromObject(map);

           response.setContentType("text/html; charset=utf-8");

           PrintWriter pw = response.getWriter(); 

           System.out.print(JSON.toString());

           pw.write(JSON.toString());

%>

猜你喜欢

转载自blog.csdn.net/qq_42618969/article/details/89202882