package USTC;
import java.util.*;
import java.io.*;
import java.text.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
/**
*
* Jakarta commans FileUpload 封装类.
* 示例代码(在 JSP 页面中, 忽略了异常处理代码):
* test.htm
* <br> 〈form action="b.jsp" method="POST" enctype="multipart/form-data"〉
* <br><!--注意,这个表头的enctype和method是不能随意改变的-->
* <br>Input name: <input type="text" name="username"><br>
* Select a file: <input type="file" name="file1"><br>
* <input type="submit" value="Upload"> </form>
* b.jsp
* <br>UploadFile uploadHandler = new UploadFile(request);
* // 如果是文件上传表单
* <br>if(uploadHandler.isMultipart()) {
* <br>String parameterValue = uploadHandler.getParameter("username");// 读取参数
* <br>UploadFile.saveFileItem(uploadHandler.getFileItem("file1"), new File("c://file1.txt")); * // 保存文件 }
* <p>
* <br>更多参考资料请看 Apache 的网站上的指导文章:
* <br> Using FileUpload @link http://jakarta.apache.org/commons/fileupload/using.html
* <br> @see #getParameter(String)
* <br> @see #getParameterValues(String)
* <br> @see #saveFileItem(FileItem, File) * *
* <br>这个类依赖于 Jakarta commons-fileupload-1.0.zip.
* @author 汪征
* @version 1.0
* 2005-03-23 */
public class UploadFile {
public UploadFile() {
try {
jbInit();
}
catch (Exception ex) {
ex.printStackTrace();
}
} /** 文件域列表 */
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 UploadFile() {}
/**
* 根据现有参数构造一个上传处理器.
* @param request HttpServletRequest
*/
public UploadFile(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();
try {
// Parse the request
/* FileItem */
List 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();
String value = item.getString();
// 首先尝试获取原来的值
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);
}
/** 获取上传的文件项目.FileItem(项目)是这里的关键概念。上传函数就是通过这个FileItem来做为桥梁的
* @param name - String, 文件域名称-->即上传表单元素的name属性
* @return FileItem - org.apache.commons.fileupload.FileItem 对象 */
public FileItem getFileItem(String name) {
if (!isMultipart) {
return null;
}
return (FileItem) (fileFields.get(name));
}
/** 获取表单参数.(相当与request.getParameter(String name)方法。此方法可以在UploadFile内部实现request的功能,达到了封装的良好目的)
* @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[] - 表单域的多个取值,该方法是getParameter 的扩展*/
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;
}
/**
* 返回当前请求是否为多部分上传请求.
* @return boolean
*/
public boolean isMultipart() {
return isMultipart;
}
/** * 保存 FileItem 对象到指定的文件.
* @param item - FileItem, 要保存的上传文件项目
* @param filename - String, 要保存到的文件的服务器路径
* @return boolean - 是否保存成功 */
public static boolean saveFileItem(FileItem item, String filename) {
try {
item.write(new File(filename));
return true;
}
catch (Exception ex) { //
ex.printStackTrace();
}
return false;
}
/** 保存 FileItem 对象到指定的文件.
* @param item - FileItem, 要保存的上传文件名全路径
* @param file - File, 要保存到的文件对象
* @return boolean - 是否保存成功 */
public static InputStream getInputStreamFromFileItem(FileItem item, File file) {
try {
return item.getInputStream();
}
catch (Exception ex) { //
ex.printStackTrace();
}
return null;
}
private void jbInit() throws Exception {
}
//JAVA文件上传的实现类
/**
* 文件上传的实现类,将源文件名去掉后用时间作为名字存放
* @param len request的长度
* @param contentType request的内容
* @param in request流
* @return byte[] 上传文件的字节数组
*/
/* public byte[] uploadToByte(int len,String contentType,InputStream in)
{
String upFile = "";
try
{
byte buffer[] = new byte[len];
int start = contentType.indexOf("boundary=");
int boundaryLen = new String("boundary=").length();
String boundary = contentType.substring(start + boundaryLen);
boundary = "--" + boundary;
int total = 0;
int once = 0;
while ( (total < len) && (once >= 0))
{
once = in.read(buffer, total, len);
total += once;
}
String[] tokens =
{
"name=/"", "/"; filename=/"", "/"/r/n", "Content-Type: ",
"/r/n/r/n"};
//pos0 记录 boundary 的第一个字节在buffer 中的位置
int pos0 = byteIndexOf(buffer, boundary, 0);
int pos1 = 0; //pos1 记录在buffer 中下一个 boundary 的位置
pos0 += boundaryLen; //记录boundary后面第一个字节的下标
pos1 = byteIndexOf(buffer, boundary, pos0);
pos0 += 2; //考虑到boundary后面的 /r/n
buffer = subBytes(buffer, pos0, pos1 - 2);
int[] position = new int[tokens.length];
for (int i = 0; i < tokens.length; i++)
{
position[i] = byteIndexOf(buffer, tokens[i], 0);
}
//得到字段名
String name = subBytesString(buffer,
position[0] + bytesLen(tokens[0]),
position[1]);
//得到文件名
String filename = subBytesString(buffer,
position[1] + bytesLen(tokens[1]),
position[2]);
System.out.println("filename=" + filename); //eg:filename="c:/set.sql"
//上传文件的路径
int size = 0;
for (int k = 0; k < filename.length(); k++)
{
if (filename.charAt(k) == '//')
{
size = k;
}
}
//System.out.println("the start position is:" + size);
String myFile = filename.substring(size + 1, filename.length());
// System.out.println("myFile = " + myFile);
// int a = myFile.indexOf(".");
// if (a > 0 )
// myFile = myFile.substring(a);
// long ltime = 0L;
// Date dtime = new Date();
// ltime = dtime.getTime(); //得到这个标识
// String stime = ltime+"";//将这个标识转换成一个字符对象
// //System.out.println("the file name is:" + stime + myFile);
//
// //String writePath = "c://logs//" + stime + "_" + myFile;
// //String readPath = "c://logs//" + stime + "_" + myFile;
// String writePath = Write_Photo_Path + stime+"_"+myFile;
// String readPath = Read_Photo_Path + stime + "_" + myFile;
// //该文件的名称
// this.file_name = stime + "_" + myFile;
//String writePath = Write_Photo_Path +myFile;
//String readPath = Read_Photo_Path + myFile;
// //该文件的名称
this.file_name = myFile;
//得到 Content-Type
String content_Type = subBytesString(buffer,
position[3] +
bytesLen(tokens[3]),
position[4]);
//System.out.println("content_Type=" + content_Type);
//得到文件内容
byte[] b = subBytes(buffer, position[4] + bytesLen(tokens[4]),
buffer.length);
//System.out.println(position[4] + bytesLen(tokens[4]));
//System.out.println(buffer.length);
this.bContent = b;//得到文件的BYTE数组
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("C:UploadBean;M:uploadToByte()-->" + e.getMessage());
}
return this.bContent;
}
*/
}