裝飾器上傳表單

/這是httpServletRequest的裝飾器所以要繼承這個對象
public class MultipartServletRequest extends HttpServletRequestWrapper{
//定義一個map方便處理
Map<String,String[ ]>params=new HashMap<String, String[]>();
//定義一個常量地址
private final static String PATH="XXXX";
//必須繼承這個構造函數(創建這個對象必須運行構造函數)
public MultipartServletRequest(HttpServletRequest request) {
super(request);
setParams(request);
}


private void setParams(HttpServletRequest request)  {
//判斷表格是否爲multipart/form/data
boolean Ismultipart=ServletFileUpload.isMultipartContent(request);
//輸入流來存數據的
InputStream is=null;
try {
if(Ismultipart){
ServletFileUpload upload=new ServletFileUpload();
//獲得迭代器
FileItemIterator fi=upload.getItemIterator(request);
while(fi.hasNext()){
//遍歷迭代器存在文件流
FileItemStream fis=fi.next();
//打開文件流進行輸入流
is=fis.openStream();
//判斷是否爲表單域的東西
if(fis.isFormField()){
//傳個表單域中的名字和輸入流
setFrom(fis.getFieldName(),is);
}else{
//這個版本只能上傳一個文件
//要輸入流中有數據才進行上傳操作否則返回爲null;
if(is.available()>0){
//對於IE而言,上傳的文件獲取完整的絕對路徑,此時就需要僅僅獲取絕對路徑中的文件名(得到的是上傳文件的名字)
String fname=FilenameUtils.getName(fis.getName());
//完成文件上傳,並且自動關閉流
Streams.copy(is, new FileOutputStream(PATH+"upload/"+fname),true);
//fis.getFieldName表示獲取表單域的名稱,fName表示獲取文件的名稱
params.put(fis.getFieldName(), new String[]{fname});
}
}
}
}else{
//如果能裝飾這個類肯定表單是multipart/form-data的類型
//這裏的else沒必要要(如果要了證明是普通的文本表直接用常規父類方法就行了)
params=super.getParameterMap();
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(is!=null)is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//這個問題是爲了讓一個屬性可以有多個值(interests可以有多個值)(必須選擇一個值不然會空指針異常)
private void setFrom(String fieldName, InputStream is) throws IOException {
if(params.containsKey(fieldName)){
String[]values=params.get(fieldName);
//讓數組長度加一個
values=Arrays.copyOf(values, values.length+1);
//把字節流以字符流存在數組中
values[values.length-1]=Streams.asString(is);
params.put(fieldName, values);
}else{
//創建一個屬性並且放值
params.put(fieldName, new String[]{Streams.asString(is)});
}
}


@Override
public Map<String, String[]> getParameterMap() {
//返回這個Map;
return params;
}
@Override
public String getParameter(String name) {
//返回一個值或者爲null
String[] values=params.get(name);
if(values!=null){
return values[0];
}
return null;
}
@Override
public String[] getParameterValues(String name) {
String []values=params.get(name);
//返回數組或者爲null;
if(values!=null){
return values;
}
return null;
}
}
發佈了16 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章