文件上传-添加商品
1)技术分析
文件上传(fileUpload)
浏览器要求:
- post请求
- input type=“file”
- 表单的enctype=“multpart/form-data”
服务器要求
- 通过request.getParameterXXX()获取的参数全部为空
- 使用步骤:
- 导入jar包
- 创建一个磁盘文件项工厂
- 创建一个核心文件上传对象 ServletUpload
- 上传对象调用方法解析请求,获取一个List< FileItem >
添加商品(上传图片)
-
修改页面上添加链接:/store/adminProduct/addUI,请求转发到添加界面
-
在表单页面上
- 修改action:/store/adminProduct/add
- 上面的文件上传要求
- 给每个字段添加name属性
-
AdminProductServlet中处理add
- 通过request.getParameterMap方法获取的信息全部为空
- 我们想使用beanutils.ppopulate(bean,map)
- 我们需要创建一个map集合,将前台接收过来的信息手动的put到map中
- 注意:商品的图片(1.保存在服务器的磁盘;2.在数据中添加图片的位置)
-
调用serivice,重定向到查询界面
2)代码实现
① 修改页面跳转与修改add.jsp表单属性
<script type="text/javascript">
function addProduct(){
window.location.href = "${pageContext.request.contextPath}/adminProduct/addUI";
}
</script>
处理/addUI,数据回显转发到add.jsp
private void addUI(HttpServletRequest request, HttpServletResponse response) throws Exception {
//查询所有的分类,返回list--数据回显
List<Category> clist=categoryService.findAll();
//绑定数据
request.setAttribute("clist", clist);
request.getRequestDispatcher("/admin/product/add.jsp").forward(request, response);
}
add.jsp
<form id="userAction_save_do" name="Form1" action="${pageContext.request.contextPath}/adminProduct/add" method="post" enctype="multipart/form-data">
...
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
商品图片:
</td>
<td class="ta_01" bgColor="#ffffff" colspan="3">
<input type="file" name="pimage" />
</td>
</tr>
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
所属分类:
</td>
<td class="ta_01" bgColor="#ffffff" colspan="3">
<select name="cid">
<c:forEach items="${clist }" var="c">
<option value="${c.cid }">${c.cname }</option>
</c:forEach>
</select>
</td>
</tr>
...
</form>
② 在AdminProductServlet中处理add,文件上传
private void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//创建一个map集合放入请求参数
HashMap<String, Object> map = new HashMap<>();
//文件上传
//创建磁盘文件项
DiskFileItemFactory factory=new DiskFileItemFactory();
//创建核心上传对象
ServletFileUpload upload=new ServletFileUpload(factory);
//解析request
List<FileItem> list=upload.parseRequest(request);
//遍历集合
for(FileItem fi:list) {
//判断是否是普通的上传组件
if(fi.isFormField()) {
//普通上传组件
map.put(fi.getFieldName(),fi.getString("utf-8"));
}else {
//文件上传组件
//获取文件名称
String name=fi.getName();
//获取文件的真实姓名 xxxx.xx
String realName=UploadUtils.getRealName(name);
//获取文件的随机名称
String uuidName=UploadUtils.getRealName(realName);
//获取文件的存放路径
String path=this.getServletContext().getRealPath("/products/1");
//获取文件流
InputStream is=fi.getInputStream();
//保存图片
FileOutputStream fos = new FileOutputStream(new File(path, uuidName));
//保存图片
IOUtils.copy(is, fos);
fos.close();
is.close();
//删除临时文件
fi.delete();
//在map中设置文件路径
map.put(fi.getFieldName(),"products/1/"+uuidName);
}
}
//1、封装参数
Product p=new Product();
BeanUtils.populate(p, map);
//1.1 商品id
p.setPid(UUIDUtils.getId());
//1.2 商品时间
p.setPdate(new Date());
//1.3 封装category
Category c=new Category();
c.setCid((String)map.get("cid"));
p.setCategory(c);
//2、调用service完成添加
productService.add(p);
//3、页面重定向
response.sendRedirect(request.getContextPath()+"/adminProduct/findAll");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
request.setAttribute("msg", "商品添加失败");
request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
return;
}
}
③ dao层
@Override
public void add(Product p) throws Exception {
String sql="insert into product values(?,?,?,?,?,?,?,?,?,?)";
qr.update(sql,p.getPid(),p.getPname(),p.getMarketPrice(),
p.getShopPrice(),p.getPimage(),p.getPdate(),
p.getIsHot(),p.getPdesc(),p.getPflag(),p.getCategory().getCid());
}