• 用commonsfileupload1.2 实现文件上传


    1.首先,记得导入tomcat下的jar包

    jsp代码  uploadSS.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
            <title>upload</title>
        </head>
    
        <body>
            <form action="FileUploadServlet" method="post"
                enctype="multipart/form-data">
                <input type="file" size="30" name="test" />
                <br />
                <input name="up" type="submit" value="上传" />
            </form>
        </body>
    </html>

    然后编写此页面跳转的servlet

      1 package com.netcloud.upload;
      2 import java.io.File;
      3 import java.io.IOException;
      4 import java.io.PrintWriter;
      5 import java.util.Iterator;
      6 import java.util.List;
      7 
      8 import javax.servlet.ServletException;
      9 import javax.servlet.http.HttpServlet;
     10 import javax.servlet.http.HttpServletRequest;
     11 import javax.servlet.http.HttpServletResponse;
     12 
     13 import org.apache.commons.fileupload.FileItem;
     14 import org.apache.commons.fileupload.FileUploadException;
     15 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
     16 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     17 import org.apache.commons.fileupload.servlet.ServletFileUpload;
     18 //测试成功
     19 public class FileUploadServlet extends HttpServlet {
     20 
     21  public FileUploadServlet() {
     22   super();
     23  }
     24 
     25  public void destroy() {
     26   super.destroy(); // Just puts "destroy" string in log
     27   // Put your code here
     28  }
     29 
     30  public void doGet(HttpServletRequest request, HttpServletResponse response)
     31    throws ServletException, IOException {
     32   doPost(request, response);
     33  }
     34 
     35  public void doPost(HttpServletRequest request, HttpServletResponse response)
     36    throws ServletException, IOException {
     37   final long MAX_SIZE = 3 * 1024 * 1024;// 设置上传文件最大为 3M
     38   // 允许上传的文件格式的列表
     39   final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt",
     40     "doc", "docx", "mp3", "wma", "m4a" };
     41   response.setContentType("text/html");
     42   // 设置字符编码为UTF-8, 这样支持汉字显示
     43   response.setCharacterEncoding("UTF-8");
     44 
     45   // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
     46   DiskFileItemFactory dfif = new DiskFileItemFactory();
     47   dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
     48   dfif.setRepository(new File(request.getRealPath("/")
     49     + "ImagesUploadTemp"));// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
     50 
     51   // 用以上工厂实例化上传组件
     52   ServletFileUpload sfu = new ServletFileUpload(dfif);
     53   // 设置最大上传尺寸
     54   sfu.setSizeMax(MAX_SIZE);
     55 
     56   PrintWriter out = response.getWriter();
     57   // 从request得到 所有 上传域的列表
     58   List fileList = null;
     59   try {
     60    fileList = sfu.parseRequest(request);
     61   } catch (FileUploadException e) {// 处理文件尺寸过大异常
     62    if (e instanceof SizeLimitExceededException) {
     63     out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");
     64     out.println("<a href=\"uploadSS.jsp\" target=\"_top\">返回</a>");
     65     return;
     66    }
     67    e.printStackTrace();
     68   }
     69   // 没有文件上传
     70   if (fileList == null || fileList.size() == 0) {
     71    out.println("请选择上传文件<p />");
     72    out.println("<a href=\"uploadSS.jsp\" target=\"_top\">返回</a>");
     73    return;
     74   }
     75   // 得到所有上传的文件
     76   Iterator fileItr = fileList.iterator();
     77   // 循环处理所有文件
     78   while (fileItr.hasNext()) {
     79    FileItem fileItem = null;
     80    String path = null;
     81    long size = 0;
     82    // 得到当前文件
     83    fileItem = (FileItem) fileItr.next();
     84    // 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
     85    if (fileItem == null || fileItem.isFormField()) {
     86     continue;
     87    }
     88    // 得到文件的完整路径
     89    path = fileItem.getName();
     90    // 得到文件的大小
     91    size = fileItem.getSize();
     92    if ("".equals(path) || size == 0) {
     93     out.println("请选择上传文件<p />");
     94     out.println("<a href=\"uploadSS.jsp\" target=\"_top\">返回</a>");
     95     return;
     96    }
     97 
     98    // 得到去除路径的文件名
     99    String t_name = path.substring(path.lastIndexOf("\\") + 1);
    100    // 得到文件的扩展名(无扩展名时将得到全名)
    101    String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
    102    // 拒绝接受规定文件格式之外的文件类型
    103    int allowFlag = 0;
    104    int allowedExtCount = allowedExt.length;
    105    for (; allowFlag < allowedExtCount; allowFlag++) {
    106     if (allowedExt[allowFlag].equals(t_ext))
    107      break;
    108    }
    109    if (allowFlag == allowedExtCount) {
    110     out.println("请上传以下类型的文件<p />");
    111     for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++)
    112      out.println("*." + allowedExt[allowFlag]
    113        + "&nbsp;&nbsp;&nbsp;");
    114     out.println("<p /><a href=\"uploadSS.jsp\" target=\"_top\">返回</a>");
    115     return;
    116    }
    117 
    118    long now = System.currentTimeMillis();
    119    // 根据系统时间生成上传后保存的文件名
    120    String prefix = String.valueOf(now);
    121    // 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下
    122    String u_name = request.getRealPath("/") + "ImagesUploaded/"
    123      + prefix + "." + t_ext;
    124    try {
    125     // 保存文件
    126     fileItem.write(new File(u_name));
    127     out.println("文件上传成功. 已保存为: " + prefix + "." + t_ext
    128       + " &nbsp;&nbsp;文件大小: " + size + "字节<p />");
    129     out.println("<a href=\"uploadSS.jsp\" target=\"_top\">继续上传</a>");
    130    } catch (Exception e) {
    131     e.printStackTrace();
    132    }
    133  }
    134 
    135  }
    136 
    137  public void init() throws ServletException {
    138   // Put your code here
    139  }
    140 
    141 }
    

    注意新建servlet生成的web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>TestLearn</display-name>
      <servlet>
        <servlet-name>FileUploadServlet</servlet-name>
        <servlet-class>com.netcloud.upload.FileUploadServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>FileUploadServlet</servlet-name>
        <url-pattern>/FileUploadServlet</url-pattern>
      </servlet-mapping>
    </web-app>

    注意:servlet提到的ImagesUploaded ImagesUploadTemp二个文件夹要放在tomcat的目录下

    如D:\apache-tomcat-7.0.23\wtpwebapps\TestLearn

    2.这是另外一种看起来比较简洁但是实际上跟第一种一样原理的方法:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>→uploadServlet→redult.jsp</title>
    
    </head>
    <body>
    <form action="uploadServlet" method="POST" enctype="multipart/form-data" >
        upload:<input type="file" name="text" size="30"/> 
        <input type="submit" value="view>>>">
        
    </form>
    
    </body>
    </html>

    跳转的servlet

    package com.netcloud.upload;
    
     
    
    import java.io.File;
    
    import java.io.FileOutputStream;
    
    import java.io.IOException;
    
    import java.io.InputStream;
    
    import java.io.OutputStream;
    
    import java.util.List;
    
     
    
    import javax.servlet.ServletException;
    
    import javax.servlet.http.HttpServlet;
    
    import javax.servlet.http.HttpServletRequest;
    
    import javax.servlet.http.HttpServletResponse;
    
     
    
    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;
    
    /**
     * 文件上传如果文件小,上传组件可以将文件存放在内存中,
     * 如果过大时会放在临时目录里面,之后再通过IO流操作
     * @author LEPING LI
     *
     */
    @SuppressWarnings("unchecked")
    public class uploadServlet extends HttpServlet{
             public void doPost(HttpServletRequest request, HttpServletResponse response)
                                throws ServletException, IOException {
                       request.setCharacterEncoding("UTF-8");
                       //磁盘文件条目工厂
                       DiskFileItemFactory factory=new DiskFileItemFactory();
                        // 文件上传如果文件小,上传组件可以将文件存放在内存中,
                        //如果过大时会放在临时目录里面,之后再通过IO流操作
                       //获取目录真实路径   / 代表 WebRoot目录下面
                       String path=request.getRealPath("/");
                       //设置临时目录
                       factory.setRepository(new File(path));
                       //设置上传文件大小
                       factory.setSizeThreshold(1024*1024);
                       //创建一个ServletFileUpload 实例
                       ServletFileUpload sfu=new ServletFileUpload(factory);
                       try {
                                //解析请求,取得FileItem 列表
                                List<FileItem> lis=sfu.parseRequest(request);
                                //循环遍历
                                for(FileItem item:lis){
                                         //判断是否是简单的表单字段
                                         if(item.isFormField()){
                                                   String name=item.getFieldName();
                                                   String value=item.getString("UTF-8");
                                                   request.setAttribute(name, value);
                                         }else{
                                                   //取得字段名
                                                   String name=item.getFieldName();
                                                   //       取得文件路径名
                                                   String value=item.getName();
                                                   System.out.println("value:"+value);
                                                   //为了屏蔽各个浏览器提供的路径不同异常
                                                   int start=value.lastIndexOf("//");
                                                   //取得文件名
                                                   String fileName=value.substring(start+1);
                                                   request.setAttribute(name, fileName);
    
                                                   item.write(new File(path,fileName));   //这句代码与下面高亮显示的代表功能相同
                                             
                                                   //获取文件输出流
                                                   File f=new File(path,fileName);
                                                   OutputStream os=new FileOutputStream(f);
                                                   //获取文件条目的输入流
                                                   InputStream in=item.getInputStream();
                                                   byte[] buffer=new byte[400];
                                                   int length=0;
                                                   //读写文件
                                                   while((length=in.read(buffer))>0){
                                                            os.write(buffer,0,length);
                                                   }
                                                   os.flush();
                                                   os.close();
                                                   in.close();
                                                  
                                         }
                                }
                       } catch (FileUploadException e) {
                                e.printStackTrace();
                       } catch (Exception e) {
                                e.printStackTrace();
                       }
                       request.getRequestDispatcher("result.jsp").forward(request, response);
             }
    }

    servlet跳转的result.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
        文件目录:${requestScope.text }<br>
    </body>
    </html>
  • 相关阅读:
    python3使用PyMysql连接mysql数据库
    MySQL知识总结
    python--正则表达式
    python之多线程
    python在windows和linux环境的进程对比及进程和进程之间的通信
    python基础之生成器(generator)
    python基础之动态添加属性和方法
    [STM32F1] 【转】STM32驱动MPU6050
    51单片机怎么使用MPU6050读取角度值程序 ??
    stm32f10x_lib.h
  • 原文地址:https://www.cnblogs.com/cuiyf/p/2934432.html
Copyright © 2020-2023  润新知