• 在JSP中实现文件的上传(转载)


    在这里看到很多讨论文件上传的文章,觉得各有利敝,有些只限于上传文件,而不能同时取得文本字段值,尤其是上传多个文件比较少,现本人做这个上传文件的类最多可支持上传255个文件,同时可取得文本字段值,请各位高手指正.

    文件上传类:MoqUploadBean.java 
    package net.jspcn.tool;

    import java.io.*;

    import java.util.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

    /**

     *

     * Title: 文件上传类

     * Description: 既能对文件进行上传,又能取得输入框的值,最多可同时上传255个文件

     * Copyright: Copyright (c) 2002

     * Company: Tekson

     * @author 莫琼

     * @version 1.0

     */

    public class UploadBean {

      private String[] sourceFile = new String[255];     //源文件名

      private String[] suffix = new String[255];         //文件后缀名

      private String canSuffix = ".gif.jpg.jpeg.png";    //可上传的文件后缀名

      private String objectPath = "c:/";                 //目标文件目录

      private String[] objectFileName = new String[255]; //目标文件名

      private ServletInputStream sis = null;             //输入流

      private String[] description = new String[255];    //描述状态

      private long size = 100 * 1024;                    //限制大小

      private int count = 0;                             //已传输文件数目

      private byte[] b = new byte[4096];                 //字节流存放数组

      private boolean successful = true;

      private Hashtable fields = new Hashtable();

      public UploadBean() {

      }

      //设置上传文件的后缀名

      public void setSuffix(String canSuffix) {

        this.canSuffix = canSuffix;

      }

      //设置文件保存路径

      public void setObjectPath(String objectPath) {

        this.objectPath = objectPath;

      }

      //设置文件保存路径

      public void setSize(long maxSize) {

        this.size = maxSize;

      }

      //文件上传处理程序

      public void setSourceFile(HttpServletRequest request) throws IOException {

        sis = request.getInputStream();

        int a = 0;

        int k = 0;

        String s = "";

        while ( (a = sis.readLine(b, 0, b.length)) != -1) {

          s = new String(b, 0, a);

          if ( (k = s.indexOf("filename=\"")) != -1) {

            // 取得文件数据

            s = s.substring(k + 10);

            k = s.indexOf("\"");

            s = s.substring(0, k);

            sourceFile[count] = s;

            k = s.lastIndexOf(".");

            suffix[count] = s.substring(k + 1);

            if (canTransfer(count)) {

              transferFile(count);

            }

            ++count;

          } else if ( (k = s.indexOf("name=\"")) != -1) {

            // 普通表单输入元素,获取输入元素名字

            String fieldName = s.substring(k+6, s.length()-3);

            sis.readLine(b, 0, b.length);

            StringBuffer fieldValue = new StringBuffer(b.length);

            while ( (a = sis.readLine(b, 0, b.length)) != -1) {

              s = new String(b, 0, a-2);

              if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {

                break;

              } else {

                fieldValue.append(s);

              }

            }

            fields.put(fieldName, fieldValue.toString());

          }

          if (!successful)

            break;

        }

      }

      //取得表单元素值

      public String getFieldValue(String fieldName) {

        if (fields == null || fieldName == null) {

          return null;

        }

        return (String) fields.get(fieldName);

      }

      //取得上传文件数

      public int getCount() {

        return count;

      }

      //取得目标路径

      public String getObjectPath() {

        return objectPath;

      }

      //取得源文件名

      public String[] getSourceFile() {

        return sourceFile;

      }

      //取得目标文件名

      public String[] getObjectFileName() {

        return objectFileName;

      }

      //取得上传状态描述

      public String[] getDescription() {

        return description;

      }

      //判断上传文件的类型

      private boolean canTransfer(int i) {

        suffix[i] = suffix[i].toLowerCase();

        //这个是用来传图片的,各位可以把后缀名改掉或者不要这个条件

        if (sourceFile[i].equals("") || (!(canSuffix.indexOf("."+suffix[i])>=0))) {

          description[i] = "ERR: File suffix is wrong.";

          return false;

        }

        else {

          return true;

        }

      }

      //上传文件转换

      private void transferFile(int i) {

        String x = Long.toString(new java.util.Date().getTime());

        try {

          objectFileName[i] = x + "." + suffix[i];

          FileOutputStream out = new FileOutputStream(objectPath + objectFileName[i]);

          int a = 0;

          int k = 0;

          long hastransfered = 0; //标示已经传输的字节数

          String s = "";

          while ( (a = sis.readLine(b, 0, b.length)) != -1) {

            s = new String(b, 0, a);

            if ( (k = s.indexOf("Content-Type:")) != -1) {

              break;

            }

          }

          sis.readLine(b, 0, b.length);

          while ( (a = sis.readLine(b, 0, b.length)) != -1) {

            s = new String(b, 0, a);

            if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {

              break;

            }

            out.write(b, 0, a);

            hastransfered += a;

            if (hastransfered >= size) {

              description[count] = "ERR: The file " + sourceFile[count] +

                  " is too large to transfer. The whole process is interrupted.";

              successful = false;

              break;

            }

          }

          if (successful) {

            description[count] = "Right: The file " + sourceFile[count] +

                " has been transfered successfully.";

          }

          out.close();

          if (!successful) {

            sis.close();

            File tmp = new File(objectPath + objectFileName[count]);

            tmp.delete();

          }

        }

        catch (IOException ioe) {

          description[i] = ioe.toString();

        }

      }

      public static void main(String[] args) {

        System.out.println("Test OK");

      }

    }


    文件上传调用:MoqUpload.jsp
    〈%@ page contentType="text/html; charset=GB2312" %>

    〈html>

    〈head>

    〈title>文件上载〈/title>

    〈/head>

    〈body>

    〈form action="MoqUploadSubmit.jsp" enctype="MULTIPART/FORM-DATA" method="post">

    作者姓名:〈input type="text" name="Author" />

    〈br />

    公司名称:〈input type="text" name="Company" />

    〈br />

    文件描述:〈input type="text" name="Comment" />

    〈br />

    选择文件1:〈input type="file" name="filename1" />

    〈br />

    选择文件2:〈input type="file" name="filename2" />

    〈br />

    选择文件3:〈input type="file" name="filename3" />

    〈br />

    选择文件4:〈input type="file" name="filename4" />

    〈br />

    〈input type="submit" value="上载" />

    〈/form>

    〈/body>

    〈/html>


    文件上传提交:MoqUploadSubmit.jsp
    〈%@ page contentType="text/html;charset=gb2312"%>

    〈jsp:useBean id="fileBean" scope="page" class="net.moq.www.MoqUploadBean" />

    〈%

    fileBean.setObjectPath("D:\\Temp\\");

    fileBean.setSize(10000*1024);

    fileBean.setSuffix(".gif.jpg.png.jpge.html.htm");

    fileBean.setSourceFile(request);

    String [] saSourceFile = fileBean.getSourceFile();

    String [] saObjectFile = fileBean.getObjectFileName();

    String [] saDescription = fileBean.getDescription();

    int iCount = fileBean.getCount();

    String sObjectPath = fileBean.getObjectPath();

    for(int i=0;i〈iCount;i++) {

      out.println("〈br>源始文件:");

      out.println(saSourceFile[i]);

      out.println("〈br>目标文件:");

      out.println(sObjectPath+saObjectFile[i]);

      out.println("〈br>上传说明:");

      out.println(saDescription[i]);

      out.println("〈br>");

    }

    out.println("〈br>作者:" + fileBean.getFieldValue("Author"));

    out.println("〈br>公司:" + fileBean.getFieldValue("Company"));

    out.println("〈br>说明:" + fileBean.getFieldValue("Comment"));

    %>
    OVER
  • 相关阅读:
    网络流24题总结和题解
    NOIP复习之1 数学数论
    BZOJ3301 P2524 UVA11525 算法解释康托展开
    线段树与树状数组的综合运用
    P2261 bzoj1257 [CQOI2007]余数求和
    BZOJ 1968_P1403 [AHOI2005]约数研究--p2260bzoj2956-模积和∑----信息学中的数论分块
    P1064 金明的预算方案
    洛谷p1002 过河卒
    Luogu P3014 [USACO11FEB]牛线Cow Line
    Luogu P3927 SAC E#1
  • 原文地址:https://www.cnblogs.com/long/p/163017.html
Copyright © 2020-2023  润新知