Extjs4文件上传

springMVC来做项目,如果遇到文件上传,那么一定要用spring自带的文件处理类来处理上传的文件,因为效率实在高过其他的。

从界面传过来的参数,如果设置了值对象,那么可以从值对象里面取出字符串类型的普通参数,如果不这样做,也可以直接从request里面获得,两种方法都可以。

问题是如果值对象里面写了其他类型的变量,妄想像Struts2那样处理,springMVC就会报出400 Bad Request的错误。

Struts2里面,我们可以定义一个值对象为

  1. public class ImageVo {
  2. private String roomnumber;
  3. private File image1 ;
  4. private File image2 ;
  5.   private File image3 ;
  6. }
复制代码

然后在后台从前台传过来的值对象里面取出image1……,那就是一个文件流了,非常好处理上传文件。但springMVC只能接受全部为string类型的字符串值,那么该怎么做呢?


前台Extjs4代码:

  1. /**
  2. * 图片添加
  3. * @type {Ext.form.Panel}
  4. */
  5. var addImageForm = new Ext.form.Panel({
  6. border: false, bodyPadding: 5, id: 'addImageForm',height:350,
  7. fieldDefaults: {labelWidth: 80, labelSeparator: ": ", anchor: '95%'},
  8. items: [
  9. {xtype:'fieldset',title:'图片上传', collapsible:true,
  10. items:[
  11. {
  12. xtype:'textfield',
  13. fieldLabel: '房间号码',
  14. name: 'roomnumber',
  15. id: 'roomnumber1',
  16. allowBlank: false,
  17. maskRe: /[\d]/,
  18. reegx: /[\d{4}]/,
  19. minLength: 4,
  20. maxLength: 4,
  21. emptyText: '请输入四位的房间号码(前两位代表楼层,后两位代表房间号)',
  22. regexText: '请输入正确的房间号码',
  23. //验证该房间号码是否存在 !
  24. listeners: {
  25. blur: function (e, t, eOpts) {
  26. var roomnumber = e.rawValue;
  27. if(roomnumber.length == 4){
  28. Ext.Ajax.request({
  29. method: 'post',
  30. params: {roomnumber: roomnumber},
  31. url: '/room/findroomhold',
  32. callback: function (options, success, response) {
  33. var jsonString = Ext.JSON.decode(response.responseText);
  34. if (jsonString.success) {
  35. } else {
  36. Ext.Msg.alert('警告', jsonString.msg);
  37. }
  38. }
  39. });
  40. }
  41. }
  42. }
  43. },{
  44. xtype:'filefield',
  45. fieldLabel:'上传图片1',
  46. name:'image1',
  47. id:'image1',
  48. buttonText:'',
  49. buttonConfig:{iconCls:'upload'},
  50. listeners:{
  51. change:function(btn, value, eOpts){
  52. var img_reg = /\.([jJ][pP][gG])小贝$|\.([jJ][pP][eE][gG])小贝$|\.([gG][iI][fF])小贝$|\.([pP][nN][gG])小贝$|\.([bB][mM][pP])小贝$/;
  53. if ( img_reg.test(value) ) {
  54. var img = Ext.getCmp('img1');
  55. var file = btn.fileInputEl.dom.files[0];
  56. var url = URL.createObjectURL(file);
  57. img.setSrc(url);
  58. } else {
  59. Ext.Msg.alert('提示', '请选择图片类型的文件!');
  60. return ;
  61. }
  62. }
  63. }
  64. },{
  65. xtype:'filefield',
  66. fieldLabel:'上传图片2',
  67. name:'image2',
  68. id:'image2',
  69. buttonText:'',
  70. buttonConfig:{iconCls:'upload'},
  71. listeners:{
  72. change:function(btn, value){
  73. var img_reg = /\.([jJ][pP][gG])小贝$|\.([jJ][pP][eE][gG])小贝$|\.([gG][iI][fF])小贝$|\.([pP][nN][gG])小贝$|\.([bB][mM][pP])小贝$/;
  74. if ( img_reg.test(value) ) {
  75. var img = Ext.getCmp('img2');
  76. var file = btn.fileInputEl.dom.files[0];
  77. var url = URL.createObjectURL(file);
  78. img.setSrc(url);
  79. } else {
  80. Ext.Msg.alert('提示', '请选择图片类型的文件!');
  81. return ;
  82. }
  83. }
  84. }
  85. },{
  86. xtype:'filefield',
  87. fieldLabel:'上传图片3',
  88. name:'image3',
  89. id:'image3',
  90. buttonText:'',
  91. buttonConfig:{iconCls:'upload'},
  92. listeners:{
  93. change:function(btn, value){
  94. var img_reg = /\.([jJ][pP][gG])小贝$|\.([jJ][pP][eE][gG])小贝$|\.([gG][iI][fF])小贝$|\.([pP][nN][gG])小贝$|\.([bB][mM][pP])小贝$/;
  95. if ( img_reg.test(value) ) {
  96. var img = Ext.getCmp('img3');
  97. var file = btn.fileInputEl.dom.files[0];
  98. var url = URL.createObjectURL(file);
  99. img.setSrc(url);
  100. } else {
  101. Ext.Msg.alert('提示', '请选择图片类型的文件!');
  102. return ;
  103. }
  104. }
  105. }
  106. }
  107. ]
  108. },{xtype:'fieldset',title:'图片预览',layout:'column',defaults:{width:130},
  109. items:[
  110. {xtype:'image',id:'img1'},
  111. {xtype:'image',id:'img2'},
  112. {xtype:'image',id:'img3'}
  113. ]
  114. }
  115. ],
  116. dockedItems: [
  117. {
  118. xtype: 'toolbar', dock: 'bottom', ui: 'footer', layout: {pack: 'center'},
  119. items: [
  120. {text: '确认上传', disabled: true, formBind: true, handler: function () {
  121. var form = this.up('form').getForm();
  122. if (form.isValid()) {
  123. form.submit({
  124. url: '/image/add',
  125. method: 'post',
  126. submitEmptyText: false,
  127. waitMsg: '请稍等,系统正在帮您添加',
  128. success: function (form, action) {
  129. //Ext.Msg.alert('成功', "上传成功!");
  130. Ext.Msg.alert('成功', action.result.msg);
  131. },
  132. failure: function (form, action) {
  133. Ext.Msg.alert('失败', action.result.msg);
  134. //Ext.Msg.alert('失败', "上传失败");
  135. }
  136. })
  137. }
  138. }},
  139. {text: '重置', handler: function () {
  140. this.up('form').getForm().reset();
  141. }}
  142. ]
  143. }
  144. ]
  145. });
