分享

文件上传和下载的commons-fileupload-1.2的使用 - Aflyer 天与...

 不会游泳的鱼 2007-06-15

网上看了很多样例,但是有很多都是过时的,里面使用的包中的FileUpload类在新的1.2里面已经改变,所以我们不能照搬原来的方法 ,除非你放弃使用新版本的jar包。

2.1  jsp方式上传

upload.jsp

<%@ page language="java" %>

<%@ page contentType = "text/html;charset=gb2312"%>

<html>

<head>

<title>文件上传演示</title>

</head>

<body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="40" marginwidth="0" marginheight="0">

<center>

<h1>文件上传演示</h1>

<form name="uploadform" method="POST" action="save.jsp" ENCTYPE="multipart/form-data">

<table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF">

<tr><td width="100%" colspan="2">

文件1<input name="file1" size="40" type="file">

</td></tr>

<tr><td width="100%" colspan="2">

文件2<input name="file2" size="40" type="file">

</td></tr>

<tr><td width="100%" colspan="2">

文件3<input name="file3" size="40" type="file">

</td></tr>

</table>

<br/><br/>

<table>

<tr><td align="center"><input type="submit" name="submit" value="开始上传"/></td></tr>

</table>

</form>

</center>

</body>

</html>

 

该文件唯一要注意的地方就是红色粗体的地方,其他的没有什么区别。而正是在这个奇怪的参数上,我们利用servlet处理表单的时候就带来了一个特殊的处理方式(见后分析);

 

save.jsp

 

<%@ page language="java" contentType="text/html;charset=GBK"%>

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

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

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

<html>

<head>

<title>保存上传文件</title>

</head>

<body bgcolor=‘#FFFFFF‘ text=‘#000000‘ leftmargin=‘0‘ topmargin=‘40‘ marginwidth=‘0‘ marginheight=‘0‘>

<font size=‘6‘ color=‘blue‘>文件列表:</font>

<center>

<table cellpadding=0 cellspacing=1 border=1 width=‘100%‘>

<tr>

<td bgcolor=#008080>文件名</td>

<td bgcolor=#008080>大小</td>

</tr>

<%

    String msg = "";

    DiskFileUpload fu = new DiskFileUpload();

// 设置允许用户上传文件大小,单位:字节

// fu.setSizeMax(10000000);

// 设置最多只允许在内存中存储的数据,单位:字节

// fu.setSizeThreshold(4096);

// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录

    //(临时存放目录,文件上传完毕后有办法清除它吗?)

    fu.setRepositoryPath("D:\\TEMP");

    //开始读取上传信息

    List fileItems = fu.parseRequest(request);

    // 依次处理每个上传的文件

    Iterator iter = fileItems.iterator();

    while (iter.hasNext())

    {

      FileItem item = (FileItem) iter.next();

      //忽略其他不是文件域的所有表单信息

      if (!item.isFormField())

      {

        String name = item.getName();//获取上传的文件名

        long size = item.getSize();//获取上传的文件大小(字节为单位)

        if((name==null||name.equals("")) && size==0)

        continue;//跳到while检查条件

        out.println("<tr>");

        out.println("<td>" + name + "</td>");

        out.println("<td>" + size + "</td>");

        //以下为文件名处理,将上传的文件保存在项目所在目录下。

        //获取文件名字符串的长度

        int end = name.length();

        //返回在此字符串中最右边出现的指定子字符串的索引。

        int begin = name.lastIndexOf("\\");

        File savedFile = new File("c:\\TEMP", name.substring(begin+1,end));

        item.write(savedFile);

      }

    }

%>

</table>

<br><br>

<a href="upload.jsp">返回上传页面</a>

</center>

</body>

</html>

 

以上两个文件均是来自网上,我已经做了局部修改。

 

2. SERVLET的处理

前面提到了那个特殊的form 参数ENCTYPE="multipart/form-data",我在做servlet的时候用通常的request.getParameter("id"),无法捕捉到该form 表单的值。我们要特殊处理这个表单。

以下截取的部分servlet内容:

假设 我的form里面有 idseridadjunctname 3name,而adjunctnametypefile的,其他的是text的。

              String id = ChineseString.chineseStr(request.getParameter("id"));

              String serid = ChineseString.chineseStr(request.getParameter("serid"));

              String adjunctname = ChineseString.chineseStr(request

                            .getParameter("adjunctname"));

                           

              String oldFile = ChineseString.chineseStr(request

                            .getParameter("oldFile"));

              String downLoadFile = ChineseString.chineseStr(request

                            .getParameter("downLoadFile"));

              if (ServletFileUpload.isMultipartContent(request)) {

                     // Create a factory for disk-based file items

                     DiskFileItemFactory factory = new DiskFileItemFactory();

                     // Set factory constraints

                     factory.setSizeThreshold(20 * 1024);

                     factory.setRepository(factory.getRepository());

                     // Create a new file upload handler

                     ServletFileUpload upload = new ServletFileUpload(factory);

                     // Set overall request size constraint

                     upload.setFileSizeMax(20 * 1024 * 1024);

                     List formlists = null;

                     try {

                            formlists = upload.parseRequest(request);

                     } catch (FileUploadException e1) {

                            // TODO Auto-generated catch block

                            e1.printStackTrace();

                     }

                     Iterator iter = formlists.iterator();

                     while (iter.hasNext()) {

                            FileItem formitem = (FileItem) iter.next();

                            if (!formitem.isFormField()) {

                                   String name = ChineseString.chineseStr(formitem.getName());

                                   adjunctsize = new Long(formitem.getSize()).toString();

                                   if ((name == null || name.equals(""))

                                                 && adjunctsize.equals("0"))

                                          continue;

                                   // 获取纯粹的文件名

                                   adjunctname = name.substring(name.lastIndexOf("\\") + 1);

                                   String suffixName = "."

                                                 + adjunctname.substring(adjunctname

                                                               .lastIndexOf(".") + 1);

                                   newadjunctname = new Long(GetTime.getSystemCalendar())

                                                 .toString()

                                                 + suffixName;

                                   // 创建文件

                                   File savefile = new File(IConstant.ADJUNTFILEPATH

                                                 + newadjunctname);

                                   // File savefile=new File("c:\\TEMP" + newadjunctname);

                                   // 写入文件

                                   try {

                                          formitem.write(savefile);

                                   } catch (Exception e) {

                                          // TODO Auto-generated catch block

                                          e.printStackTrace();

                                   }

                            }else{

                                   String formname=formitem.getFieldName();//获取form中的名字

                                   String formcontent=formitem.getString();

                                   formname=new String(formname.getBytes(),"gb2312");

                                   formcontent=new String(formcontent.getBytes(),"gb2312");

                                   if (formname.equals("id")){

                                          id = formcontent;

                                   }else if(formname.equals("serid")){

                                          serid = formcontent;

                                   }

                            }

                     }

              }

