`

jsp中上传文件的源代码

    博客分类:
  • JSP
阅读更多
使用方法:

下面的代码写在servlet的doPost()方法中,
doPost(request, response){
Upload myUpload = new Upload();

myUpload.init(request);
myUpload.setSaveDir(SERVER_SAVE_DIR);  // 上传路径
myUpload.uploadFile();               
}

源代码:

package cae;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Upload {
private String saveDir = "."; // 要保存文件的路径
private String contentType = ""; // 文档类型
private String charset = ""; // 字符集
private ArrayList tmpFileName = new ArrayList(); // 临时存放文件名的数据结构
private Hashtable parameter = new Hashtable(); // 存放参数名和值的数据结构
private ServletContext context; // 程序上下文,用于初始化
private HttpServletRequest request; // 用于传入请求对象的实例
private String boundary = ""; // 内存数据的分隔符
private int len = 0; // 每次从内在中实际读到的字节长度
private String queryString;
private int count; // 上载的文件总数
private String[] fileName; // 上载的文件名数组
private long maxFileSize = 1024 * 1024 * 10; // 最大文件上载字节;
private String tagFileName = "";
public final void init(HttpServletRequest request) throws ServletException {
  System.out.println("Myupload enter...");
  this.request = request;
  boundary = request.getContentType().substring(30); // 得到内存中数据分界符
  queryString = request.getQueryString();
}
public String getParameter(String s) { // 用于得到指定字段的参数值,重写request.getParameter(String
           // s)
  if (parameter.isEmpty()) {
   return null;
  }
  return (String) parameter.get(s);
}
public String[] getParameterValues(String s) { // 用于得到指定同名字段的参数数组,重写request.getParameterValues(String
             // s)
  ArrayList al = new ArrayList();
  if (parameter.isEmpty()) {
   return null;
  }
  Enumeration e = parameter.keys();
  while (e.hasMoreElements()) {
   String key = (String) e.nextElement();
   if (-1 != key.indexOf(s + "||||||||||") || key.equals(s)) {
    al.add(parameter.get(key));
   }
  }
  if (al.size() == 0) {
   return null;
  }
  String[] value = new String[al.size()];
  for (int i = 0; i < value.length; i++) {
   value[i] = (String) al.get(i);
  }
  return value;
}
public String getQueryString() {
  return queryString;
}
public int getCount() {
  return count;
}
public String[] getFileName() {
  return fileName;
}
public void setMaxFileSize(long size) {
  maxFileSize = size;
}
public void setTagFileName(String filename) {
  tagFileName = filename;
}
public void setSaveDir(String saveDir) { // 设置上载文件要保存的路径
  this.saveDir = saveDir;
  File testdir = new File(saveDir); // 为了保证目录存在,如果没有则新建该目录
  if (!testdir.exists()) {
   testdir.mkdirs();
  }
}
public void setCharset(String charset) { // 设置字符集
  this.charset = charset;
}
public boolean uploadFile() throws ServletException, IOException { // 用户调用的上载方法
  setCharset(request.getCharacterEncoding());
//  if (uploadFile(request.getInputStream())) {
//   System.out.println("true");
//   return true;
//  } else {
//   System.out.println("false");
//   return false;
//  }
  return uploadFile(request.getInputStream());
}
private boolean uploadFile(ServletInputStream servletinputstream) throws // 取得央存数据的主方法
   ServletException, IOException {
  String line = null;
  byte[] buffer = new byte[256];
  while ((line = readLine(buffer, servletinputstream, charset)) != null) {
   if (line.startsWith("Content-Disposition: form-data;")) {
    int i = line.indexOf("filename=");
    if (i >= 0) { // 如果一段分界符内的描述中有filename=,说明是文件的编码内容
     String fName = getFileName(line);
     if (fName.equals("")) {
      continue;
     }
     if (count == 0 && tagFileName.length() != 0) {
      String ext = fName
        .substring((fName.lastIndexOf(".") + 1));
      fName = tagFileName + "." + ext;
     }
     tmpFileName.add(fName);
     count++;
     while ((line = readLine(buffer, servletinputstream, charset)) != null) {
      if (line.length() <= 2) {
       break;
      }
     }
     File f = new File(saveDir, fName);
     FileOutputStream dos = new FileOutputStream(f);
     long size = 0l;
     while ((line = readLine(buffer, servletinputstream, null)) != null) {
      if (line.indexOf(boundary) != -1) {
       break;
      }
      size += len;
      if (size > maxFileSize) {
       throw new IOException("文件超过" + maxFileSize + "字节!");
      }
      dos.write(buffer, 0, len);
     }
     dos.close();
    } else { // 否则是字段编码的内容
     String key = getKey(line);
     String value = "";
     while ((line = readLine(buffer, servletinputstream, charset)) != null) {
      if (line.length() <= 2) {
       break;
      }
     }
     while ((line = readLine(buffer, servletinputstream, charset)) != null) {
      if (line.indexOf(boundary) != -1) {
       break;
      }
      value += line;
     }
     put(key, value.trim(), parameter);
    }
   }
  }
  if (queryString != null) {
   String[] each = split(queryString, "&");
   for (int k = 0; k < each.length; k++) {
    String[] nv = split(each[k], "=");
    if (nv.length == 2) {
     put(nv[0], nv[1], parameter);
    }
   }
  }
  fileName = new String[tmpFileName.size()];
  for (int k = 0; k < fileName.length; k++) {
   fileName[k] = (String) tmpFileName.get(k); // 把ArrayList中临时文件名倒入数据中供用户调用
  }
  if (fileName.length == 0) {
   return false; // 如果fileName数据为空说明没有上载任何文件
  }
  return true;
}
private void put(String key, String value, Hashtable ht) {
  if (!ht.containsKey(key)) {
   ht.put(key, value);
  } else { // 如果已经有了同名的KEY,就要把当前的key更名,同时要注意不能构成和KEY同名
   try {
    Thread.currentThread().sleep(1); // 为了不在同一ms中产生两个相同的key
   } catch (Exception e) {
   }
   key += "||||||||||" + System.currentTimeMillis();
   ht.put(key, value);
  }
}
/*
  * 调用ServletInputstream.readLine(byte[] b,int
  * offset,length)方法,该方法是从ServletInputstream流中读一行
  * 到指定的byte数组,为了保证能够容纳一行,该byte[]b不应该小于256,重写的readLine中,调用了一个成员变量len为
  * 实际读到的字节数(有的行不满256),则在文件内容写入时应该从byte数组中写入这个len长度的字节而不是整个byte[]
  * 的长度,但重写的这个方法返回的是String以便分析实际内容,不能返回len,所以把len设为成员变量,在每次读操作时把实际长度赋给它.
  * 也就是说在处理到文件的内容时数据既要以String形式返回以便分析开始和结束标记,又要同时以byte[]的形式写到文件输出流中.
  */
private String readLine(byte[] Linebyte,
   ServletInputStream servletinputstream, String charset) {
  try {
   len = servletinputstream.readLine(Linebyte, 0, Linebyte.length);
   if (len == -1) {
    return null;
   }
   if (charset == null) {
    return new String(Linebyte, 0, len);
   } else {
    return new String(Linebyte, 0, len, charset);
   }
  } catch (Exception _ex) {
   return null;
  }
}
private String getFileName(String line) { // 从描述字符串中分离出文件名
  if (line == null) {
   return "";
  }
  int i = line.indexOf("filename=");
  line = line.substring(i + 9).trim();
  i = line.lastIndexOf("\\");
  if (i < 0 || i >= line.length() - 1) {
   i = line.lastIndexOf("/");
   if (line.equals("\"\"")) {
    return "";
   }
   if (i < 0 || i >= line.length() - 1) {
    return line;
   }
  }
  return line.substring(i + 1, line.length() - 1);
}
private String getKey(String line) { // 从描述字符串中分离出字段名
  if (line == null) {
   return "";
  }
  int i = line.indexOf("name=");
  line = line.substring(i + 5).trim();
  return line.substring(1, line.length() - 1);
}
public static String[] split(String strOb, String mark) {
  if (strOb == null) {
   return null;
  }
  StringTokenizer st = new StringTokenizer(strOb, mark);
  ArrayList tmp = new ArrayList();
  while (st.hasMoreTokens()) {
   tmp.add(st.nextToken());
  }
  String[] strArr = new String[tmp.size()];
  for (int i = 0; i < tmp.size(); i++) {
   strArr[i] = (String) tmp.get(i);
  }
  return strArr;
}
}

分享到:
评论

相关推荐

    jsp文件上传源代码

    "jsp文件上传源代码"这个标题表明我们正在讨论如何在JSP中实现文件上传的功能,这在很多web应用中是必不可少的,例如用户提交个人资料时上传头像,或者在企业系统中上传文档等。 文件上传功能通常涉及到HTTP协议中...

    简单JSP文件上传源代码smartupload

    简单 JSP 文件上传 源代码 smartupload 简单 JSP 文件上传 源代码 smartupload 简单 JSP 文件上传 源代码 smartupload 简单 JSP 文件上传 源代码 smartupload

    关于JSP文件上传下载源代码

    这个项目标题“关于JSP文件上传下载源代码”表明我们将讨论如何在JSP环境中实现文件上传和下载的功能。 首先,我们需要理解JSP文件上传的基本流程。通常,文件上传是通过HTML表单完成的,表单中包含一个`...

    JSP文件上传视频和源代码

    本教程将深入讲解如何在JSP中实现视频文件的上传功能,并提供相关的源代码供学习和参考。 一、JSP文件上传基础 在JSP中进行文件上传,通常我们会用到Servlet和Apache的Commons FileUpload库。Servlet是Java Web应用...

    JSP上传文件源代码

    jsp上传的实现其实很简单,把这里的代码粘到用到的地方就OK啦。

    JSP多个文件上传源代码程序

    【标题】"JSP多个文件上传源代码程序"揭示了一个重要的Web开发技术,即在JavaServer Pages (JSP)环境中实现多文件上传的功能。在Web应用中,用户可能需要同时上传多个文件,如图片、文档等,这在论坛、博客、社交...

    简单的上传文件的JSP源代码

    总结来说,简单的文件上传JSP源代码包括前端HTML表单、后端JSP处理逻辑以及必要的服务器配置。通过理解这一过程,开发者可以创建一个基础的文件上传系统,满足用户上传文件的需求。在实际项目中,还需要考虑安全性、...

    jsp上传下载文件源代码,通过struts.xml控制在100M以内

    【标题】"jsp上传下载文件源代码,通过struts.xml控制在100M以内"涉及的核心技术主要包括JSP(JavaServer Pages)、Struts框架以及文件上传与下载的处理。Struts是Apache软件基金会的一个开源项目,它为Java Web应用...

    JSP下载文件源代码

    这主要包括以下几个方面的内容:理解JSP与SmartUpload的基本概念、解析提供的代码示例、以及深入探讨SmartUpload中的关键方法。 ### JSP与SmartUpload简介 #### JSP (JavaServer Pages) JSP是一种基于Java技术的...

    jsp文件管理源代码

    【JSP文件管理源代码】是一个基于Java Web技术的项目,主要使用了JSP(JavaServer Pages)作为前端展示和Servlet进行服务器端处理。这个项目的核心功能是提供一个文件管理系统,用户可以进行文件的上传、下载、查看...

    jsp和dreamweaver做的文件上传系统源代码

    综上所述,该文件上传系统源代码利用了JSP的强大功能和Dreamweaver的便捷开发环境,实现了一个用户友好的文件上传功能,同时也涉及到文件存储、权限控制和错误处理等关键模块。通过学习和理解这个项目,开发者可以...

    struts2上传文件源代码

    在这个“struts2上传文件源代码”中,我们将深入探讨Struts2如何实现文件上传功能,以及涉及到的相关知识点。 首先,文件上传是Web应用中常见的功能,它允许用户从本地计算机选择文件并将其发送到服务器。在Struts2...

    jsp文件的上传和下载

    在项目的`upload`子目录中,可能包含了实现文件上传和下载功能的Java源代码、配置文件以及测试资源。可能包括一个Servlet类,处理POST请求以接收上传的文件,并将其保存到服务器;另一个Servlet或JSP页面,根据用户...

    jsp上传实例源代码

    【JSP上传文件实例源代码详解】 在Java服务器页面(JSP)中实现文件上传功能是一项常见的需求,尤其是在开发Web应用程序时。这个“jsp上传实例源代码”提供了一个实际操作的例子,展示了如何允许用户从他们的计算机...

    jspsmart下载上传源代码

    在JSpsmart的源代码中,我们可以深入理解其内部机制和工作原理。以下是几个关键的知识点: 1. **上传处理流程**: - **请求解析**:JSpsmart首先会捕获HTTP请求,解析请求体中的文件数据。这涉及到对multipart/...

    struts2文件上传下载源代码

    文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`&lt;input type="file"&gt;`元素,用户可以选择本地文件。Struts2的Action类会接收这个文件,并使用`Commons ...

    15个JSP项目实例技术源代码

    本资源"15个JSP项目实例技术源代码"提供了一系列实际应用场景的JSP项目示例,对于学习和掌握JSP技术具有很高的参考价值。 ### JSP基础知识 1. **JSP语法结构**:JSP页面由静态内容(HTML、CSS、JavaScript)和动态...

    文件上传中带进度条源代码

    本知识点将深入讲解如何在J2EE环境下实现文件上传并展示进度条的源代码。 J2EE(Java 2 Platform, Enterprise Edition)是一个用于构建企业级应用的Java平台,它提供了多种服务和API,如Servlet、JSP(JavaServer ...

    jsp版的多文件上传源代码

    在这个源代码中,重点是如何处理同时上传多个文件。通常,这需要使用HTML5的`&lt;input type="file" multiple&gt;`属性来让用户选择多个文件。然后,这些文件的数据会被打包成一个Multipart请求,通过HTTP POST发送到...

    jsp文件上传下载

    在【描述】中提到的源代码可能是基于SmartUpload库的一个示例,SmartUpload是一个流行的文件上传组件,简化了在JSP和Servlet中处理文件上传的复杂性。它支持多文件上传、文件大小限制、文件类型检查等功能。`...

Global site tag (gtag.js) - Google Analytics