复制代码

如图:


后台的java代码,因为只有一个非文件类的值,所以直接放到了参数里面了。

  1. import com.lhx.hotel.model.Image;
  2. import com.lhx.hotel.service.ImageService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import org.springframework.web.multipart.MultipartHttpServletRequest;
  9. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  10. import javax.servlet.http.HttpServletRequest;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.util.*;
  14. /**
  15. * Created by xin on 14-5-18.
  16. */
  17. @Controller
  18. @RequestMapping("/image")
  19. public class ImageController {
  20. Map<String,Object> outmap = new HashMap<String, Object>();
  21. @Autowired
  22. private ImageService imageService ;
  23. @RequestMapping("/add")
  24. @ResponseBody
  25. public Map<String,Object> add(String roomnumber, HttpServletRequest request) throws IOException {
  26. List<String> fileTypes = new ArrayList<String>();
  27. fileTypes.add(".jpg");
  28. fileTypes.add(".jpeg");
  29. fileTypes.add(".bmp");
  30. fileTypes.add(".gif");
  31. fileTypes.add(".png");
  32. //是否成功上传了文件
  33. boolean ishasuploadimage = false ;
  34. //成功上传了n个图像
  35. int imageNum = 0 ;
  36. /**
  37. * 想通过ImageVo imageVo,但需要全部是string类型
  38. * 并且没有其他什么参数,大材小用,舍弃
  39. * String roomnumber = imageVo.getRoomnumber();
  40. */
  41. String imagepath = request.getRealPath("/upload");
  42. CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
  43. if (multipartResolver.isMultipart(request)){
  44. MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request ;
  45. //String roomnumber = multiRequest.getParameter("roomnumber");
  46. if (!"".equals(roomnumber) && roomnumber != null){
  47. int ronumber = Integer.valueOf(roomnumber) ;
  48. Iterator<String> iter = multiRequest.getFileNames();
  49. Image image = null ;
  50. while (iter.hasNext()){
  51. MultipartFile file = multiRequest.getFile((String)iter.next());
  52. //byte[] bytes = file.getBytes();
  53. //long size = file.getSize();
  54. //有上传文件的话,容量是大于0的。
  55. if (file.getSize() > 0){
  56. ishasuploadimage = true ;
  57. String imagename = file.getOriginalFilename();
  58. String ext = imagename.substring(imagename.lastIndexOf(".")) ;
  59. if (fileTypes.contains(ext)){
  60. //文件名为:房间号码 + image + 系统时间 + 后缀
  61. String fileName = roomnumber + "image" + System.currentTimeMillis() + ext ;
  62. image = new Image();
  63. image.setPhpath(fileName);
  64. image.setPhroomnumber(ronumber);
  65. File localFile = new File(imagepath,fileName);
  66. try {
  67. file.transferTo(localFile);
  68. imageService.insertSelective(image);
  69. imageNum ++ ;
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. outmap.put("success",false);
  73. outmap.put("msg","系统出错");
  74. return outmap ;
  75. }
  76. } else {
  77. outmap.put("success",false);
  78. outmap.put("msg","成功上传" + imageNum + "张图片,遇到不能上传的非图片类的文件而出错!");
  79. return outmap ;
  80. }
  81. }
  82. }
  83. } else {
  84. //这种情况很少见,除非直接在浏览器里面输入地址
  85. outmap.put("success",false);
  86. outmap.put("msg","没有对应的房间号");
  87. return outmap ;
  88. }
  89. }
  90. if (!ishasuploadimage){
  91. outmap.put("success",false);
  92. outmap.put("msg","没有上传文件");
  93. return outmap ;
  94. }
  95. outmap.put("success",true);
  96. outmap.put("msg","成功上传" + imageNum + "张图片!");
  97. return outmap ;
  98. }
  99. }
