⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jakartafileuploadhandler.java

📁 这是基于 XLoadTree 的一个强大功能的展示的例子, 文件个头也不大, 主要功能集中在 Web 前台. 最终目标是实现一个易于使用的像 Windows 资源管理器那样管理远程 JSP
💻 JAVA
字号:
package beansoft.jsp;

import java.util.*;
import java.io.*;

import javax.servlet.http.*;

import org.apache.commons.fileupload.*;

/**
 * Jakarta commons FileUpload 封装类.
 * 提供: 参数读取(在 Tomcat 4, 5 下测试过似乎没有中文问题), 文件保存功能.
 *
 * NOTE: 所有的表单和页面编码都是按照 UTF-8 来处理的.
 * TODO Refactor to make encoding configable.
 *
 * 示例代码(在 JSP 页面中, 忽略了异常处理代码):
 * test.htm
   <form action="test.jsp">
   Input name: <input type="text" name="username"><br>
   Select a file: <input type="file" name="file1"><br>
   <input type="submit" value="Upload">
   </form>

   test.jsp
<%@ page contentType="text/html;charset=utf8" %>
<%@ page import="beansoft.jsp.*, java.io.*" %>
<%
   JakartaFileUploadHandler uploadHandler = new JakartaFileUploadHandler(request);
   // 如果是文件上传表单
   if(uploadHandler.isMultipart()) {
	  // 读取参数
	  String parameterValue = uploadHandler.getParameter("username");
	  out.println("username=" + parameterValue);
	  // 保存文件
	  JakartaFileUploadHandler.saveFileItem(uploadHandler.getFileItem("file1"), new File("file1.txt"));
   }
%>

   更多参考资料请看 Apache 的网站上的指导文章:
   Using FileUpload
   @link http://jakarta.apache.org/commons/fileupload/using.html
 *
 * @see #getParameter(String)
 * @see #getParameterValues(String)
 * @see #saveFileItem(FileItem, File)
 *
 * 这个类依赖于 Jakarta commons-fileupload-1.0.zip.
 *
 * @author beansoft beansoftstudio@msn.com
 * @version 1.01
 * 2005-11-30
 */
public class JakartaFileUploadHandler
{
	/** 文件域列表 */
	private Map fileFields= new TreeMap();
	/** 表单域列表 */
	private Map formFields= new TreeMap();
	/** Check that we have a file upload request */
	private boolean isMultipart = false;
	private HttpServletRequest request = null;

	/**
	 * 空构造器.
	 */
	public JakartaFileUploadHandler() {

	}

	/**
	 * 根据现有参数构造一个上传处理器.
	 */
	public JakartaFileUploadHandler(HttpServletRequest request) {
      setRequest(request);
	}

	/**
	 * 设置 HttpServletRequest 并分析里面的表单数据.
	 * @param request - HttpServletRequest
	 */
	public void setRequest(HttpServletRequest request) {
		this.request = request;

       isMultipart = FileUpload.isMultipartContent(request);

	   // 如果是文件上传请求, 就提取里面的参数
       if(isMultipart) {
			// Create a new file upload handler
			DiskFileUpload upload = new DiskFileUpload();

			/*
		     * Nov 29 2005, set default upload encoding to UTF-8.
			 * Specifies the character encoding to be used when reading the headers of
		     * individual parts. When not specified, or <code>null</code>, the platform
		     * default encoding is used.
		     */
			upload.setHeaderEncoding("UTF-8");

			try {
				// Parse the request
				List /* FileItem */ items = upload.parseRequest(request);

				// Process the uploaded items
				Iterator iter = items.iterator();
				while (iter.hasNext()) {
				    FileItem item = (FileItem) iter.next();

				    String name = item.getFieldName();
			    	String value = item.getString();

				    if (item.isFormField()) {
				        processFormField(item);
				    } else {
				        processUploadedFile(item);
				    }
				}
			} catch (Exception ex) {
				System.err.println("无法处理上传数据:" + ex);
			}

	   }
	}

	/**
	 * 处理表单项目.
	 * @param item - FileItem 对象
	 */
	private void processFormField(FileItem item) {
	    String name = item.getFieldName();
	    // NOTE 文件上传统一使用 UTF-8 编码 2005-10-16
    	String value = null;

		try {
			value = item.getString("UTF-8");
		} catch (UnsupportedEncodingException e) {
		}

	  	// 首先尝试获取原来的值
    	Object oldValue = formFields.get(name);

    	if(oldValue == null) {
           formFields.put(name, value);
		} else {
			// 多个值存储为 List

			// 原来为单个值则添加现有的值
			try {
			    String oldString = (String)oldValue;

			    List list = new ArrayList();
			    list.add(oldString);
			    list.add(value);

			    formFields.put(name, list);
			} catch (Exception ex) {
//			  ex.printStackTrace();
			}

            // 原来为多个值则添加现有的值
			try {
			    List list = (List)oldValue;
                list.add(value);
			    formFields.put(name, list);
			} catch (Exception ex) {
//			  ex.printStackTrace();
			}
		}
	}

	/**
	 * 处理文件项目.
	 * @param item - FileItem 对象
	 */
	private void processUploadedFile(FileItem item) {
		String name = item.getFieldName();
        fileFields.put(name, item);
	}

	/**
	 * 获取上传的文件项目.
	 * @param name - String, 文件域名称
	 * @return FileItem - org.apache.commons.fileupload.FileItem 对象
	 */
	public FileItem getFileItem(String name) {
		if(!isMultipart) return null;

		return (FileItem) (fileFields.get(name));
	}

	/**
	 * 获取表单参数.
	 * @param name - String, 表单域名称
	 * @return String - 表单域值
	 */
	public String getParameter(String name) {
		if(!isMultipart) {
		   return request.getParameter(name);
		}

		Object value = formFields.get(name);
		if(value != null) {
			if(value instanceof String) {
				return (String)value;
			}
		}
	  	return null;
	}

	/**
	 * 获取表单域的多个参数值.
	 * @param name - String, 表单域名称
	 * @return String[] - 表单域的多个取值
	 */
	public String[] getParameterValues(String name) {
		if(!isMultipart) {
		   return request.getParameterValues(name);
		}

		Object value = formFields.get(name);
		if(value != null) {
			if(value instanceof List) {
				return (String[]) ((List)value).toArray(new String[0]);
			}
		}
	  	return null;
	}

	/**
	 * 返回当前请求是否为多部分上传请求.
	 */
	public boolean isMultipart()
	{
		return isMultipart;
	}

	/**
	 * 保存 FileItem 对象到指定的文件.
	 * @param item - FileItem, 要保存的上传文件项目
	 * @param file - File, 要保存到的文件对象
	 * @return boolean - 是否保存成功
	 */
	public static boolean saveFileItem(FileItem item, File file) {
		try {
		  item.write(file);
		  return true;
		} catch (Exception ex) {
//		  ex.printStackTrace();
		  System.out.println("saveFileItem error:" + ex);
		}
		return false;
	}

	/**
	 * 获取 FileItem 对象的输入流.
	 * @param item - FileItem, 要获取输入流的上传文件对象
	 * @return InputStream - 对象的输入流
	 */
	public static InputStream getInputStreamFromFileItem(FileItem item) {
		try {
		  return item.getInputStream();
		} catch (Exception ex) {
//		  ex.printStackTrace();
		}
		return null;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -