超越代理-超越代理【主管╇QV:555333】超越代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》用springMVC来做项目,如果遇到文件上传,那么一定要用spring自带的文件处理类来处理上传的文件,因为效率实在高过其他的。
从界面传过来的参数,如果设置了值对象,那么可以从值对象里面取出字符串类型的普通参数,如果不这样做,也可以直接从request里面获得,两种方法都可以。
超越代理-超越代理【主管╇QV:555333】超越代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》问题是如果值对象里面写了其他类型的变量,妄想像Struts2那样处理,springMVC就会报出400 Bad Request的错误。
在Struts2里面,我们可以定义一个值对象为
public class ImageVo{
private String roomnumber;
private File image1;
private File image2;
private File image3;
}
然后在后台从前台传过来的值对象里面取出image1……,那就是一个文件流了,非常好处理上传文件。但springMVC只能接受全部为string类型的字符串值,那么该怎么做呢?
前台Extjs4代码:
/**
*图片添加
* type{Ext.form.Panel}
*/
var addImageForm=new Ext.form.Panel({
border:false,bodyPadding:5,id:'addImageForm',height:350,
fieldDefaults:{labelWidth:80,labelSeparator:":",anchor:'95%'},
items:[
{xtype:'fieldset',title:'图片上传',collapsible:true,
items:[
{
xtype:'textfield',
fieldLabel:'房间号码',
name:'roomnumber',
id:'roomnumber1',
allowBlank:false,
maskRe:/[\d]/,
reegx:/[\d{4}]/,
minLength:4,
maxLength:4,
emptyText:'请输入四位的房间号码(前两位代表楼层,后两位代表房间号)',
regexText:'请输入正确的房间号码',
//验证该房间号码是否存在!
listeners:{
blur:function(e,t,eOpts){
var roomnumber=e.rawValue;
if(roomnumber.length==4){
Ext.Ajax.request({
method:'post',
params:{roomnumber:roomnumber},
url:'/room/findroomhold',
callback:function(options,success,response){
var jsonString=Ext.JSON.decode(response.responseText);
if(jsonString.success){
}else{
Ext.Msg.alert('警告',jsonString.msg);
}
}
});
}
}
}
},{
xtype:'filefield',
fieldLabel:'上传图片1',
name:'image1',
id:'image1',
buttonText:'',
buttonConfig:{iconCls:'upload'},
listeners:{
change:function(btn,value,eOpts){
var img_reg=/\.([jJ][pP][gG]){1}$|\.([jJ][pP][eE][gG]){1}$|\.([gG][iI][fF]){1}$|\.([pP][nN][gG]){1}$|\.([bB][mM][pP]){1}$/;
if(img_reg.test(value)){
var img=Ext.getCmp('img1');
var file=btn.fileInputEl.dom.files[0];
var url=URL.createObjectURL(file);
img.setSrc(url);
}else{
Ext.Msg.alert('提示','请选择图片类型的文件!');
return;
}
}
}
},{
xtype:'filefield',
fieldLabel:'上传图片2',
name:'image2',
id:'image2',
buttonText:'',
buttonConfig:{iconCls:'upload'},
listeners:{
change:function(btn,value){
var img_reg=/\.([jJ][pP][gG]){1}$|\.([jJ][pP][eE][gG]){1}$|\.([gG][iI][fF]){1}$|\.([pP][nN][gG]){1}$|\.([bB][mM][pP]){1}$/;
if(img_reg.test(value)){
var img=Ext.getCmp('img2');
var file=btn.fileInputEl.dom.files[0];
var url=URL.createObjectURL(file);
img.setSrc(url);
}else{
Ext.Msg.alert('提示','请选择图片类型的文件!');
return;
}
}
}
},{
xtype:'filefield',
fieldLabel:'上传图片3',
name:'image3',
id:'image3',
buttonText:'',
buttonConfig:{iconCls:'upload'},
listeners:{
change:function(btn,value){
var img_reg=/\.([jJ][pP][gG]){1}$|\.([jJ][pP][eE][gG]){1}$|\.([gG][iI][fF]){1}$|\.([pP][nN][gG]){1}$|\.([bB][mM][pP]){1}$/;
if(img_reg.test(value)){
var img=Ext.getCmp('img3');
var file=btn.fileInputEl.dom.files[0];
var url=URL.createObjectURL(file);
img.setSrc(url);
}else{
Ext.Msg.alert('提示','请选择图片类型的文件!');
return;
}
}
}
}
]
},{xtype:'fieldset',title:'图片预览',layout:'column',defaults:{width:130},
items:[
{xtype:'image',id:'img1'},
{xtype:'image',id:'img2'},
{xtype:'image',id:'img3'}
]
}
],
dockedItems:[
{
xtype:'toolbar',dock:'bottom',ui:'footer',layout:{pack:'center'},
items:[
{text:'确认上传',disabled:true,formBind:true,handler:function(){
var form=this.up('form').getForm();
if(form.isValid()){
form.submit({
url:'/image/add',
method:'post',
submitEmptyText:false,
waitMsg:'请稍等,系统正在帮您添加',
success:function(form,action){
//Ext.Msg.alert('成功',"上传成功!");
Ext.Msg.alert('成功',action.result.msg);
},
failure:function(form,action){
Ext.Msg.alert('失败',action.result.msg);
//Ext.Msg.alert('失败',"上传失败");
}
})
}
}},
{text:'重置',handler:function(){
this.up('form').getForm().reset();
}}
]
}
]
});
后台的java代码,因为只有一个非文件类的值,所以直接放到了参数里面了。
import com.lhx.hotel.model.Image;
import com.lhx.hotel.service.ImageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.*;
/**
*Created by xin on 14-5-18.
*/
Controller
RequestMapping("/image")
public class ImageController{
Map<String,Object>outmap=new HashMap<String,Object>();
Autowired
private ImageService imageService;
RequestMapping("/add")
ResponseBody
public Map<String,Object>add(String roomnumber,HttpServletRequest request)throws IOException{
List<String>fileTypes=new ArrayList<String>();
fileTypes.add(".jpg");
fileTypes.add(".jpeg");
fileTypes.add(".bmp");
fileTypes.add(".gif");
fileTypes.add(".png");
//是否成功上传了文件
boolean ishasuploadimage=false;
//成功上传了n个图像
int imageNum=0;
/**
*想通过ImageVo imageVo,但需要全部是string类型
*并且没有其他什么参数,大材小用,舍弃
*String roomnumber=imageVo.getRoomnumber();
*/
String imagepath=request.getRealPath("/upload");
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());
if(multipartResolver.isMultipart(request)){
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//String roomnumber=multiRequest.getParameter("roomnumber");
if(!"".equals(roomnumber)&&roomnumber!=null){
int ronumber=Integer.valueOf(roomnumber);
Iterator<String>iter=multiRequest.getFileNames();
Image image=null;
while(iter.hasNext()){
MultipartFile file=multiRequest.getFile((String)iter.next());
//byte[]bytes=file.getBytes();
//long size=file.getSize();
//有上传文件的话,容量是大于0的。
if(file.getSize()>0){
ishasuploadimage=true;
String imagename=file.getOriginalFilename();
String ext=imagename.substring(imagename.lastIndexOf("."));
if(fileTypes.contains(ext)){
//文件名为:房间号码+image+系统时间+后缀
String fileName=roomnumber+"image"+System.currentTimeMillis()+ext;
image=new Image();
image.setPhpath(fileName);
image.setPhroomnumber(ronumber);
File localFile=new File(imagepath,fileName);
try{
file.transferTo(localFile);
imageService.insertSelective(image);
imageNum++;
}catch(IOException e){
e.printStackTrace();
outmap.put("success",false);
outmap.put("msg","系统出错");
return outmap;
}
}else{
outmap.put("success",false);
outmap.put("msg","成功上传"+imageNum+"张图片,遇到不能上传的非图片类的文件而出错!");超越代理-超越代理【主管╇QV:555333】超越代理【╇QV:555333】《优_质_平_台《《_《《置_顶_待_遇《《一步到位》》
return outmap;
}
}