复制代码

这些代码是先写的,没什么注释,如果不是很看得懂,下面这个例子就详细点了


Extjs4前台代码:

  1. /**
  2. * Created by xin on 14-5-19.
  3. */
  4. var addStaffForm = new Ext.form.Panel({
  5. border: false, bodyPadding: 5, id: 'addStaffForm', height: 560,
  6. fieldDefaults: {labelWidth: 80, labelSeparator: ": ", anchor: '0', margin:'2 2 2 2'},
  7. items:[
  8. {
  9. xtype:'fieldset',
  10. defaultType: 'textfield',
  11. items: [
  12. {
  13. xtype: 'container',
  14. anchor: '-5',
  15. layout: 'column',
  16. items: [
  17. {xtype: 'textfield', width: 180, fieldLabel: "姓名", id: 'staffname', name: 'staffname',
  18. allowBlank: false, blankText: '姓名必须输入', emptyText: '请输入真实姓名'},
  19. {xtype: 'combobox', width: 180, fieldLabel: "性别", id: 'staffgender', name: 'staffgender', store: sexStore,
  20. valueField: 'text', value: '男', allowBlank: false, blankText: '请选择', labelAlign:'right',editable:false,
  21. listConfig: {
  22. getInnerTpl: function () {
  23. return "<img src='public/images/{id}.gif'/>{text}"
  24. }
  25. }}
  26. ]
  27. },
  28. {
  29. xtype: 'container',
  30. anchor: '-5',
  31. layout: 'column',
  32. items: [
  33. {xtype: 'textfield', fieldLabel: "职责", width: 180, id: 'staffprofession', name: 'staffprofession', emptyText: '请输入职责名称',
  34. allowBlank: false, blankText: '职责名称必须输入'},
  35. {xtype: 'textfield', fieldLabel: "部门", width: 180, id: 'staffdepartment', name: 'staffdepartment', allowBlank: false,labelAlign:'right'}
  36. ]
  37. },
  38. {
  39. xtype:'numberfield',
  40. fieldLabel: "月薪",
  41. id: 'staffsalary',
  42. name: 'staffsalary',
  43. anchor: '95%',
  44. step:50,
  45. maxValue:999999,
  46. allowBlank: true,
  47. minValue:0,
  48. negativeText:'月薪不能为负数',
  49. emptyText: '请填入月薪'
  50. },
  51. {
  52. xtype: 'fieldcontainer', fieldLabel: '电话', defaultType: 'textfield', layout: 'hbox', anchor: '95%',
  53. combineErrors: true,
  54. items: [
  55. {name: 'staffzone', id: 'staffzone', width: 50, emptyText: '区号', maskRe: /[\d]/, reegx: /[\d{3,4}]/,
  56. minLength: 3, maxLength: 4, regexText: '请输入正确的区号'},
  57. {xtype: 'label', text: '--'},
  58. {name: 'stafftelnumber', id: 'stafftelnumber', flex: 1, emptyText: '请输入电话号码', maskRe: /[\d]/, reegx: /[\d{7,8}]/,
  59. minLength: 7, maxLength: 8, regexText: '请输入正确的电话号码'}
  60. ]
  61. },
  62. {
  63. fieldLabel: '手机号码',
  64. name: 'staffmobile',
  65. id: 'staffmobile',
  66. allowBlank: true,
  67. anchor: '95%',
  68. maskRe: /[\d]/,
  69. reegx: /[\d{11}]/,
  70. minLength: 11,
  71. maxLength: 11,
  72. emptyText: '请输入手机号码',
  73. regexText: '请输入正确的手机号码'
  74. },
  75. {
  76. fieldLabel: '电子邮箱',
  77. name: 'staffemail',
  78. id: 'staffemail',
  79. allowBlank: true,
  80. anchor: '95%',
  81. emptyText: '请输入电子邮箱地址',
  82. vtype: 'email'
  83. },
  84. {
  85. xtype: 'fieldcontainer', fieldLabel: '地区', defaultType: 'combobox', layout: 'hbox', anchor: '95%',
  86. items: [
  87. {name: 'staffprovince', id: 'staffprovince', width: 90, emptyText: '请选择省', valueField: 'regionId', displayField: 'regionName',
  88. store: provinceStore, queryMode: 'local', triggerAction: 'all', selectOnFocus: true, forceSelection: true,editable:false,
  89. listeners: {
  90. change: function (f, newValue, oldValue) {
  91. var cityStore = Ext.data.StoreManager.lookup('cityStore');
  92. var city = this.up('form').getForm().findField('staffcity');
  93. var county = this.up('form').getForm().findField('staffcounty');
  94. if (newValue && newValue != oldValue) {
  95. city.setValue();
  96. county.setValue();
  97. cityStore.load({params: {parentId: newValue}});
  98. }
  99. }
  100. }
  101. },
  102. {name: 'staffcity', id: 'staffcity', width: 90, store: cityStore, emptyText: '请选择市', valueField: 'regionId',
  103. displayField: 'regionName',queryMode: 'local', triggerAction: 'all', selectOnFocus: true, forceSelection: true,
  104. editable:false,
  105. listeners: {
  106. change: function (f, newValue, oldValue) {
  107. var countyStore = Ext.data.StoreManager.lookup('countyStore');
  108. var county = this.up('form').getForm().findField('staffcounty');
  109. if (newValue && newValue != oldValue) {
  110. county.setValue();
  111. countyStore.load({params: {parentId: newValue}});
  112. }
  113. }
  114. }
  115. },
  116. {name: 'staffcounty', id: 'staffcounty', width: 90, store: countyStore, emptyText: '请选择区(县)', valueField: 'regionId',
  117. displayField: 'regionName',queryMode: 'local', triggerAction: 'all', selectOnFocus: true, editable:false,
  118. forceSelection: true}
  119. ]
  120. },
  121. {
  122. fieldLabel: '地址',
  123. name: 'staffpartaddress',
  124. id: 'staffpartaddress',
  125. allowBlank: true,
  126. emptyText: '请输入详细地址',
  127. anchor: '95%'
  128. },
  129. {
  130. xtype:'filefield',
  131. fieldLabel:'上传头像',
  132. name:'avatar',
  133. id:'avatar',
  134. anchor: '95%',
  135. buttonText:'',
  136. buttonConfig:{iconCls:'upload'},
  137. listeners:{
  138. change:function(btn,value){
  139. //是否是规定的图片类型
  140. var img_reg = /\.([jJ][pP][gG])小贝$|\.([jJ][pP][eE][gG])小贝$|\.([gG][iI][fF])小贝$|\.([pP][nN][gG])小贝$|\.([bB][mM][pP])小贝$/;
  141. if (img_reg.test(value)) {
  142. var img = Ext.getCmp('staffavatar');
  143. var file = btn.fileInputEl.dom.files[0];
  144. var url = URL.createObjectURL(file);
  145. img.setSrc(url);
  146. } else {
  147. Ext.Msg.alert('提示', '请选择图片类型的文件!');
  148. return ;
  149. }
  150. }
  151. }
  152. }
  153. ]
  154. },
  155. {
  156. xtype: 'fieldset',
  157. title: '图片预览', defaults: {margin:'1 1 1 100', width: 200,height:260},
  158. items: [
  159. {xtype: 'image', id: 'staffavatar',border: 2,
  160. style: {
  161. borderColor: 'blue',
  162. borderStyle: 'solid'
  163. }}
  164. ]
  165. }
  166. ],
  167. dockedItems: [
  168. {
  169. xtype: 'toolbar', dock: 'bottom', ui: 'footer', layout: {pack: 'center'},
  170. items: [
  171. {text: '添加', disabled: true, formBind: true, handler: function () {
  172. var form = this.up('form').getForm();
  173. if (form.isValid()) {
  174. form.submit({
  175. url: '/staff/add',
  176. method: 'post',
  177. submitEmptyText: false,
  178. waitMsg: '请稍等,系统正在帮您添加',
  179. success: function (form, action) {
  180. Ext.Msg.alert('成功', action.result.msg);
  181. //清除填过的内容
  182. //form.findField('guestname').setValue();
  183. },
  184. failure: function (form, action) {
  185. Ext.Msg.alert('失败', action.result.msg);
  186. }
  187. })
  188. }
  189. }},
  190. {text: '重置', handler: function () {
  191. this.up('form').getForm().reset();
  192. }}
  193. ]
  194. }
  195. ]
  196. });
