使用方法:
下面的代码写在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中实现文件上传的功能,这在很多web应用中是必不可少的,例如用户提交个人资料时上传头像,或者在企业系统中上传文档等。 文件上传功能通常涉及到HTTP协议中...
简单 JSP 文件上传 源代码 smartupload 简单 JSP 文件上传 源代码 smartupload 简单 JSP 文件上传 源代码 smartupload 简单 JSP 文件上传 源代码 smartupload
这个项目标题“关于JSP文件上传下载源代码”表明我们将讨论如何在JSP环境中实现文件上传和下载的功能。 首先,我们需要理解JSP文件上传的基本流程。通常,文件上传是通过HTML表单完成的,表单中包含一个`...
本教程将深入讲解如何在JSP中实现视频文件的上传功能,并提供相关的源代码供学习和参考。 一、JSP文件上传基础 在JSP中进行文件上传,通常我们会用到Servlet和Apache的Commons FileUpload库。Servlet是Java Web应用...
jsp上传的实现其实很简单,把这里的代码粘到用到的地方就OK啦。
【标题】"JSP多个文件上传源代码程序"揭示了一个重要的Web开发技术,即在JavaServer Pages (JSP)环境中实现多文件上传的功能。在Web应用中,用户可能需要同时上传多个文件,如图片、文档等,这在论坛、博客、社交...
总结来说,简单的文件上传JSP源代码包括前端HTML表单、后端JSP处理逻辑以及必要的服务器配置。通过理解这一过程,开发者可以创建一个基础的文件上传系统,满足用户上传文件的需求。在实际项目中,还需要考虑安全性、...
【标题】"jsp上传下载文件源代码,通过struts.xml控制在100M以内"涉及的核心技术主要包括JSP(JavaServer Pages)、Struts框架以及文件上传与下载的处理。Struts是Apache软件基金会的一个开源项目,它为Java Web应用...
这主要包括以下几个方面的内容:理解JSP与SmartUpload的基本概念、解析提供的代码示例、以及深入探讨SmartUpload中的关键方法。 ### JSP与SmartUpload简介 #### JSP (JavaServer Pages) JSP是一种基于Java技术的...
【JSP文件管理源代码】是一个基于Java Web技术的项目,主要使用了JSP(JavaServer Pages)作为前端展示和Servlet进行服务器端处理。这个项目的核心功能是提供一个文件管理系统,用户可以进行文件的上传、下载、查看...
综上所述,该文件上传系统源代码利用了JSP的强大功能和Dreamweaver的便捷开发环境,实现了一个用户友好的文件上传功能,同时也涉及到文件存储、权限控制和错误处理等关键模块。通过学习和理解这个项目,开发者可以...
在这个“struts2上传文件源代码”中,我们将深入探讨Struts2如何实现文件上传功能,以及涉及到的相关知识点。 首先,文件上传是Web应用中常见的功能,它允许用户从本地计算机选择文件并将其发送到服务器。在Struts2...
在项目的`upload`子目录中,可能包含了实现文件上传和下载功能的Java源代码、配置文件以及测试资源。可能包括一个Servlet类,处理POST请求以接收上传的文件,并将其保存到服务器;另一个Servlet或JSP页面,根据用户...
【JSP上传文件实例源代码详解】 在Java服务器页面(JSP)中实现文件上传功能是一项常见的需求,尤其是在开发Web应用程序时。这个“jsp上传实例源代码”提供了一个实际操作的例子,展示了如何允许用户从他们的计算机...
在JSpsmart的源代码中,我们可以深入理解其内部机制和工作原理。以下是几个关键的知识点: 1. **上传处理流程**: - **请求解析**:JSpsmart首先会捕获HTTP请求,解析请求体中的文件数据。这涉及到对multipart/...
文件上传功能允许用户从他们的设备上传文件到服务器。在Struts2中,这通常通过表单实现,表单包含一个`<input type="file">`元素,用户可以选择本地文件。Struts2的Action类会接收这个文件,并使用`Commons ...
本资源"15个JSP项目实例技术源代码"提供了一系列实际应用场景的JSP项目示例,对于学习和掌握JSP技术具有很高的参考价值。 ### JSP基础知识 1. **JSP语法结构**:JSP页面由静态内容(HTML、CSS、JavaScript)和动态...
本知识点将深入讲解如何在J2EE环境下实现文件上传并展示进度条的源代码。 J2EE(Java 2 Platform, Enterprise Edition)是一个用于构建企业级应用的Java平台,它提供了多种服务和API,如Servlet、JSP(JavaServer ...
在这个源代码中,重点是如何处理同时上传多个文件。通常,这需要使用HTML5的`<input type="file" multiple>`属性来让用户选择多个文件。然后,这些文件的数据会被打包成一个Multipart请求,通过HTTP POST发送到...
在【描述】中提到的源代码可能是基于SmartUpload库的一个示例,SmartUpload是一个流行的文件上传组件,简化了在JSP和Servlet中处理文件上传的复杂性。它支持多文件上传、文件大小限制、文件类型检查等功能。`...