日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

文件上傳和下載的commons-fileupload-1.2的使用 - Aflyer 天與...

 不會(huì)游泳的魚 2007-06-15

網(wǎng)上看了很多樣例,但是有很多都是過(guò)時(shí)的,里面使用的包中的FileUpload類在新的1.2里面已經(jīng)改變,所以我們不能照搬原來(lái)的方法 ,除非你放棄使用新版本的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>

 

該文件唯一要注意的地方就是紅色粗體的地方,其他的沒有什么區(qū)別。而正是在這個(gè)奇怪的參數(shù)上,我們利用servlet處理表單的時(shí)候就帶來(lái)了一個(gè)特殊的處理方式(見后分析);

 

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();

// 設(shè)置允許用戶上傳文件大小,單位:字節(jié)

// fu.setSizeMax(10000000);

// 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié)

// fu.setSizeThreshold(4096);

// 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤的目錄

    //(臨時(shí)存放目錄,文件上傳完畢后有辦法清除它嗎?)

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

    //開始讀取上傳信息

    List fileItems = fu.parseRequest(request);

    // 依次處理每個(gè)上傳的文件

    Iterator iter = fileItems.iterator();

    while (iter.hasNext())

    {

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

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

      if (!item.isFormField())

      {

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

        long size = item.getSize();//獲取上傳的文件大小(字節(jié)為單位)

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

        continue;//跳到while檢查條件

        out.println("<tr>");

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

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

        //以下為文件名處理,將上傳的文件保存在項(xiàng)目所在目錄下。

        //獲取文件名字符串的長(zhǎng)度

        int end = name.length();

        //返回在此字符串中最右邊出現(xiàn)的指定子字符串的索引。

        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">返回上傳頁(yè)面</a>

</center>

</body>

</html>

 

以上兩個(gè)文件均是來(lái)自網(wǎng)上,我已經(jīng)做了局部修改。

 

2. SERVLET的處理

前面提到了那個(gè)特殊的form 參數(shù)ENCTYPE="multipart/form-data",我在做servlet的時(shí)候用通常的request.getParameter("id"),無(wú)法捕捉到該form 表單的值。我們要特殊處理這個(gè)表單。

以下截取的部分servlet內(nèi)容:

假設(shè) 我的form里面有 id,seridadjunctname 3個(gè)name,而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;

                                   // 創(chuàng)建文件

                                   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;

                                   }

                            }

                     }

              }

當(dāng)我提交頁(yè)面時(shí)得到的id serid 均是空的,于是做了這樣的一個(gè)處理

if (!formitem.isFormField())

判斷是否是文件域,如果不是轉(zhuǎn)向文本域處理

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 id,serid的值

 3. 文件名稱或路徑亂碼的處理

servelet的處理代碼里面,我們看見了一些字符編碼的轉(zhuǎn)換,如:

aString downLoadFile = ChineseString.chineseStr(request

                            .getParameter("downLoadFile"));

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

ChineseString.chineseStr 是自己做的一個(gè)公共的轉(zhuǎn)換函數(shù),內(nèi)容如下:

       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. 下載頁(yè)面

有了上傳頁(yè)面,我們?cè)谔砑右粋€(gè)下載的頁(yè)面:

<%@ 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("下載文件時(shí)參數(shù)錯(cuò)誤!"));

}%>

這個(gè)文件中的oldFile downLoadFile 就是為了解決下載亂碼和下載文件名稱而做的參數(shù)。如果缺少oldFile的處理 文件將會(huì)顯示的下載名稱為DownLoad.jsp。

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

 以下是還涉及到下載頁(yè)面的部分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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約