复制代码

显示效果:


写一个值对象:

  1. /**
  2. * Created by xin on 14-5-20.
  3. */
  4. public class StaffVo {
  5. private String staffname ;
  6. private String staffgender ;
  7. private String staffprofession ;
  8. private String staffdepartment ; // 部门
  9. //如果改为double类型,这个上传的值不能为空值,所有改为string类型
  10. private String staffsalary ; //月薪
  11. private String staffzone ; //区号
  12. private String stafftelnumber ; //号码
  13. private String staffmobile ; //手机号码
  14. private String staffemail ; //邮箱
  15. private String staffprovince ;
  16. private String staffcity ;
  17. private String staffcounty ;
  18. private String staffpartaddress ;
  19. /**
  20. * 这个file类型在这里是有问题的,不象struts可进行封装,如果有上传文件,
  21. * 就不能整个对象传过去了,所有要进行删除
  22. */
  23. //private File avatar ; //头像
  24. public String getStaffname() {
  25. return staffname;
  26. }
  27. public void setStaffname(String staffname) {
  28. this.staffname = staffname;
  29. }
  30. public String getStaffgender() {
  31. return staffgender;
  32. }
  33. public void setStaffgender(String staffgender) {
  34. this.staffgender = staffgender;
  35. }
  36. public String getStaffprofession() {
  37. return staffprofession;
  38. }
  39. public void setStaffprofession(String staffprofession) {
  40. this.staffprofession = staffprofession;
  41. }
  42. public String getStaffdepartment() {
  43. return staffdepartment;
  44. }
  45. public void setStaffdepartment(String staffdepartment) {
  46. this.staffdepartment = staffdepartment;
  47. }
  48. public String getStaffsalary() {
  49. return staffsalary;
  50. }
  51. public void setStaffsalary(String staffsalary) {
  52. this.staffsalary = staffsalary;
  53. }
  54. public String getStaffzone() {
  55. return staffzone;
  56. }
  57. public void setStaffzone(String staffzone) {
  58. this.staffzone = staffzone;
  59. }
  60. public String getStafftelnumber() {
  61. return stafftelnumber;
  62. }
  63. public void setStafftelnumber(String stafftelnumber) {
  64. this.stafftelnumber = stafftelnumber;
  65. }
  66. public String getStaffmobile() {
  67. return staffmobile;
  68. }
  69. public void setStaffmobile(String staffmobile) {
  70. this.staffmobile = staffmobile;
  71. }
  72. public String getStaffemail() {
  73. return staffemail;
  74. }
  75. public void setStaffemail(String staffemail) {
  76. this.staffemail = staffemail;
  77. }
  78. public String getStaffprovince() {
  79. return staffprovince;
  80. }
  81. public void setStaffprovince(String staffprovince) {
  82. this.staffprovince = staffprovince;
  83. }
  84. public String getStaffcity() {
  85. return staffcity;
  86. }
  87. public void setStaffcity(String staffcity) {
  88. this.staffcity = staffcity;
  89. }
  90. public String getStaffcounty() {
  91. return staffcounty;
  92. }
  93. public void setStaffcounty(String staffcounty) {
  94. this.staffcounty = staffcounty;
  95. }
  96. public String getStaffpartaddress() {
  97. return staffpartaddress;
  98. }
  99. public void setStaffpartaddress(String staffpartaddress) {
  100. this.staffpartaddress = staffpartaddress;
  101. }
  102. }