当我提交页面时得到的id serid 均是空的,于是做了这样的一个处理

if (!formitem.isFormField())

判断是否是文件域,如果不是转向文本域处理

String formname=formitem.getFieldName();//获取form中的名字

                                   String formcontent=formitem.getString();

                                   formname=new String(formname.getBytes(),"gb2312");

                                   formcontent=new String(formcontent.getBytes(),"gb2312");

                                   if (formname.equals("id")){

                                          id = formcontent;

                                   }else if(formname.equals("serid")){

                                          serid = formcontent;

                                   }

这样才能得到正确的form idserid的值

 3. 文件名称或路径乱码的处理

servelet的处理代码里面,我们看见了一些字符编码的转换,如:

aString downLoadFile = ChineseString.chineseStr(request

                            .getParameter("downLoadFile"));

       bformname=new String(formname.getBytes(),"gb2312");

ChineseString.chineseStr 是自己做的一个公共的转换函数,内容如下:

       public static String chineseStr(String str) {

              try {

                     if (str == null)

                            return "";

                     String tempStr = str;

                     byte[] tempArray = tempStr.getBytes("ISO8859-1");

                     String temp = new String(tempArray);

                     return temp;

              } catch (Exception ex) {

                     System.out

                                   .println("Exception : com.sclh.common.ChineseString/chineseStr() "

                                                 + ex.getMessage());

              }

              return "";

       }

4. 下载页面

有了上传页面,我们在添加一个下载的页面:

<%@ page contentType="text/html;charset=gb2312" language="java" %>

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

<%@ page import="com.sclh.rsp.servicecenter.commom.*"%>

<%@ include file="../common.jsp"%>

<%

String downLoadFile = IConstant.ADJUNTFILEPATH+ChineseString.nullToStr(request.getParameter("downLoadFile"));

String oldFile = request.getParameter("oldFile");

//oldFile=oldFile.replaceAll(";", "");

if((oldFile.length())>50){

 oldFile=oldFile.substring(0,20);

}

if (!"".equals(downLoadFile)) {

       String fullFileName = downLoadFile;

       File file = new File(fullFileName);

       if (file.exists()) {

          try {

              FileInputStream fileContext = new FileInputStream(fullFileName);

              BufferedInputStream inStream = new BufferedInputStream(fileContext);

                 response.reset();

              response.setContentType("application/x-msdownload");

                 oldFile = java.net.URLEncoder.encode(oldFile, "utf-8");

                 response.setHeader("Content-Disposition", "attachment; filename="+ oldFile);

//               response.setHeader("content-encoding","gzip");

//         response.setHeader("content-encoding","compress");

              OutputStream sOut = response.getOutputStream();

              byte[] b = new byte[4096];

              int len = 0;

              while ( (len = inStream.read(b)) != -1) {

                    sOut.write(b, 0, len);

                    }

           sOut.close();

                 }

          catch (IOException ex) {

           //System.out.println("Exception : downLoad.jsp " + ex.getMessage());

                 }

       }

       else {

         response.sendRedirect("error.jsp?closeFlag=1&message=" + ChineseString.URLEncode("下载的文件不存在!"));

       }

}

else {

    response.sendRedirect("error.jsp?closeFlag=1&message=" + ChineseString.URLEncode("下载文件时参数错误!"));

}%>

这个文件中的oldFile downLoadFile 就是为了解决下载乱码和下载文件名称而做的参数。如果缺少oldFile的处理 文件将会显示的下载名称为DownLoad.jsp

IConstant.ADJUNTFILEPATH 变量定义的是附件存放的地方,在使用中定义

 以下是还涉及到下载页面的部分jsp代码:

        <td class="listcontent" width="17%" height="24" valign="middle" align="center"><a class=listlink  href="javascript:onclick=confirmDel(‘<%=entity[i].getId()%>‘,‘<%=intPage%>‘)">删除</a>|<a class=listlink href="#" onClick="location.href=‘/AdjunctDataServlet?id=<%=entity[i].getId()%>&page=<%=intPage%>&action=update‘">修改</a>|<a class=listlink href="javascript:onclick=downfile(‘<%=entity[i].getAdjunctname()%>‘,‘<%=entity[i].getNewadjunctname()%>‘)">下载</a></td>

function downfile(oldFile,downLoadFile) {

       location.href="/AdjunctDataServlet?action=downLoadFile&oldFile="+oldFile+"&downLoadFile="+downLoadFile;

}

 

 

 

 

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1593398

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约