读书人

封装了 Jakarta 文件下传功能的一个类

发布时间: 2012-10-10 13:58:11 作者: rapoo

封装了 Jakarta 文件上传功能的一个类
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="studio.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;
}
}

读书人网 >软件架构设计

热点推荐