复制代码


数据库的持久层对象就不写了,大同小异。处理的java类

  1. import com.lhx.hotel.model.Staff;
  2. import com.lhx.hotel.service.StaffService;
  3. import com.lhx.hotel.vo.StaffVo;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Controller;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import org.springframework.web.multipart.MultipartFile;
  9. import org.springframework.web.multipart.MultipartHttpServletRequest;
  10. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  11. import javax.servlet.ServletContext;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import javax.servlet.http.HttpSession;
  15. import java.io.File;
  16. import java.io.IOException;
  17. import java.util.*;
  18. /**
  19. * Created by xin on 14-5-20.
  20. */
  21. @Controller
  22. @RequestMapping("/staff")
  23. public class StaffController {
  24. //返回的map,会自动封装成json
  25. Map<String,Object> outmap = new HashMap<String, Object>();
  26. @Autowired
  27. private StaffService staffService ;
  28. @RequestMapping("/add")
  29. @ResponseBody
  30. public Map<String,Object> add(StaffVo staffVo, HttpServletRequest request, HttpServletResponse response){
  31. //持久层对象
  32. Staff staff = new Staff();
  33. /**
  34. * 基本信息的提取
  35. * 因为都是string类型,所有不可能为空,
  36. * 持久层对象属性同是string类型的,不用进行判断,
  37. * 非string类型的要进行判断,防止异常
  38. * extjs界面如果有格式限制的话,就不用trim处理,因为不允许输入空格
  39. * 没有限制的话还是要进行trim处理的
  40. * 对null进行trim处理会出现空指针异常,但幸亏传过来的值是空值""
  41. */
  42. String staffname = staffVo.getStaffname().trim();
  43. String staffgender = staffVo.getStaffgender();
  44. String staffprofession = staffVo.getStaffprofession().trim();
  45. String staffdepartment = staffVo.getStaffdepartment().trim();
  46. String staffzone = staffVo.getStaffzone();
  47. String stafftelnumber = staffVo.getStafftelnumber();
  48. String telphone = staffzone + stafftelnumber ;
  49. String staffmobile = staffVo.getStaffmobile();
  50. String staffemail = staffVo.getStaffemail();
  51. //地址,进行拼接
  52. String staffprovince = staffVo.getStaffprovince();
  53. String staffcity = staffVo.getStaffcity();
  54. String staffcounty = staffVo.getStaffcounty();
  55. String staffpartaddress = staffVo.getStaffpartaddress().trim();
  56. String address = staffprovince + staffcity + staffcounty + staffpartaddress ;
  57. //非string类型,要进行判断
  58. String staffsalary = staffVo.getStaffsalary();
  59. if (!"".equals(staffsalary)){
  60. double salary = Double.valueOf(staffsalary);
  61. staff.setStsalary(salary);
  62. }
  63. //后加的工号 年份月份加序号(位数不够前面加0)
  64. Calendar c = Calendar.getInstance();
  65. int year = c.get(Calendar.YEAR);
  66. int month = c.get(Calendar.MONTH);
  67. int staffnum = staffService.getrecordSize() ;
  68. String staffnumstr=String.valueOf(staffnum);
  69. String [] ss = {"00000","0000","000","00","0",""};
  70. staffnumstr = ss[staffnumstr.length()-1] + staffnumstr;
  71. String stjobnumber = year + "" + month + staffnumstr;
  72. /**
  73. * 填充到持久层对象中
  74. */
  75. staff.setStname(staffname);
  76. staff.setStgender(staffgender);
  77. staff.setStprofession(staffprofession);
  78. staff.setStdepartment(staffdepartment);
  79. staff.setSttelphone(telphone);
  80. staff.setStmobile(staffmobile);
  81. staff.setStemail(staffemail);
  82. staff.setStaddress(address);
  83. staff.setStjobnumber(stjobnumber);
  84. /**
  85. * 对上传文件进行处理
  86. */
  87. //获取servlet上下文
  88. ServletContext servletContext = request.getSession().getServletContext();
  89. //spring的文件处理解析类,包装了servlet的上下文。
  90. CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(servletContext);
  91. //是否有上传文件
  92. boolean hasUploadAvatar = false ;
  93. //如果是multipart的提交,这个判断有点多余,不过还是加上吧!
  94. if (multipartResolver.isMultipart(request)) {
  95. //把request请求进行升级,request有的,它都有,
  96. MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
  97. /**
  98. * String staffname = multiRequest.getParameter("staffname");
  99. * 这样也可以获得上面从staffVo里面取出的值
  100. */
  101. //获得上传文件的名称
  102. Iterator<String> iter = multiRequest.getFileNames();
  103. //如果有的话就依次取出来
  104. while (iter.hasNext()){
  105. //包装过的文件流
  106. MultipartFile file = multiRequest.getFile((String)iter.next());
  107. //这里要进行判断,即使是空值,没有上传内容,file都是有值(空值)的,而文件流大小要大于0才是有上传的东西
  108. if (file.getSize() > 0){
  109. //获得上传文件原始名
  110. String imagename = file.getOriginalFilename();
  111. //算出后缀名
  112. String ext = imagename.substring(imagename.lastIndexOf(".")) ;
  113. //对文件类型进行判断,这个操作也可以在前台进行处理,在前台进行处理比较好,前后台都进行处理最稳妥
  114. List<String> fileTypes = new ArrayList<String>();
  115. fileTypes.add(".jpg");
  116. fileTypes.add(".jpeg");
  117. fileTypes.add(".bmp");
  118. fileTypes.add(".gif");
  119. fileTypes.add(".png");
  120. //是图片再进行处理
  121. if (fileTypes.contains(ext.toLowerCase())){
  122. //文件名为:唯一的工号 + avatar + 系统时间 + 后缀
  123. String fileName = stjobnumber + "avatar" + System.currentTimeMillis() + ext ;
  124. //文件夹;String imagepath = request.getRealPath("/upload");过时的方法,用request.getSession().getServletContext()代替
  125. String avatarFolder = servletContext.getRealPath("/upload");
  126. File localFile = new File(avatarFolder,fileName);
  127. try {
  128. //直接写入到后台服务器,简单且快
  129. file.transferTo(localFile);
  130. staff.setStavatar(fileName);
  131. //保存资料到数据库中
  132. staffService.insertSelective(staff);
  133. outmap.put("success",true);
  134. outmap.put("msg","添加成功!");
  135. return outmap ;
  136. } catch (IOException e) {
  137. e.printStackTrace();
  138. outmap.put("success",false);
  139. outmap.put("msg","系统出错");
  140. return outmap ;
  141. }
  142. } else {
  143. outmap.put("success",false);
  144. outmap.put("msg","图片格式出错!");
  145. return outmap ;
  146. }
  147. }
  148. }
  149. }
  150. if (!hasUploadAvatar){
  151. staffService.insertSelective(staff);
  152. outmap.put("success",true);
  153. outmap.put("msg","添加成功!");
  154. return outmap ;
  155. }
  156. return null ;
  157. }
  158. }
复制代码

上传其他文件,把代码改一下就可以了……写这文章给自己做一个总结,也给其他人一个学习参考的选择。


自我总结的小技巧:文件上传,新建一个文件夹,比如upload。里面有个文件的话,部署后tomcat那边就有upload这个文件夹了,如果只是空的文件夹,部署可能不会自动生成,到时上传文件就找不到路径了。

上传文件要放入一个文件夹upload中,先前设置springMVC的默认访问路径都加上前缀和后缀,所以如果不记得加入以下这行代码的话,就会造成访问不了新上传的图片!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值