• JSP多文件上传到服务器


    问题描述:

      作为一个Java开发Web方向的程序员,很重要的一个功能,就是上传文件功能是一定要掌握的,今天整理了一下代码。

    1.JSP显示界面代码和动态添加上传文件个数。

     1 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
     2 
     3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
     4 <html>
     5   <head>
     6     <title>My JSP 'file_upload_test.jsp' starting page</title>
     7 
     8     <meta http-equiv="pragma" content="no-cache">
     9     <meta http-equiv="cache-control" content="no-cache">
    10     <meta http-equiv="expires" content="0">    
    11     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    12     <meta http-equiv="description" content="This is my page">
    13     <!--
    14     <link rel="stylesheet" type="text/css" href="styles.css">
    15     -->
    16     <script type="text/javascript">
    17     function addline(){
    18         newline = document.all.test.insertRow();
    19         newline.insertCell().innerHTML="<input type='file' name=file_info size='60'>&nbsp;"+"<button onclick='javascript:removeline(this)'>移除</button>";  
    20     }
    21     
    22     function removeline(obj){
    23         var objSourceRow=obj.parentNode.parentNode;
    24         var objTable=obj.parentNode.parentNode.parentNode.parentNode; 
    25         objTable.lastChild.removeChild(objSourceRow);
    26     }
    27     </script>
    28 
    29   </head>
    30   
    31   <body>
    32     <form name="theform" method="post" action="fileUploadTest" enctype="multipart/form-data">
    33         <h4>附件上传:</h4>
    34         <table id=test border="0">
    35             <tr>
    36                 <td>
    37                     <input type="file" name="file_info" size="60">&nbsp;
    38                 </td>
    39             </tr>
    40         </table>
    41         <button onclick="addline();">单击此处添加更多附件</button><hr>
    42         <input type="submit" />
    43     </form>
    44   </body>
    45 </html>

    2.Java处理请求代码

     1 package com.test;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.io.PrintWriter;
     6 import java.util.ArrayList;
     7 import java.util.Iterator;
     8 import java.util.List;
     9 
    10 import javax.servlet.ServletException;
    11 import javax.servlet.http.HttpServlet;
    12 import javax.servlet.http.HttpServletRequest;
    13 import javax.servlet.http.HttpServletResponse;
    14 
    15 import org.apache.commons.fileupload.FileItem;
    16 import org.apache.commons.fileupload.FileUpload;
    17 import org.apache.commons.fileupload.FileUploadException;
    18 import org.apache.commons.fileupload.RequestContext;
    19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
    21 import org.apache.commons.fileupload.servlet.ServletRequestContext;
    22 
    23 public class FileUploadTest extends HttpServlet {
    24     
    25     public FileUploadTest(){
    26         super();
    27     }
    28 
    29     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    30         request.setCharacterEncoding("gbk");
    31         RequestContext requestContext = new ServletRequestContext(request);
    32         boolean isMultipart = FileUpload.isMultipartContent(requestContext);
    33         //或者boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    34         //PrintWriter pw = response.getWriter();
    35         if(isMultipart){
    36             DiskFileItemFactory factory = new DiskFileItemFactory();
    37             factory.setRepository(new File("C:/tmp/"));
    38             ServletFileUpload upload = new ServletFileUpload(factory);
    39             upload.setSizeMax(2000000);
    40             List items = new ArrayList();
    41             try {
    42                 items = upload.parseRequest(request);
    43             } catch (FileUploadException e1) {
    44                 System.out.println("文件上传发生错误" + e1.getMessage());
    45                 //pw.write("<script>alert('文件上传发生错误" + e1.getMessage() + "');location.href = location.href;</script>");
    46             }
    47             Iterator it = items.iterator();
    48             while(it.hasNext()){
    49                 FileItem fileItem = (FileItem) it.next();
    50                 if(fileItem.isFormField()){
    51                      System.out.println("此次是普通文本表单字段,非文件表单字段。");
    52                 }else{
    53                     if(fileItem.getName() != null && fileItem.getSize() != 0){
    54                         File fullFile = new File(fileItem.getName());
    55                         File newFile = new File("c:/temp/" + fullFile.getName());
    56                         try {
    57                             fileItem.write(newFile);
    58                         } catch (Exception e) {
    59                             // TODO Auto-generated catch block
    60                             e.printStackTrace();
    61                         }
    62                     }else{
    63                         System.out.println("文件没有选择 或 文件内容为空");
    64                     }
    65                 }
    66             }
    67         }
    68     }
    69     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    70         doPost(request, response);
    71     }
    72 }

    3.Web.xml配置文件代码

    1   <servlet>
    2     <servlet-name>FileUploadTest</servlet-name>
    3     <servlet-class>com.test.FileUploadTest</servlet-class>
    4   </servlet>
    5   <servlet-mapping>
    6     <servlet-name>FileUploadTest</servlet-name>
    7     <url-pattern>/fileUploadTest</url-pattern>
    8   </servlet-mapping>

    4.FileItem类几个方法说明

      1)boolean  isFormField();该方法判断是否是普通表单域还是文件上传表单域。如果是普通文本表单字段,返回一个true否则返回一个false。

      2)String getName();用来获得文件上传字段中的文件名。

      3)String getFieldName();用来返回表单标签的name属性的值。

      4)void write(File file);write方法将FileItem对象中的内容保存到某个指定的文件中。如果FileItem对象中的内容是保存在某个临时文件中,该方法完成后,临时文件可以会被删除。该方法也可以将普通表单字段保存在一个文件中,但最主要的用途是把上传的文件内容保存在本地文件系统中。

      5)String getString();将FileItem对象中保存的数据流内容以一个字符串返回。它有两个重载形式。public Java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码。如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。

      6)String getContentType();此方法用来获得上传文件的类型,即标段字段元素描述头属性“content-type”的值,如image/jpeg。如果FileItem对象对应的是普通的表单字段,将返回null。

      7)boolean isInMemory();判断FileItem对象封装的数据是保存在内存中还是硬盘中。用来判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false

      8)void  delete();此方法用来清空FileItem对象中封装的主体内容,如果内容是被保存在临时文件中,该方法会把临时文件删除。尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,释放系统存储资源。另外,当系统出现异常时,仍有可能造成有的临时文件被永久保存在了硬盘中。

      9)InputStream  getInputStream();以流的形式返回上传文件的主体内容。

      10)long  getSize();返回上传文件的大小(以字节为单位)。

    5.所需要的jar包,commons-fileupload-1.2.2.jar即可,其需要依赖的其他jar包commons-io-1.3.jar

      1)Commons FileUpload,可以在"http://jakarta.apache.org/commons/fileupload/"下载

      2)Commons IO,可以在"http://jakarta.apache.org/commons/io/"下载

  • 相关阅读:
    文章标题
    PAT Basic Level 1006
    PAT Basic Level 1005
    PAT Basic Level 1004
    PAT Basic Level 1036
    PAT Basic Level 1002
    (算法)递归各习题总结反思 *基础
    uvaoj 101
    C语言(关于二级指针)
    普通算法(高效幂运算)
  • 原文地址:https://www.cnblogs.com/atp-sir/p/6169074.html
Copyright © 2020-2023  润新知