在修改商品页面,添加上传商品图片功能。
在 页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。
在springmvc.xml中配置multipart类型解析器。(如果表单的类型是multipart,一定要配置这个解析器,否则参数绑定失败,传参失败)
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
正式项目中会有一个单独的图片服务器,专门用来存储图片
上边的解析内部使用下边的jar进行图片上传。
所需jar已传入我的资源页 名字为springmc文件上传
通过图形界面配置: 路径要配置自己的路径我的路径是D:\java\tomcat\upload\temp\ 图片是来自视频截图
也可以直接修改tomcat的配置:
在conf/server.xml文件,添加虚拟 目录 :
<ContextdocBase="D:\java\tomcat\upload\temp" path="/pic" reloadable="false"/>
注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。
页面 form添加enctype="multipart/form-data":
file的name与controller形参一致:
<form id="itemForm"
action="${pageContext.request.contextPath}/items/editItemsSubmit.action" method="post"enctype="multipart/form-data">
<input type="hidden" name="id"value="${items.id }" /> 修改商品信息:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td><input type="text"name="name" value="${items.name }"/></td>
</tr>
<tr>
<td>商品价格</td>
<td><input type="text"name="price" value="${items.price }"/></td>
</tr>
<tr>
<td>商品生产日期</td>
<td><input type="text"name="createtime"
value="<fmt:formatDate value="${items.createtime}"pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
</tr>
<tr>
<td>商品图片</td>
<td><c:if test="${items.pic !=null}">
<img src="/pic/${items.pic}" width=100 height=100/>
<br/>
</c:if>
<!-- 上传的控件-->
<input type="file" name="items_pic"/> </td></tr>
<tr>
<td>商品简介</td>
<td><textarea rows="3"cols="30" name="detail">${items.detail}</textarea></td>
</tr>
<tr>
<td colspan="2"align="center"><input type="submit"value="提交" /></td>
</tr>
</table>
</form>
修改:商品修改controller方法:
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(
Modelmodel,
HttpServletRequestrequest,
Integerid,
@ModelAttribute("items")@Validated(value= { ValidGrouop1.class}) ItemsCustom itemsCustom,
BindingResultbindingResult,
MultipartFileitems_pic// 用来接收商品图片
)throwsException {
// 获取验证错误信息
if(bindingResult.hasErrors()) {
// 输出错误信息
List<ObjectError>allerrors = bindingResult.getAllErrors();
for (ObjectError error :allerrors) {
System.out.println(error.getDefaultMessage());
}
// 错误信息传递到页面
model.addAttribute("allErrors",allerrors);
// 使用model 的方式使数据回显
model.addAttribute("items",itemsCustom);
return "items/editItems";
}
// 上传图片的原始名称
StringoriginalFilename = items_pic.getOriginalFilename();
// 上传图片
if (items_pic != null&&originalFilename!=null&&originalFilename.length()>0) {// 存储图片的物理路径
Stringpic_path = "D:\\java\\tomcat\\upload\\temp\\";
// 新的图片名称 UUID.randomUUID()随机数
StringnewFilename = UUID.randomUUID()
+originalFilename.substring(originalFilename
.lastIndexOf("."));
//新的图片
Filenewfile=newjava.io.File(pic_path+newFilename);
//将内存的数据写入磁盘
items_pic.transferTo(newfile);
//上传成功需要经新的图片名称写到itemsCustom
itemsCustom.setPic(newFilename);
}
// 调用service更新商品信息,页面需要将商品信息传到此方法
itemsService.updateItems(id,itemsCustom);
// 重定向不用加跟路径
// return "redirect:queryItems.action";
// 页面转发
return "forward:queryItems.action";
}
摘自传智播客视频