📄 fileupload.java
字号:
package com.redmoon.kit.util;
/**
* <p>Title: 文件上传组件Redmoon UploadBean</p>
* <p>Description: 支持多个文件上载,文件保存时可以随机取名称,也可以取文件本来的名称</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: 红月亮工作室</p>
* @author 蓝风
* @version 1.0
*/
import java.io.*;
import java.util.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import cn.js.fan.web.SkinUtil;
public class FileUpload {
boolean debug = false;
public String savePath;
String filepath, filename, contentType;
public Dictionary fields;
private int fileSize = 2048 * 1000; // 单个文件最大2048 * 1000K 即2G,window2000的默认最大值
String extname = ""; // 上传文件的扩展名
String[] extnames = null;
public Vector files = null;
public Vector tmpFiles = new Vector(); // 存放临时文件名
static Hashtable hash = new Hashtable();
// 随机数字生成器
static Random rand = new Random(System.currentTimeMillis());
static long lastRandTime = System.currentTimeMillis();
int ret = 1;
public static final int RET_SUCCESS = 1;
public static final int RET_FAIL = -1;
public static final int RET_TOOLARGEALL = -2;
public static final int RET_TOOLARGESINGLE = -3;
public static final int RET_INVALIDEXT = -4;
public HttpServletRequest request;
public FileUpload() {
files = new Vector();
}
protected void finalize() throws Throwable {
super.finalize();
// 删除临时文件
Iterator ir = tmpFiles.iterator();
while (ir.hasNext()) {
String fpath = (String) ir.next();
File f = new File(fpath);
f.delete();
}
}
/**
* 取文件尺寸默认最大值
* @return int
*/
private int getDefaultFileSize() {
return fileSize;
}
/**
* 置单个文件尺寸默认最大值
* @param size int
*/
public void setMaxFileSize(int size) {
fileSize = size;
}
/**
* 取得所有的文件
* @return Vector
*/
public Vector getFiles() {
return files;
}
/**
* 取上传doUpload()的返回值
* @return int
*/
public int getRet() {
return ret;
}
/**
* 置上传文件的保存路径
* @param savePath String
*/
public void setSavePath(String savePath) {
this.savePath = savePath;
}
/**
* 取得所有域的名称
* @return Enumeration
*/
public Enumeration getFields() {
return fields.keys();
}
/**
* 取得上传文件的保存路径
* @return String
*/
public String getSavePath() {
return savePath;
}
public int getMaxAllFileSize() {
return maxAllFileSize;
}
public String getRealPath() {
return realPath;
}
public static String getTmpPath() {
return tmpPath;
}
/**
* 取得相应表单域的值
* @param fieldName String 域的名称
* @return String 当域不存在时,返回值为null
*/
public String getFieldValue(String fieldName) {
if (fields == null || fieldName == null) {
return null;
}
return (String) fields.get(fieldName);
}
public String[] getFieldValues(String fieldName) {
Object obj = fields.get(fieldName);
if (obj==null)
return null;
if (obj.getClass().isInstance(fieldName)) {
String[] r = new String[1];
r[0] = (String)obj;
return r;
}
else {
Vector v = (Vector) obj;
int len = v.size();
String[] r = new String[len];
for (int i=0; i<len; i++) {
r[i] = (String)v.get(i);
}
return r;
}
}
/**
* 分析文件名称
* @param s String
*/
private void parseFileName(String s) {
if (s == null) {
return;
}
int pos = s.indexOf("filename=\"");
if (pos != -1) {
filepath = s.substring(pos + 10, s.length() - 1);
if (filepath.equals("")) {
return; // 未上传文件
}
filename = getUploadFileName(filepath);
extname = getFileExt(filename);
}
}
/**
* 置文件内容类型
* @param s String
*/
private void setContentType(String s) {
if (s == null) {
return;
}
int pos = s.indexOf(": ");
if (pos != -1) {
contentType = s.substring(pos + 2, s.length());
}
}
public void setMaxAllFileSize(int maxAllFileSize) {
this.maxAllFileSize = maxAllFileSize;
}
public void setRealPath(String realPath) {
this.realPath = realPath;
}
public void setTmpPath(String tmpPath) {
this.tmpPath = tmpPath;
}
/**
* 置合法的扩展名
* @param extnames1 String[]
*/
public void setValidExtname(String[] extnames1) {
if (extnames1 == null)
return;
int len = extnames1.length;
extnames = new String[len];
for (int i = 0; i < len; i++) {
extnames[i] = extnames1[i];
}
}
/**
* 判别扩展名是否合法
* @param ext String 扩展名,如: zip、doc、xls、rar等
* @return boolean
*/
private boolean isValidExtname(String ext) {
if (extnames == null) {
return true;
}
int len = extnames.length;
for (int i = 0; i < len; i++) {
if (extnames[i].equalsIgnoreCase(ext)) {
return true;
}
}
return false;
}
/**
* 取得出错信息
* ret=-1 表示:上传失败
* ret=-2 表示:文件总的大小超过了预设的最大值
* ret=-3 表示:单个文件大小超过了预设的最大值
* ret=-4 表示:扩展名非法
* ret=1 表示:上传成功
* @return String
*/
public String getErrMessage() {
String msg = "";
switch (ret) {
case RET_FAIL:
msg = "Upload failed."; //"上传失败!";
break;
case RET_TOOLARGEALL:
msg = "The total size of files exceed predefined max size " + getMaxAllFileSize() + "."; // "文件总的大小超过了预定最大值" + getMaxAllFileSize() + "K";
break;
case RET_TOOLARGESINGLE:
msg = "Too large file. Every file should be limited in " + getDefaultFileSize() + " K"; // "文件太大,请把每个文件大小限制在" + this.getDefaultFileSize() + "K以内!";
break;
case RET_INVALIDEXT:
msg = "Invalid ext name."; // "扩展名非法!";
break;
case RET_SUCCESS:
msg = "Success."; // "上传成功!";
break;
default:
msg = "Error RET value."; // "上传返回值出错!";
}
return msg;
}
public String getErrMessage(HttpServletRequest request) {
String msg = "";
switch (ret) {
case RET_FAIL:
msg = SkinUtil.LoadString(request, "RET_FAIL"); // "Upload failed."; //"上传失败!";
break;
case RET_TOOLARGEALL:
msg = SkinUtil.LoadString(request, "RET_TOOLARGEALL") + getMaxAllFileSize() + "K"; // "文件总的大小超过了预定最大值" + getMaxAllFileSize() + "K";
break;
case RET_TOOLARGESINGLE:
msg = SkinUtil.LoadString(request, "RET_TOOLARGESINGLE") + getDefaultFileSize() + " K"; // "文件太大,请把每个文件大小限制在" + this.getDefaultFileSize() + "K以内!";
break;
case RET_INVALIDEXT:
msg = SkinUtil.LoadString(request, "RET_INVALIDEXT"); // "扩展名非法!";
break;
case RET_SUCCESS:
msg = SkinUtil.LoadString(request, "RET_SUCCESS"); // "上传成功!";
break;
default:
msg = SkinUtil.LoadString(request, "RET_ERROR"); // "上传返回值出错!";
}
return msg;
}
public int doUpload(ServletContext application, HttpServletRequest request) throws
IOException {
return doUpload(application, request, "utf-8");
}
/**
* 上传文件
* @param request HttpServletRequest
* @return int
* @throws IOException
*/
public int doUpload(ServletContext application, HttpServletRequest request, String charset) throws
IOException {
this.request = request;
realPath = application.getRealPath("/");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -