|
楼主 |
发表于 2005-2-18 18:31:14
|
显示全部楼层
[PHP]
package web.upload;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import javax.servlet.http.HttpServletRequest;
/**
* 文件上传进行代理服务,阻止不符合上传规范的文件进入。
* 使用单实例创建,外部调用只有通过工厂方法才可以创建唯一的代理实例。
* @author fangshun
* @see FileUploadFactroy
*/
public class FileUploadProxy implements FileUpload {
/**
* 外部调用只有通过工厂方法才可以创建唯一的代理实例。
*/
protected FileUploadProxy() {}
/**
* 上传方法<tt>upload</tt>的代理验证,阻止不符合规范的上传方式,
* 实现接口的方法。
* @param request 需要得到从上传页面传来的request对象。
*
* @param pathName 服务器存放上传文件的绝对路径,
* 这可能来自你自己的指定,或者来自你要解析的某个已经配置好的配置文件
* 例如WEB-INF下的某个目录的xml配置文件
*
* @param sizeMax 需要上传的文件总体的容量,这里使用long类型,以满足
* 能支持大容量的文件上传,请注意:上传参数sizeMax的最小单位为'K'
*
* @throws Exception
* @see FileUpload
*/
public void upload(HttpServletRequest request, String pathName, long sizeMax)
throws Exception {
// TODO Auto-generated method stub
if ((request == null) || (pathName == null)) {
throw new NullPointerException("parameter");
}
if (sizeMax < 0) {
throw new FileSizeException("File Require Size ");
} else {
//从request中获取上下文内容尺度
int requestSize = request.getContentLength();
//为传来的最大容量乘以1024,获得符合以'K'为单位的尺度
long sizeMax_K = sizeMax << 10;
//String pathNameCN = new String(pathName.getBytes("utf-8"), "gb2312");
//如果传来的尺度大于上传的最大限度
if (requestSize > sizeMax_K) {
throw new SizeLimitExceededException(
"the request was rejected because " +
"it's size exceeds allowed range");
}
String contentType = request.getContentType();
//如果传来的条件符合代理类的要求,执行上传操作!!!
FileUploadimpl upload = FileUploadimpl.getInstance();
upload.processUpload(request, pathName, sizeMax_K);
}
}
/**
* 上传实现细节
* 内隐类实现
* @author fangshun
*/
private static class FileUploadimpl {
private static FileUploadimpl upload;
/**
* 外界对象不能进行实例化,包私有创建对象。
*/
private FileUploadimpl () { }
private static FileUploadimpl getInstance() {
if(upload == null) {
upload = new FileUploadimpl ();
}
return upload;
}
/**
* 上传实现
* @param request 需要得到从上传页面传来的request对象。
*
* @param pathName 服务器存放上传文件的绝对路径,
* 这可能来自你自己的指定,或者来自你要解析的某个已经配置好的配置文件
* 例如WEB-INF下的某个目录的xml配置文件
*
* @param sizeMax 需要上传的文件总体的容量,这里使用long类型,以满足
* 能支持大容量的文件上传,参数sizeMax的最小单位为'K'
* @throws Exception
*/
private void processUpload(HttpServletRequest request, String filePath, long sizeMax)
throws Exception {
DiskFileUpload fu = new DiskFileUpload();
String encoding = request.getCharacterEncoding();
fu.setHeaderEncoding(encoding);
// If file size exceeds, a FileUploadException will be thrown
fu.setSizeMax(sizeMax);
List fileItems = fu.parseRequest(request);
Iterator itr = fileItems.iterator();
while (itr.hasNext()) {
FileItem fi = (FileItem) itr.next();
String fileName = fi.getName();
if(fileName == null || fileName.equals("")) {
continue;
}
System.out.println("no convert" + fileName);
//fileName = new String(fileName.getBytes(), "utf-8");
// fileName = new String(fileName.getBytes(), "gb2312");
System.out.println("fileName" + fileName);
//Check if not form field so as to only handle the file inputs
//else condition handles the submit button input
if (!fi.isFormField()) {
File file = new File(fileName);
File fNew = new File(filePath, file.getName());
fi.write(fNew);
} else {
System.out.println("Field =" + fi.getFieldName());
}
}
}
}
}
[/PHP] |
|